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