#![doc = include_str!("../README.md")]
use std::mem;
pub trait SubsliceOffset {
fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize>;
}
impl SubsliceOffset for str {
fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize> {
let outer = self.as_ptr() as usize;
let inner = inner.as_ptr() as usize;
if inner < outer || inner > outer.wrapping_add(self.len()) {
None
} else {
Some(inner.wrapping_sub(outer))
}
}
}
impl<T> SubsliceOffset for [T] {
fn subslice_offset<'a>(&'a self, inner: &'a Self) -> Option<usize> {
let outer = self.as_ptr_range().start as usize..self.as_ptr_range().end as usize;
let inner_start = inner.as_ptr_range().start as usize;
if inner_start < outer.start || inner_start > outer.end {
None
} else {
Some(inner_start.wrapping_sub(outer.start) / mem::size_of::<T>())
}
}
}