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`. |
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 | |
20 | impl<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 | |
31 | impl<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. |
42 | pub(crate) trait Byte { |
43 | /// Converts this byte to a `char` if it's ASCII. Otherwise panics. |
44 | fn to_char(self) -> char; |
45 | } |
46 | |
47 | impl Byte for u8 { |
48 | fn to_char(self) -> char { |
49 | assert!(self.is_ascii()); |
50 | char::from(self) |
51 | } |
52 | } |
53 | |