1#![doc = include_str!("../README.md")]
2
3
4use std::mem;
5
6pub trait SubsliceOffset {
7 fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize>;
20}
21
22impl SubsliceOffset for str {
23 fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize> {
24 let outer = self.as_ptr() as usize;
25 let inner = inner.as_ptr() as usize;
26 if inner < outer || inner > outer.wrapping_add(self.len()) {
27 None
28 } else {
29 Some(inner.wrapping_sub(outer))
30 }
31 }
32}
33
34impl<T> SubsliceOffset for [T] {
35 fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize> {
36 let outer = self.as_ptr_range().start as usize..self.as_ptr_range().end as usize;
37 let inner_start = inner.as_ptr_range().start as usize;
38 if inner_start < outer.start || inner_start > outer.end {
39 None
40 } else {
41 Some(inner_start.wrapping_sub(outer.start) / mem::size_of::<T>())
42 }
43 }
44}