use std::ops::{Add, AddAssign}; use allocative::Allocative; use byteview::ByteView; use derive_deref::{Deref, DerefMut}; use serde::Serialize; use vecdb::{CheckedSub, PrintableIndex, StoredCompressed}; use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout}; use crate::copy_first_4bytes; use super::StoredU32; #[derive( Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Deref, DerefMut, Default, FromBytes, Immutable, IntoBytes, KnownLayout, Serialize, StoredCompressed, Allocative, )] pub struct TxIndex(u32); impl TxIndex { pub const ZERO: Self = Self(0); pub fn new(txindex: u32) -> Self { Self(txindex) } pub fn incremented(self) -> Self { Self(*self + 1) } } impl Add for TxIndex { type Output = Self; fn add(self, rhs: TxIndex) -> Self::Output { Self(self.0 + rhs.0) } } impl Add for TxIndex { type Output = Self; fn add(self, rhs: usize) -> Self::Output { Self(self.0 + rhs as u32) } } impl AddAssign for TxIndex { fn add_assign(&mut self, rhs: TxIndex) { self.0 += rhs.0 } } impl CheckedSub for TxIndex { fn checked_sub(self, rhs: TxIndex) -> Option { self.0.checked_sub(rhs.0).map(TxIndex::from) } } impl From for TxIndex { fn from(value: u32) -> Self { Self(value) } } impl From for TxIndex { fn from(value: u64) -> Self { Self(value as u32) } } impl From for u64 { fn from(value: TxIndex) -> Self { value.0 as u64 } } impl From for TxIndex { fn from(value: usize) -> Self { Self(value as u32) } } impl From for usize { fn from(value: TxIndex) -> Self { value.0 as usize } } impl From for TxIndex { fn from(value: ByteView) -> Self { Self(u32::from_be_bytes(copy_first_4bytes(&value).unwrap())) } } impl From for ByteView { fn from(value: TxIndex) -> Self { Self::new(&value.to_be_bytes()) } } impl From for StoredU32 { fn from(value: TxIndex) -> Self { Self::from(value.0) } } impl PrintableIndex for TxIndex { fn to_string() -> &'static str { "txindex" } fn to_possible_strings() -> &'static [&'static str] { &["tx", "txindex"] } } impl std::fmt::Display for TxIndex { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let mut buf = itoa::Buffer::new(); let str = buf.format(self.0); f.write_str(str) } }