use core::ops;
use bstr::BStr;
pub trait Sealed {}
impl Sealed for usize {}
impl Sealed for ops::Range<usize> {}
impl Sealed for ops::RangeTo<usize> {}
impl Sealed for ops::RangeFrom<usize> {}
impl Sealed for ops::RangeFull {}
impl Sealed for ops::RangeInclusive<usize> {}
impl Sealed for ops::RangeToInclusive<usize> {}
pub trait SliceIndex: Sealed {
type Output: ?Sized;
fn get(self, slice: &BStr) -> Option<&Self::Output>;
fn get_mut(self, slice: &mut BStr) -> Option<&mut Self::Output>;
unsafe fn get_unchecked(self, slice: &BStr) -> &Self::Output;
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut Self::Output;
fn index(self, slice: &BStr) -> &Self::Output;
fn index_mut(self, slice: &mut BStr) -> &mut Self::Output;
}
impl SliceIndex for usize {
type Output = u8;
#[inline]
fn get(self, slice: &BStr) -> Option<&u8> {
slice.as_bytes().get(self)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut u8> {
slice.as_bytes_mut().get_mut(self)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &u8 {
slice.as_bytes().get_unchecked(self)
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut u8 {
slice.as_bytes_mut().get_unchecked_mut(self)
}
#[inline]
fn index(self, slice: &BStr) -> &u8 {
&slice.as_bytes()[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut u8 {
&mut slice.as_bytes_mut()[self]
}
}
impl SliceIndex for ops::Range<usize> {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}
impl SliceIndex for ops::RangeTo<usize> {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}
impl SliceIndex for ops::RangeFrom<usize> {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}
impl SliceIndex for ops::RangeFull {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}
impl SliceIndex for ops::RangeInclusive<usize> {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}
impl SliceIndex for ops::RangeToInclusive<usize> {
type Output = BStr;
#[inline]
fn get(self, slice: &BStr) -> Option<&BStr> {
slice.as_bytes().get(self).map(BStr::new)
}
#[inline]
fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> {
slice.as_bytes_mut().get_mut(self).map(BStr::new_mut)
}
#[inline]
unsafe fn get_unchecked(self, slice: &BStr) -> &BStr {
BStr::new(slice.as_bytes().get_unchecked(self))
}
#[inline]
unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr {
BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self))
}
#[inline]
fn index(self, slice: &BStr) -> &BStr {
&slice[self]
}
#[inline]
fn index_mut(self, slice: &mut BStr) -> &mut BStr {
&mut slice[self]
}
}