use rawslice::{RawSlice, RawMutSlice, SliceRawExt};
pub struct UncheckedSlice<'a, T: 'a > {
slice: &'a [T],
}
pub struct UncheckedMutSlice<'a, T: 'a> {
slice: &'a mut [T],
}
pub trait SliceUncheckedExt<T> {
fn as_unchecked<'a>(&'a self) -> UncheckedSlice<'a, T>;
fn as_unchecked_mut<'a>(&'a mut self) -> UncheckedMutSlice<'a, T>;
}
impl<T> SliceUncheckedExt<T> for [T] {
fn as_unchecked<'a>(&'a self) -> UncheckedSlice<'a, T> {
UncheckedSlice::new(self)
}
fn as_unchecked_mut<'a>(&'a mut self) -> UncheckedMutSlice<'a, T> {
UncheckedMutSlice::new(self)
}
}
impl<'a, T> UncheckedSlice<'a, T> {
pub fn new(slice: &'a [T]) -> UncheckedSlice<'a, T> {
UncheckedSlice{ slice: slice }
}
pub fn len(&self) -> usize {
self.slice.len()
}
pub fn as_slice(self) -> &'a [T] {
self.slice
}
pub unsafe fn slice<'b>(&'b self, from: usize, to: usize) -> UncheckedSlice<'b, T> {
UncheckedSlice::new(self.slice.as_raw().slice(from, to).as_slice())
}
pub unsafe fn slice_from<'b>(&'b self, from: usize) -> UncheckedSlice<'b, T> {
self.slice(from, self.len())
}
pub unsafe fn slice_to<'b>(&'b self, to: usize) -> UncheckedSlice<'b, T> {
self.slice(0, to)
}
pub unsafe fn split_at<'b>(&'b self, at: usize) -> (UncheckedSlice<'b, T>, UncheckedSlice<'b, T>) {
(self.slice_to(at), self.slice_from(at))
}
pub unsafe fn get(&self, index: usize) -> &T {
self.slice.as_raw().get(index)
}
}
impl<'a, T> UncheckedMutSlice<'a, T> {
pub fn new(slice: &'a mut [T]) -> UncheckedMutSlice<'a, T> {
UncheckedMutSlice{ slice: slice }
}
pub fn len(&self) -> usize {
self.slice.len()
}
pub fn as_slice(self) -> &'a [T] {
self.slice
}
pub fn as_mut_slice(self) -> &'a mut [T] {
self.slice
}
pub unsafe fn slice<'b>(&'b mut self, from: usize, to: usize) -> UncheckedMutSlice<'b, T> {
UncheckedMutSlice::new(self.slice.as_mut_raw().slice(from, to).as_mut_slice())
}
pub unsafe fn slice_from<'b>(&'b mut self, from: usize) -> UncheckedMutSlice<'b, T> {
let len = self.len();
self.slice(from, len)
}
pub unsafe fn slice_to<'b>(&'b mut self, to: usize) -> UncheckedMutSlice<'b, T> {
self.slice(0, to)
}
pub unsafe fn split_at<'b>(&'b mut self, at: usize) ->
(UncheckedMutSlice<'b, T>, UncheckedMutSlice<'b, T>) {
let raw = self.slice.as_mut_raw();
(raw.slice_to(at).as_mut_slice().as_unchecked_mut(),
raw.slice_from(at).as_mut_slice().as_unchecked_mut())
}
pub unsafe fn get(&mut self, index: usize) -> &T {
self.slice.as_mut_raw().get_mut(index)
}
pub unsafe fn get_mut(&mut self, index: usize) -> &mut T {
self.slice.as_mut_raw().get_mut(index)
}
}