1 /// A trait for adding some helper routines to pointers. 2 pub(crate) trait Pointer { 3 /// Returns the distance, in units of `T`, between `self` and `origin`. 4 /// 5 /// # Safety 6 /// 7 /// Same as `ptr::offset_from` in addition to `self >= origin`. distance(self, origin: Self) -> usize8 unsafe fn distance(self, origin: Self) -> usize; 9 10 /// Casts this pointer to `usize`. 11 /// 12 /// Callers should not convert the `usize` back to a pointer if at all 13 /// possible. (And if you believe it's necessary, open an issue to discuss 14 /// why. Otherwise, it has the potential to violate pointer provenance.) 15 /// The purpose of this function is just to be able to do arithmetic, i.e., 16 /// computing offsets or alignments. as_usize(self) -> usize17 fn as_usize(self) -> usize; 18 } 19 20 impl<T> Pointer for *const T { distance(self, origin: *const T) -> usize21 unsafe fn distance(self, origin: *const T) -> usize { 22 // TODO: Replace with `ptr::sub_ptr` once stabilized. 23 usize::try_from(self.offset_from(origin)).unwrap_unchecked() 24 } 25 as_usize(self) -> usize26 fn as_usize(self) -> usize { 27 self as usize 28 } 29 } 30 31 impl<T> Pointer for *mut T { distance(self, origin: *mut T) -> usize32 unsafe fn distance(self, origin: *mut T) -> usize { 33 (self as *const T).distance(origin as *const T) 34 } 35 as_usize(self) -> usize36 fn as_usize(self) -> usize { 37 (self as *const T).as_usize() 38 } 39 } 40 41 /// A trait for adding some helper routines to raw bytes. 42 pub(crate) trait Byte { 43 /// Converts this byte to a `char` if it's ASCII. Otherwise panics. to_char(self) -> char44 fn to_char(self) -> char; 45 } 46 47 impl Byte for u8 { to_char(self) -> char48 fn to_char(self) -> char { 49 assert!(self.is_ascii()); 50 char::from(self) 51 } 52 } 53