use std::fmt::{LowerHex, UpperHex}; use std::ops::{Add, AddAssign, Sub, SubAssign}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[repr(transparent)] pub struct Address(pub usize); impl Address { pub fn add(&self, value: usize) -> Self { Self(self.0 + value) } pub fn sub(&self, value: usize) -> Self { Self(self.0 - value) } pub fn as_ptr(&self) -> *const T { self.0 as *const T } pub fn as_mut_ptr(&self) -> *mut T { self.0 as *mut T } } impl From for Address { fn from(value: usize) -> Self { Self(value) } } impl From
for usize { fn from(value: Address) -> Self { value.0 } } impl Add for Address { type Output = Self; fn add(self, rhs: usize) -> Self::Output { Self(self.0 + rhs) } } impl Add
for Address { type Output = Self; fn add(self, rhs: Address) -> Self::Output { Self(self.0 + rhs.0) } } impl AddAssign for Address { fn add_assign(&mut self, rhs: usize) { self.0 += rhs; } } impl AddAssign
for Address { fn add_assign(&mut self, rhs: Address) { self.0 += rhs.0; } } impl Sub for Address { type Output = Self; fn sub(self, rhs: usize) -> Self::Output { Self(self.0 - rhs) } } impl Sub
for Address { type Output = Self; fn sub(self, rhs: Address) -> Self::Output { Self(self.0 - rhs.0) } } impl SubAssign for Address { fn sub_assign(&mut self, rhs: usize) { self.0 -= rhs; } } impl SubAssign
for Address { fn sub_assign(&mut self, rhs: Address) { self.0 -= rhs.0; } } impl UpperHex for Address { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:#X}", self.0) } } impl LowerHex for Address { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:#x}", self.0) } }