#![warn(missing_docs)]
mod inner;
mod strong;
mod uninit;
mod unique;
mod weak;
use std::{ops::{Bound, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive}, slice, usize};
use inner::*;
pub use strong::*;
pub use uninit::*;
pub use unique::*;
pub use weak::*;
pub trait SrcIndex<T: SrcSlice + ?Sized> {
type Output: SrcTarget + ?Sized;
fn get(self, slice: Src<T>) -> Src<Self::Output>;
}
impl<T> SrcIndex<[T]> for usize {
type Output = T;
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
Src::into_item(slice, self)
}
}
impl<T> SrcIndex<[T]> for (Bound<usize>, Bound<usize>) {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let (start, end) = self;
Src::into_slice_from_bounds(slice, start, end)
}
}
impl<T> SrcIndex<[T]> for Range<usize> {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let Range { start, end } = self;
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Excluded(end))
}
}
impl<T> SrcIndex<[T]> for RangeFrom<usize> {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let RangeFrom { start } = self;
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Unbounded)
}
}
impl<T> SrcIndex<[T]> for RangeFull {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let RangeFull = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Unbounded)
}
}
impl<T> SrcIndex<[T]> for RangeInclusive<usize> {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let (start, end) = self.into_inner();
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Included(end))
}
}
impl<T> SrcIndex<[T]> for RangeTo<usize> {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let RangeTo { end } = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Excluded(end))
}
}
impl<T> SrcIndex<[T]> for RangeToInclusive<usize> {
type Output = [T];
#[inline]
fn get(self, slice: Src<[T]>) -> Src<Self::Output> {
let RangeToInclusive { end } = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Included(end))
}
}
impl SrcIndex<str> for (Bound<usize>, Bound<usize>) {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let (start, end) = self;
Src::into_slice_from_bounds(slice, start, end)
}
}
impl SrcIndex<str> for Range<usize> {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let Range { start, end } = self;
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Excluded(end))
}
}
impl SrcIndex<str> for RangeFrom<usize> {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let RangeFrom { start } = self;
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Unbounded)
}
}
impl SrcIndex<str> for RangeFull {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let RangeFull = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Unbounded)
}
}
impl SrcIndex<str> for RangeInclusive<usize> {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let (start, end) = self.into_inner();
Src::into_slice_from_bounds(slice, Bound::Included(start), Bound::Included(end))
}
}
impl SrcIndex<str> for RangeTo<usize> {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let RangeTo { end } = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Excluded(end))
}
}
impl SrcIndex<str> for RangeToInclusive<usize> {
type Output = str;
#[inline]
fn get(self, slice: Src<str>) -> Src<Self::Output> {
let RangeToInclusive { end } = self;
Src::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Included(end))
}
}
pub trait WeakSrcIndex<T: SrcSlice + ?Sized>: SrcIndex<T> {
fn get_weak(self, slice: WeakSrc<T>) -> WeakSrc<Self::Output>;
}
impl<T> WeakSrcIndex<[T]> for usize {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
WeakSrc::into_item(slice, self)
}
}
impl<T> WeakSrcIndex<[T]> for (Bound<usize>, Bound<usize>) {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let (start, end) = self;
WeakSrc::into_slice_from_bounds(slice, start, end)
}
}
impl<T> WeakSrcIndex<[T]> for Range<usize> {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let Range { start, end } = self;
WeakSrc::into_slice_from_bounds(slice, Bound::Included(start), Bound::Excluded(end))
}
}
impl<T> WeakSrcIndex<[T]> for RangeFrom<usize> {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let RangeFrom { start } = self;
WeakSrc::into_slice_from_bounds(slice, Bound::Included(start), Bound::Unbounded)
}
}
impl<T> WeakSrcIndex<[T]> for RangeFull {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let RangeFull = self;
WeakSrc::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Unbounded)
}
}
impl<T> WeakSrcIndex<[T]> for RangeInclusive<usize> {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let (start, end) = self.into_inner();
WeakSrc::into_slice_from_bounds(slice, Bound::Included(start), Bound::Included(end))
}
}
impl<T> WeakSrcIndex<[T]> for RangeTo<usize> {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let RangeTo { end } = self;
WeakSrc::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Excluded(end))
}
}
impl<T> WeakSrcIndex<[T]> for RangeToInclusive<usize> {
#[inline]
fn get_weak(self, slice: WeakSrc<[T]>) -> WeakSrc<Self::Output> {
let RangeToInclusive { end } = self;
WeakSrc::into_slice_from_bounds(slice, Bound::Unbounded, Bound::Included(end))
}
}
pub trait SrcTarget: private::SealedSrcTarget {
type Item: Sized;
}
#[diagnostic::do_not_recommend]
impl<T> SrcTarget for T {
type Item = T;
}
#[diagnostic::do_not_recommend]
impl<T> private::SealedSrcTarget for T {
type Len = ();
#[inline]
fn len_as_usize((): Self::Len) -> usize {
1
}
fn get(rc: &Src<Self>) -> &Self {
unsafe { rc.start.as_ref() }
}
fn get_unique(rc: &UniqueSrc<Self>) -> &Self {
unsafe { rc.start.as_ref() }
}
fn get_unique_mut(rc: &mut UniqueSrc<Self>) -> &mut Self {
unsafe { rc.start.as_mut() }
}
#[inline]
fn new_unique_from_clone(&self) -> UniqueSrc<Self> where <Self as SrcTarget>::Item: Clone {
UniqueSrc::single(T::clone(self))
}
}
impl<T> SrcTarget for [T] {
type Item = T;
}
impl<T> private::SealedSrcTarget for [T] {
type Len = usize;
#[inline]
fn len_as_usize(len: Self::Len) -> usize {
len
}
fn get(rc: &Src<Self>) -> &Self {
let start = rc.start.as_ptr().cast_const();
let len = rc.len;
unsafe { slice::from_raw_parts(start, len) }
}
fn get_unique(rc: &UniqueSrc<Self>) -> &Self {
let start = rc.start.as_ptr().cast_const();
let len = rc.len;
unsafe { slice::from_raw_parts(start, len) }
}
fn get_unique_mut(rc: &mut UniqueSrc<Self>) -> &mut Self {
let start = rc.start.as_ptr();
let len = rc.len;
unsafe { slice::from_raw_parts_mut(start, len) }
}
#[inline]
fn new_unique_from_clone(&self) -> UniqueSrc<Self> where <Self as SrcTarget>::Item: Clone {
UniqueSrc::cloned(self)
}
}
impl SrcTarget for str {
type Item = u8;
}
impl private::SealedSrcTarget for str {
type Len = usize;
#[inline]
fn len_as_usize(len: Self::Len) -> usize {
len
}
fn get(rc: &Src<Self>) -> &Self {
let start = rc.start.as_ptr().cast_const();
let len = rc.len;
let slice: &[u8] = unsafe { slice::from_raw_parts(start, len) };
unsafe { str::from_utf8_unchecked(slice) }
}
fn get_unique(rc: &UniqueSrc<Self>) -> &Self {
let start = rc.start.as_ptr().cast_const();
let len = rc.len;
let slice: &[u8] = unsafe { slice::from_raw_parts(start, len) };
unsafe { str::from_utf8_unchecked(slice) }
}
fn get_unique_mut(rc: &mut UniqueSrc<Self>) -> &mut Self {
let start = rc.start.as_ptr();
let len = rc.len;
let slice: &mut [u8] = unsafe { slice::from_raw_parts_mut(start, len) };
unsafe { str::from_utf8_unchecked_mut(slice) }
}
#[inline]
fn new_unique_from_clone(&self) -> UniqueSrc<Self> {
UniqueSrc::new(self)
}
}
pub trait SrcSlice: SrcTarget + private::SealedSrcSlice {}
impl<T> SrcSlice for [T] {}
impl<T> private::SealedSrcSlice for [T] {
#[inline]
fn validate_range(_this: &Src<Self>, _range: Range<usize>) {}
}
impl SrcSlice for str {}
impl private::SealedSrcSlice for str {
fn validate_range(this: &Src<Self>, range: Range<usize>) {
let s: &str = &**this;
let _ = s[range]; }
}
mod private {
use std::ops::Range;
pub trait SealedSrcTarget {
type Len: Copy + Default;
fn len_as_usize(len: Self::Len) -> usize;
fn get(rc: &super::Src<Self>) -> &Self where Self: super::SrcTarget;
fn get_unique(rc: &super::UniqueSrc<Self>) -> &Self where Self: super::SrcTarget;
fn get_unique_mut(rc: &mut super::UniqueSrc<Self>) -> &mut Self where Self: super::SrcTarget;
fn new_unique_from_clone(&self) -> super::UniqueSrc<Self> where Self: super::SrcTarget, Self::Item: Clone;
}
pub trait SealedSrcSlice: SealedSrcTarget<Len = usize> {
fn validate_range(this: &super::Src<Self>, range: Range<usize>) where Self: super::SrcSlice;
}
}