#![allow(dead_code)]
use lib::{iter, marker, ops, ptr, slice};
use stackvector;
#[cfg(all(feature = "correct", feature = "radix"))]
use lib::Vec;
fn remove_many<V, T, R>(vec: &mut V, range: R)
where V: VecLike<T>,
R: ops::RangeBounds<usize>
{
let len = vec.len();
let start = match range.start_bound() {
ops::Bound::Included(&n) => n,
ops::Bound::Excluded(&n) => n + 1,
ops::Bound::Unbounded => 0,
};
let end = match range.end_bound() {
ops::Bound::Included(&n) => n + 1,
ops::Bound::Excluded(&n) => n,
ops::Bound::Unbounded => len,
};
assert!(start <= end);
assert!(end <= len);
unsafe {
vec.set_len(start);
let mut first = vec.as_mut_ptr().add(start);
let last = vec.as_mut_ptr().add(end);
while first < last {
ptr::drop_in_place(first);
first = first.add(1);
}
let count = len - end;
if count != 0 {
let src = vec.as_ptr().add(end);
let dst = vec.as_mut_ptr().add(start);
ptr::copy(src, dst, count);
}
vec.set_len(start + count);
}
}
pub trait AsSlice<T>: {
fn as_slice(&self) -> &[T];
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> AsSlice<T> for Vec<T> {
#[inline]
fn as_slice(&self) -> &[T] {
Vec::as_slice(self)
}
}
impl<A: stackvector::Array> AsSlice<A::Item> for stackvector::StackVec<A> {
#[inline]
fn as_slice(&self) -> &[A::Item] {
stackvector::StackVec::as_slice(self)
}
}
pub trait ExtendFromSlice<T: Clone>: Clone + Default {
fn extend_from_slice(&mut self, other: &[T]);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T: Clone> ExtendFromSlice<T> for Vec<T> {
#[inline]
fn extend_from_slice(&mut self, other: &[T]) {
Vec::extend_from_slice(self, other)
}
}
impl<A: stackvector::Array> ExtendFromSlice<A::Item> for stackvector::StackVec<A>
where A::Item: Copy + Clone
{
#[inline]
fn extend_from_slice(&mut self, other: &[A::Item]) {
stackvector::StackVec::extend_from_slice(self, other)
}
}
pub trait Len<T>: {
fn len(&self) -> usize;
}
impl<T> Len<T> for [T] {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> Len<T> for Vec<T> {
#[inline]
fn len(&self) -> usize {
Vec::len(self)
}
}
impl<A: stackvector::Array> Len<A::Item> for stackvector::StackVec<A> {
#[inline]
fn len(&self) -> usize {
stackvector::StackVec::len(self)
}
}
pub trait Reserve<T>: {
fn reserve(&mut self, capacity: usize);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> Reserve<T> for Vec<T> {
#[inline]
fn reserve(&mut self, capacity: usize) {
Vec::reserve(self, capacity)
}
}
impl<A: stackvector::Array> Reserve<A::Item> for stackvector::StackVec<A> {
#[inline]
fn reserve(&mut self, capacity: usize) {
assert!(capacity < self.capacity());
}
}
pub trait ReserveExact<T>: {
fn reserve_exact(&mut self, capacity: usize);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> ReserveExact<T> for Vec<T> {
#[inline]
fn reserve_exact(&mut self, capacity: usize) {
Vec::reserve_exact(self, capacity)
}
}
impl<A: stackvector::Array> ReserveExact<A::Item> for stackvector::StackVec<A>
{
#[inline]
fn reserve_exact(&mut self, capacity: usize) {
assert!(capacity < self.capacity());
}
}
pub trait Resize<T: Clone>: Clone + Default {
fn resize(&mut self, len: usize, value: T);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T: Clone> Resize<T> for Vec<T> {
#[inline]
fn resize(&mut self, len: usize, value: T) {
Vec::resize(self, len, value)
}
}
impl<A: stackvector::Array> Resize<A::Item> for stackvector::StackVec<A>
where A::Item: Clone
{
#[inline]
fn resize(&mut self, len: usize, value: A::Item) {
stackvector::StackVec::resize(self, len, value)
}
}
pub trait RSliceIndex<T: ?Sized> {
type Output: ?Sized;
fn rget(self, slc: &T) -> Option<&Self::Output>;
fn rget_mut(self, slc: &mut T) -> Option<&mut Self::Output>;
unsafe fn rget_unchecked(self, slc: &T) -> &Self::Output;
unsafe fn rget_unchecked_mut(self, slc: &mut T) -> &mut Self::Output;
fn rindex(self, slc: &T) -> &Self::Output;
fn rindex_mut(self, slc: &mut T) -> &mut Self::Output;
}
impl<T> RSliceIndex<[T]> for usize {
type Output = T;
#[inline]
fn rget(self, slc: &[T]) -> Option<&T> {
let len = slc.len();
slc.get(len - self - 1)
}
#[inline]
fn rget_mut(self, slc: &mut [T]) -> Option<&mut T> {
let len = slc.len();
slc.get_mut(len - self - 1)
}
#[inline]
unsafe fn rget_unchecked(self, slc: &[T]) -> &T {
let len = slc.len();
slc.get_unchecked(len - self - 1)
}
#[inline]
unsafe fn rget_unchecked_mut(self, slc: &mut [T]) -> &mut T {
let len = slc.len();
slc.get_unchecked_mut(len - self - 1)
}
#[inline]
fn rindex(self, slc: &[T]) -> &T {
let len = slc.len();
&(*slc)[len - self - 1]
}
#[inline]
fn rindex_mut(self, slc: &mut [T]) -> &mut T {
let len = slc.len();
&mut (*slc)[len - self - 1]
}
}
pub trait Rget<T> {
fn rget<I: RSliceIndex<[T]>>(&self, index: I) -> Option<&I::Output>;
fn rget_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output>;
unsafe fn rget_unchecked<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output;
unsafe fn rget_unchecked_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
}
impl<T> Rget<T> for [T] {
fn rget<I: RSliceIndex<[T]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self)
}
fn rget_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self)
}
unsafe fn rget_unchecked<I: RSliceIndex<[T]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self)
}
unsafe fn rget_unchecked_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self)
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> Rget<T> for Vec<T> {
fn rget<I: RSliceIndex<[T]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self.as_slice())
}
fn rget_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self.as_mut_slice())
}
unsafe fn rget_unchecked<I: RSliceIndex<[T]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self.as_slice())
}
unsafe fn rget_unchecked_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self.as_mut_slice())
}
}
impl<A: stackvector::Array> Rget<A::Item> for stackvector::StackVec<A> {
fn rget<I: RSliceIndex<[A::Item]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self.as_slice())
}
fn rget_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self.as_mut_slice())
}
unsafe fn rget_unchecked<I: RSliceIndex<[A::Item]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self.as_slice())
}
unsafe fn rget_unchecked_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self.as_mut_slice())
}
}
pub trait RIndex<T> {
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output;
}
impl<T> RIndex<T> for [T] {
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output
{
index.rindex(self)
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> RIndex<T> for Vec<T> {
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output
{
index.rindex(self.as_slice())
}
}
impl<A: stackvector::Array> RIndex<A::Item> for stackvector::StackVec<A> {
fn rindex<I: RSliceIndex<[A::Item]>>(&self, index: I) -> &I::Output
{
index.rindex(self.as_slice())
}
}
pub trait RIndexMut<T> {
fn rindex_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
}
impl<T> RIndexMut<T> for [T] {
fn rindex_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output
{
index.rindex_mut(self)
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> RIndexMut<T> for Vec<T> {
fn rindex_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output
{
index.rindex_mut(self.as_mut_slice())
}
}
impl<A: stackvector::Array> RIndexMut<A::Item> for stackvector::StackVec<A> {
fn rindex_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I) -> &mut I::Output
{
index.rindex_mut(self.as_mut_slice())
}
}
pub struct ReverseView<'a, T> {
inner: &'a [T],
}
impl<'a, T> ops::Index<usize> for ReverseView<'a, T> {
type Output = T;
#[inline]
fn index(&self, index: usize) -> &T {
self.inner.rindex(index)
}
}
pub struct ReverseViewMut<'a, T> {
inner: &'a mut [T],
}
impl<'a, T> ops::Index<usize> for ReverseViewMut<'a, T> {
type Output = T;
#[inline]
fn index(&self, index: usize) -> &T {
self.inner.rindex(index)
}
}
impl<'a, T> ops::IndexMut<usize> for ReverseViewMut<'a, T> {
#[inline]
fn index_mut(&mut self, index: usize) -> &mut T {
self.inner.rindex_mut(index)
}
}
pub trait SliceLike<T>:
ops::Index<usize, Output=T> +
ops::IndexMut<usize> +
ops::Index<ops::Range<usize>, Output=[T]> +
ops::IndexMut<ops::Range<usize>> +
ops::Index<ops::RangeFrom<usize>, Output=[T]> +
ops::IndexMut<ops::RangeFrom<usize>> +
ops::Index<ops::RangeTo<usize>, Output=[T]> +
ops::IndexMut<ops::RangeTo<usize>> +
ops::Index<ops::RangeFull, Output=[T]> +
ops::IndexMut<ops::RangeFull> +
Len<T> +
Rget<T> +
RIndex<T> +
RIndexMut<T>
{
#[inline]
fn get<I: slice::SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output>;
#[inline]
fn get_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output>;
#[inline]
unsafe fn get_unchecked<I: slice::SliceIndex<[T]>>(&self, index: I) -> &I::Output;
#[inline]
unsafe fn get_unchecked_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
#[inline]
fn front(&self) -> Option<&T> {
self.get(0)
}
#[inline]
fn front_mut(&mut self) -> Option<&mut T> {
debug_assert!(self.len() > 0);
self.get_mut(0)
}
#[inline]
unsafe fn front_unchecked(&self) -> &T {
debug_assert!(self.len() > 0);
self.get_unchecked(0)
}
#[inline]
unsafe fn front_unchecked_mut(&mut self) -> &mut T {
debug_assert!(self.len() > 0);
self.get_unchecked_mut(0)
}
#[inline]
fn back(&self) -> Option<&T> {
self.rget(0)
}
#[inline]
fn back_mut(&mut self) -> Option<&mut T> {
self.rget_mut(0)
}
#[inline]
unsafe fn back_unchecked(&self) -> &T {
self.rget_unchecked(0)
}
#[inline]
unsafe fn back_unchecked_mut(&mut self) -> &mut T {
self.rget_unchecked_mut(0)
}
#[inline]
fn rview<'a>(&'a self) -> ReverseView<'a, T> {
ReverseView { inner: &self[..] }
}
#[inline]
fn rview_mut<'a>(&'a mut self) -> ReverseViewMut<'a, T> {
ReverseViewMut { inner: &mut self[..] }
}
}
impl<T> SliceLike<T> for [T] {
#[inline]
fn get<I: slice::SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output> {
<[T]>::get(self, index)
}
#[inline]
fn get_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output> {
<[T]>::get_mut(self, index)
}
#[inline]
unsafe fn get_unchecked<I: slice::SliceIndex<[T]>>(&self, index: I) -> &I::Output {
<[T]>::get_unchecked(self, index)
}
#[inline]
unsafe fn get_unchecked_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
<[T]>::get_unchecked_mut(self, index)
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> SliceLike<T> for Vec<T> {
#[inline]
fn get<I: slice::SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output> {
self.as_slice().get(index)
}
#[inline]
fn get_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output> {
self.as_mut_slice().get_mut(index)
}
#[inline]
unsafe fn get_unchecked<I: slice::SliceIndex<[T]>>(&self, index: I) -> &I::Output {
self.as_slice().get_unchecked(index)
}
#[inline]
unsafe fn get_unchecked_mut<I: slice::SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
self.as_mut_slice().get_unchecked_mut(index)
}
}
impl<A: stackvector::Array> SliceLike<A::Item> for stackvector::StackVec<A> {
#[inline]
fn get<I: slice::SliceIndex<[A::Item]>>(&self, index: I) -> Option<&I::Output> {
self.as_slice().get(index)
}
#[inline]
fn get_mut<I: slice::SliceIndex<[A::Item]>>(&mut self, index: I) -> Option<&mut I::Output> {
self.as_mut_slice().get_mut(index)
}
#[inline]
unsafe fn get_unchecked<I: slice::SliceIndex<[A::Item]>>(&self, index: I) -> &I::Output {
self.as_slice().get_unchecked(index)
}
#[inline]
unsafe fn get_unchecked_mut<I: slice::SliceIndex<[A::Item]>>(&mut self, index: I) -> &mut I::Output {
self.as_mut_slice().get_unchecked_mut(index)
}
}
pub trait VecLike<T>:
iter::FromIterator<T> +
iter::IntoIterator +
ops::Index<usize, Output=T> +
ops::IndexMut<usize> +
ops::Index<ops::Range<usize>, Output=[T]> +
ops::IndexMut<ops::Range<usize>> +
ops::Index<ops::RangeFrom<usize>, Output=[T]> +
ops::IndexMut<ops::RangeFrom<usize>> +
ops::Index<ops::RangeTo<usize>, Output=[T]> +
ops::IndexMut<ops::RangeTo<usize>> +
ops::Index<ops::RangeFull, Output=[T]> +
ops::IndexMut<ops::RangeFull> +
ops::DerefMut<Target = [T]> +
AsSlice<T> +
Extend<T> +
SliceLike<T> +
Default
{
fn push(&mut self, value: T);
fn pop(&mut self) -> Option<T>;
fn insert_many<I: iter::IntoIterator<Item=T>>(&mut self, index: usize, iterable: I);
fn remove_many<R: ops::RangeBounds<usize>>(&mut self, range: R);
unsafe fn set_len(&mut self, new_len: usize);
fn clear(&mut self);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> VecLike<T> for Vec<T> {
#[inline]
fn push(&mut self, value: T) {
Vec::push(self, value);
}
#[inline]
fn pop(&mut self) -> Option<T> {
Vec::pop(self)
}
#[inline]
unsafe fn set_len(&mut self, new_len: usize) {
Vec::set_len(self, new_len);
}
#[inline]
fn clear(&mut self) {
Vec::clear(self);
}
#[inline]
fn insert_many<I: iter::IntoIterator<Item=T>>(&mut self, index: usize, iterable: I) {
self.splice(index..index, iterable);
}
#[inline]
fn remove_many<R: ops::RangeBounds<usize>>(&mut self, range: R) {
remove_many(self, range)
}
}
impl<A: stackvector::Array> VecLike<A::Item> for stackvector::StackVec<A> {
#[inline]
fn push(&mut self, value: A::Item) {
stackvector::StackVec::push(self, value);
}
#[inline]
fn pop(&mut self) -> Option<A::Item> {
stackvector::StackVec::pop(self)
}
#[inline]
unsafe fn set_len(&mut self, new_len: usize) {
stackvector::StackVec::set_len(self, new_len);
}
#[inline]
fn clear(&mut self) {
stackvector::StackVec::clear(self);
}
#[inline]
fn insert_many<I: iter::IntoIterator<Item=A::Item>>(&mut self, index: usize, iterable: I) {
stackvector::StackVec::insert_many(self, index, iterable)
}
#[inline]
fn remove_many<R: ops::RangeBounds<usize>>(&mut self, range: R) {
remove_many(self, range)
}
}
pub trait CloneableVecLike<T: Clone + Copy + Send>:
Send +
ExtendFromSlice<T> +
Resize<T> +
Reserve<T> +
ReserveExact<T> +
VecLike<T>
{}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T: Clone + Copy + Send> CloneableVecLike<T> for Vec<T> {
}
impl<A: stackvector::Array> CloneableVecLike<A::Item> for stackvector::StackVec<A>
where A::Item: Clone + Copy + Send
{}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(all(feature = "correct", feature = "radix"))]
#[test]
fn remove_many_test() {
let mut x = vec![0, 1, 2, 3, 4, 5];
x.remove_many(0..3);
assert_eq!(x, vec![3, 4, 5]);
assert_eq!(x.len(), 3);
let mut x = vec![0, 1, 2, 3, 4, 5];
x.remove_many(..);
assert_eq!(x, vec![]);
let mut x = vec![0, 1, 2, 3, 4, 5];
x.remove_many(3..);
assert_eq!(x, vec![0, 1, 2]);
let mut x = vec![0, 1, 2, 3, 4, 5];
x.remove_many(..3);
assert_eq!(x, vec![3, 4, 5]);
}
}