aho_corasick/packed/
ext.rs

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}