1/// A trait for adding some helper routines to pointers.
2pub(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`.
8 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.
17 fn as_usize(self) -> usize;
18}
19
20impl<T> Pointer for *const T {
21 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
26 fn as_usize(self) -> usize {
27 self as usize
28 }
29}
30
31impl<T> Pointer for *mut T {
32 unsafe fn distance(self, origin: *mut T) -> usize {
33 (self as *const T).distance(origin as *const T)
34 }
35
36 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.
42pub(crate) trait Byte {
43 /// Converts this byte to a `char` if it's ASCII. Otherwise panics.
44 fn to_char(self) -> char;
45}
46
47impl Byte for u8 {
48 fn to_char(self) -> char {
49 assert!(self.is_ascii());
50 char::from(self)
51 }
52}
53