#![allow(dead_code)]
use lib::{cmp, iter, marker, mem, ops, ptr, slice};
use arrayvec;
use super::bound::Bound;
use super::pointer_methods::PointerMethods;
use super::range_bounds::RangeBounds;
use super::slice_index::SliceIndex;
#[cfg(all(feature = "correct", feature = "radix"))]
use lib::Vec;
#[macro_export]
macro_rules! arrvec {
($elem:expr; $n:expr) => ({
$crate::arrayvec::ArrayVec::from([$elem; $n])
});
($($x:expr),*$(,)*) => ({
#[allow(unused_mut)] {
let mut vec = $crate::arrayvec::ArrayVec::new();
$(vec.push($x);)*
vec
}
});
}
pub fn insert_many<V, T, I>(vec: &mut V, index: usize, iterable: I)
where V: VecLike<T>,
I: iter::IntoIterator<Item=T>
{
let mut iter = iterable.into_iter();
if index == vec.len() {
return vec.extend(iter);
}
let (lower_size_bound, _) = iter.size_hint();
assert!(lower_size_bound <= core::isize::MAX as usize);
assert!(index + lower_size_bound >= index);
let mut num_added = 0;
let old_len = vec.len();
assert!(index <= old_len);
unsafe {
vec.reserve(lower_size_bound);
let start = vec.as_mut_ptr();
let ptr = start.add(index);
ptr::copy(ptr, ptr.add(lower_size_bound), old_len - index);
vec.set_len(0);
let mut guard = DropOnPanic {
start,
skip: index..(index + lower_size_bound),
len: old_len + lower_size_bound,
};
while num_added < lower_size_bound {
let element = match iter.next() {
Some(x) => x,
None => break,
};
let cur = ptr.add(num_added);
ptr::write(cur, element);
guard.skip.start += 1;
num_added += 1;
}
if num_added < lower_size_bound {
ptr::copy(
ptr.add(lower_size_bound),
ptr.add(num_added),
old_len - index,
);
}
vec.set_len(old_len + num_added);
mem::forget(guard);
}
for element in iter {
vec.insert(index + num_added, element);
num_added += 1;
}
struct DropOnPanic<T> {
start: *mut T,
skip: ops::Range<usize>,
len: usize,
}
impl<T> DropOnPanic<T> {
#[inline]
fn contains(&self, item: &usize) -> bool {
(match self.skip.start_bound() {
ops::Bound::Included(ref start) => *start <= item,
ops::Bound::Excluded(ref start) => *start < item,
ops::Bound::Unbounded => true,
}) && (match self.skip.end_bound() {
ops::Bound::Included(ref end) => item <= *end,
ops::Bound::Excluded(ref end) => item < *end,
ops::Bound::Unbounded => true,
})
}
}
impl<T> Drop for DropOnPanic<T> {
fn drop(&mut self) {
for i in 0..self.len {
if !self.contains(&i) {
unsafe {
ptr::drop_in_place(self.start.add(i));
}
}
}
}
}
}
fn remove_many<V, T, R>(vec: &mut V, range: R)
where V: VecLike<T>,
R: RangeBounds<usize>
{
let len = vec.len();
let start = match range.start_bound() {
Bound::Included(&n) => n,
Bound::Excluded(&n) => n + 1,
Bound::Unbounded => 0,
};
let end = match range.end_bound() {
Bound::Included(&n) => n + 1,
Bound::Excluded(&n) => n,
Bound::Unbounded => len,
};
assert!(start <= end);
assert!(end <= len);
unsafe {
vec.set_len(start);
let mut first = vec.as_mut_ptr().padd(start);
let last = vec.as_mut_ptr().padd(end);
while first < last {
ptr::drop_in_place(first);
first = first.padd(1);
}
let count = len - end;
if count != 0 {
let src = vec.as_ptr().padd(end);
let dst = vec.as_mut_ptr().padd(start);
ptr::copy(src, dst, count);
}
vec.set_len(start + count);
}
}
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 struct ReverseView<'a, T: 'a> {
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: 'a> {
inner: &'a mut [T],
}
impl<'a, T: 'a> ops::Index<usize> for ReverseViewMut<'a, T> {
type Output = T;
#[inline]
fn index(&self, index: usize) -> &T {
self.inner.rindex(index)
}
}
impl<'a, T: 'a> ops::IndexMut<usize> for ReverseViewMut<'a, T> {
#[inline]
fn index_mut(&mut self, index: usize) -> &mut T {
self.inner.rindex_mut(index)
}
}
pub trait SliceLikeImpl<T> {
fn as_slice(&self) -> &[T];
fn as_mut_slice(&mut self) -> &mut [T];
}
impl<T> SliceLikeImpl<T> for [T] {
#[inline]
fn as_slice(&self) -> &[T] {
self
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [T] {
self
}
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> SliceLikeImpl<T> for Vec<T> {
#[inline]
fn as_slice(&self) -> &[T] {
Vec::as_slice(self)
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [T] {
Vec::as_mut_slice(self)
}
}
impl<A: arrayvec::Array> SliceLikeImpl<A::Item> for arrayvec::ArrayVec<A> {
#[inline]
fn as_slice(&self) -> &[A::Item] {
arrayvec::ArrayVec::as_slice(self)
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [A::Item] {
arrayvec::ArrayVec::as_mut_slice(self)
}
}
pub trait Contains<T: PartialEq> {
fn contains(&self, x: &T) -> bool;
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: PartialEq> Contains<T> for SliceLikeImpl<T> {
#[inline]
fn contains(&self, x: &T) -> bool {
<[T]>::contains(self.as_slice(), x)
}
}
pub trait StartsWith<T: PartialEq> {
fn starts_with(&self, x: &[T]) -> bool;
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: PartialEq> StartsWith<T> for SliceLikeImpl<T> {
#[inline]
fn starts_with(&self, x: &[T]) -> bool {
<[T]>::starts_with(self.as_slice(), x)
}
}
pub trait EndsWith<T: PartialEq> {
fn ends_with(&self, x: &[T]) -> bool;
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: PartialEq> EndsWith<T> for SliceLikeImpl<T> {
#[inline]
fn ends_with(&self, x: &[T]) -> bool {
<[T]>::ends_with(self.as_slice(), x)
}
}
pub trait BinarySearch<T: Ord> {
fn binary_search(&self, x: &T) -> Result<usize, usize>;
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: Ord> BinarySearch<T> for SliceLikeImpl<T> {
#[inline]
fn binary_search(&self, x: &T) -> Result<usize, usize> {
<[T]>::binary_search(self.as_slice(), x)
}
}
pub trait Sort<T: Ord> {
fn sort(&mut self);
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: Ord> Sort<T> for SliceLikeImpl<T> {
#[inline]
fn sort(&mut self) {
<[T]>::sort(self.as_mut_slice())
}
}
pub trait SortUnstable<T: Ord> {
fn sort_unstable(&mut self);
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: Ord> SortUnstable<T> for SliceLikeImpl<T> {
#[inline]
fn sort_unstable(&mut self) {
<[T]>::sort_unstable(self.as_mut_slice())
}
}
pub trait CloneFromSlice<T: Clone> {
fn clone_from_slice(&mut self, src: &[T]);
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: Clone> CloneFromSlice<T> for SliceLikeImpl<T> {
#[inline]
fn clone_from_slice(&mut self, src: &[T]) {
<[T]>::clone_from_slice(self.as_mut_slice(), src)
}
}
pub trait CopyFromSlice<T: Copy> {
fn copy_from_slice(&mut self, src: &[T]);
}
#[allow(unknown_lints, bare_trait_objects)]
impl<T: Copy> CopyFromSlice<T> for SliceLikeImpl<T> {
#[inline]
fn copy_from_slice(&mut self, src: &[T]) {
<[T]>::copy_from_slice(self.as_mut_slice(), src)
}
}
pub trait SliceLike<T>: SliceLikeImpl<T> {
fn get<I: SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output>;
fn get_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output>;
unsafe fn get_unchecked<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output;
unsafe fn get_unchecked_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
fn index<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output;
fn index_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
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;
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output;
fn rindex_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output;
#[inline]
fn as_ptr(&self) -> *const T {
<[T]>::as_ptr(self.as_slice())
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut T {
<[T]>::as_mut_ptr(self.as_mut_slice())
}
#[inline]
fn binary_search_by<F>(&self, func: F)
-> Result<usize, usize>
where F: FnMut(&T) -> cmp::Ordering
{
<[T]>::binary_search_by(self.as_slice(), func)
}
#[inline]
fn binary_search_by_key<K, F>(&self, key: &K, func: F)
-> Result<usize, usize>
where K: Ord,
F: FnMut(&T) -> K
{
<[T]>::binary_search_by_key(self.as_slice(), key, func)
}
#[inline]
fn chunks(&self, size: usize) -> slice::Chunks<T> {
<[T]>::chunks(self.as_slice(), size)
}
#[inline]
fn chunks_mut(&mut self, size: usize) -> slice::ChunksMut<T> {
<[T]>::chunks_mut(self.as_mut_slice(), size)
}
#[inline]
fn first(&self) -> Option<&T> {
self.as_slice().get(0)
}
#[inline]
fn first_mut(&mut self) -> Option<&mut T> {
self.as_mut_slice().get_mut(0)
}
#[inline]
unsafe fn first_unchecked(&self) -> &T {
self.as_slice().get_unchecked(0)
}
#[inline]
unsafe fn first_unchecked_mut(&mut self) -> &mut T {
self.as_mut_slice().get_unchecked_mut(0)
}
#[inline]
fn iter(&self) -> slice::Iter<T> {
<[T]>::iter(self.as_slice())
}
#[inline]
fn iter_mut(&mut self) -> slice::IterMut<T> {
<[T]>::iter_mut(self.as_mut_slice())
}
#[inline]
fn last(&self) -> Option<&T> {
self.rget(0)
}
#[inline]
fn last_mut(&mut self) -> Option<&mut T> {
self.rget_mut(0)
}
#[inline]
unsafe fn last_unchecked(&self) -> &T {
debug_assert!(self.len() > 0);
self.rget_unchecked(0)
}
#[inline]
unsafe fn last_unchecked_mut(&mut self) -> &mut T {
debug_assert!(self.len() > 0);
self.rget_unchecked_mut(0)
}
#[inline]
fn is_empty(&self) -> bool {
<[T]>::is_empty(self.as_slice())
}
#[inline]
fn len(&self) -> usize {
<[T]>::len(self.as_slice())
}
#[inline]
fn reverse(&mut self) {
<[T]>::reverse(self.as_mut_slice())
}
#[inline]
fn rsplitn<F: FnMut(&T) -> bool>(&self, n: usize, func: F) -> slice::RSplitN<T, F> {
<[T]>::rsplitn(self.as_slice(), n, func)
}
#[inline]
fn rsplitn_mut<F: FnMut(&T) -> bool>(&mut self, n: usize, func: F) -> slice::RSplitNMut<T, F> {
<[T]>::rsplitn_mut(self.as_mut_slice(), n, func)
}
#[inline]
fn sort_by<F>(&mut self, func: F)
where F: FnMut(&T, &T) -> cmp::Ordering
{
<[T]>::sort_by(self.as_mut_slice(), func)
}
#[inline]
fn sort_by_key<K, F>(&mut self, func: F)
where K: Ord,
F: FnMut(&T) -> K
{
<[T]>::sort_by_key(self.as_mut_slice(), func)
}
#[inline]
fn sort_unstable_by<F>(&mut self, func: F)
where F: FnMut(&T, &T) -> cmp::Ordering
{
<[T]>::sort_unstable_by(self.as_mut_slice(), func)
}
#[inline]
fn sort_unstable_by_key<K, F>(&mut self, func: F)
where K: Ord,
F: FnMut(&T) -> K
{
<[T]>::sort_unstable_by_key(self.as_mut_slice(), func)
}
#[inline]
fn split<F: FnMut(&T) -> bool>(&self, func: F) -> slice::Split<T, F> {
<[T]>::split(self.as_slice(), func)
}
#[inline]
fn split_mut<F: FnMut(&T) -> bool>(&mut self, func: F) -> slice::SplitMut<T, F> {
<[T]>::split_mut(self.as_mut_slice(), func)
}
#[inline]
fn split_at(&self, index: usize) -> (&[T], &[T]) {
<[T]>::split_at(self.as_slice(), index)
}
#[inline]
fn split_at_mut(&mut self, index: usize) -> (&mut [T], &mut [T]) {
<[T]>::split_at_mut(self.as_mut_slice(), index)
}
#[inline]
fn split_first(&self) -> Option<(&T, &[T])> {
<[T]>::split_first(self.as_slice())
}
#[inline]
fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> {
<[T]>::split_first_mut(self.as_mut_slice())
}
#[inline]
fn split_last(&self) -> Option<(&T, &[T])> {
<[T]>::split_last(self.as_slice())
}
#[inline]
fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> {
<[T]>::split_last_mut(self.as_mut_slice())
}
#[inline]
fn splitn<F: FnMut(&T) -> bool>(&self, n: usize, func: F) -> slice::SplitN<T, F> {
<[T]>::splitn(self.as_slice(), n, func)
}
#[inline]
fn splitn_mut<F: FnMut(&T) -> bool>(&mut self, n: usize, func: F) -> slice::SplitNMut<T, F> {
<[T]>::splitn_mut(self.as_mut_slice(), n, func)
}
#[inline]
fn swap(&mut self, x: usize, y: usize) {
<[T]>::swap(self.as_mut_slice(), x, y)
}
#[inline]
fn windows(&self, size: usize) -> slice::Windows<T> {
<[T]>::windows(self.as_slice(), size)
}
#[inline]
fn rview<'a>(&'a self) -> ReverseView<'a, T> {
ReverseView { inner: self.as_slice() }
}
#[inline]
fn rview_mut<'a>(&'a mut self) -> ReverseViewMut<'a, T> {
ReverseViewMut { inner: self.as_mut_slice() }
}
}
impl<T> SliceLike<T> for [T] {
#[inline]
fn get<I: SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output> {
#[cfg(has_slice_index)]
return <[T]>::get(self, index);
#[cfg(not(has_slice_index))]
return index.get(self);
}
#[inline]
fn get_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output> {
#[cfg(has_slice_index)]
return <[T]>::get_mut(self, index);
#[cfg(not(has_slice_index))]
return index.get_mut(self);
}
#[inline]
unsafe fn get_unchecked<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return <[T]>::get_unchecked(self, index);
#[cfg(not(has_slice_index))]
return index.get_unchecked(self);
}
#[inline]
unsafe fn get_unchecked_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return <[T]>::get_unchecked_mut(self, index);
#[cfg(not(has_slice_index))]
return index.get_unchecked_mut(self);
}
#[inline]
fn index<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return <[T] as ops::Index<I>>::index(self, index);
#[cfg(not(has_slice_index))]
return index.index(self);
}
#[inline]
fn index_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return <[T] as ops::IndexMut<I>>::index_mut(self, index);
#[cfg(not(has_slice_index))]
return index.index_mut(self);
}
#[inline]
fn rget<I: RSliceIndex<[T]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self)
}
#[inline]
fn rget_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self)
}
#[inline]
unsafe fn rget_unchecked<I: RSliceIndex<[T]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self)
}
#[inline]
unsafe fn rget_unchecked_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self)
}
#[inline]
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output {
index.rindex(self)
}
#[inline]
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> SliceLike<T> for Vec<T> {
#[inline]
fn get<I: SliceIndex<[T]>>(&self, index: I) -> Option<&I::Output> {
#[cfg(has_slice_index)]
return self.as_slice().get(index);
#[cfg(not(has_slice_index))]
return index.get(self.as_slice());
}
#[inline]
fn get_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> Option<&mut I::Output> {
#[cfg(has_slice_index)]
return self.as_mut_slice().get_mut(index);
#[cfg(not(has_slice_index))]
return index.get_mut(self.as_mut_slice());
}
#[inline]
unsafe fn get_unchecked<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return self.as_slice().get_unchecked(index);
#[cfg(not(has_slice_index))]
return index.get_unchecked(self.as_slice());
}
#[inline]
unsafe fn get_unchecked_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return self.as_mut_slice().get_unchecked_mut(index);
#[cfg(not(has_slice_index))]
return index.get_unchecked_mut(self.as_mut_slice());
}
#[inline]
fn index<I: SliceIndex<[T]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return self.as_slice().index(index);
#[cfg(not(has_slice_index))]
return index.index(self.as_slice());
}
#[inline]
fn index_mut<I: SliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return self.as_mut_slice().index_mut(index);
#[cfg(not(has_slice_index))]
return index.index_mut(self.as_mut_slice());
}
#[inline]
fn rget<I: RSliceIndex<[T]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self.as_slice())
}
#[inline]
fn rget_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self.as_mut_slice())
}
#[inline]
unsafe fn rget_unchecked<I: RSliceIndex<[T]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self.as_slice())
}
#[inline]
unsafe fn rget_unchecked_mut<I: RSliceIndex<[T]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self.as_mut_slice())
}
#[inline]
fn rindex<I: RSliceIndex<[T]>>(&self, index: I) -> &I::Output {
index.rindex(self.as_slice())
}
#[inline]
fn rindex_mut<I: RSliceIndex<[T]>>(&mut self, index: I) -> &mut I::Output {
index.rindex_mut(self.as_mut_slice())
}
}
impl<A: arrayvec::Array> SliceLike<A::Item> for arrayvec::ArrayVec<A> {
#[inline]
fn get<I: SliceIndex<[A::Item]>>(&self, index: I) -> Option<&I::Output> {
#[cfg(has_slice_index)]
return self.as_slice().get(index);
#[cfg(not(has_slice_index))]
return index.get(self.as_slice());
}
#[inline]
fn get_mut<I: SliceIndex<[A::Item]>>(&mut self, index: I) -> Option<&mut I::Output> {
#[cfg(has_slice_index)]
return self.as_mut_slice().get_mut(index);
#[cfg(not(has_slice_index))]
return index.get_mut(self.as_mut_slice());
}
#[inline]
unsafe fn get_unchecked<I: SliceIndex<[A::Item]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return self.as_slice().get_unchecked(index);
#[cfg(not(has_slice_index))]
return index.get_unchecked(self.as_slice());
}
#[inline]
unsafe fn get_unchecked_mut<I: SliceIndex<[A::Item]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return self.as_mut_slice().get_unchecked_mut(index);
#[cfg(not(has_slice_index))]
return index.get_unchecked_mut(self.as_mut_slice());
}
#[inline]
fn index<I: SliceIndex<[A::Item]>>(&self, index: I) -> &I::Output {
#[cfg(has_slice_index)]
return self.as_slice().index(index);
#[cfg(not(has_slice_index))]
return index.index(self.as_slice());
}
#[inline]
fn index_mut<I: SliceIndex<[A::Item]>>(&mut self, index: I) -> &mut I::Output {
#[cfg(has_slice_index)]
return self.as_mut_slice().index_mut(index);
#[cfg(not(has_slice_index))]
return index.index_mut(self.as_mut_slice());
}
#[inline]
fn rget<I: RSliceIndex<[A::Item]>>(&self, index: I)
-> Option<&I::Output>
{
index.rget(self.as_slice())
}
#[inline]
fn rget_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I)
-> Option<&mut I::Output>
{
index.rget_mut(self.as_mut_slice())
}
#[inline]
unsafe fn rget_unchecked<I: RSliceIndex<[A::Item]>>(&self, index: I)
-> &I::Output
{
index.rget_unchecked(self.as_slice())
}
#[inline]
unsafe fn rget_unchecked_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I)
-> &mut I::Output
{
index.rget_unchecked_mut(self.as_mut_slice())
}
#[inline]
fn rindex<I: RSliceIndex<[A::Item]>>(&self, index: I) -> &I::Output {
index.rindex(self.as_slice())
}
#[inline]
fn rindex_mut<I: RSliceIndex<[A::Item]>>(&mut self, index: I) -> &mut I::Output {
index.rindex_mut(self.as_mut_slice())
}
}
pub trait VecLike<T>:
Default +
iter::FromIterator<T> +
iter::IntoIterator +
ops::DerefMut<Target = [T]> +
Extend<T> +
SliceLike<T>
{
fn new() -> Self;
fn with_capacity(capacity: usize) -> Self;
fn capacity(&self) -> usize;
fn reserve(&mut self, capacity: usize);
fn reserve_exact(&mut self, additional: usize);
fn shrink_to_fit(&mut self);
fn truncate(&mut self, len: usize);
unsafe fn set_len(&mut self, new_len: usize);
fn swap_remove(&mut self, index: usize) -> T;
fn insert(&mut self, index: usize, element: T);
fn remove(&mut self, index: usize) -> T;
fn push(&mut self, value: T);
fn pop(&mut self) -> Option<T>;
fn clear(&mut self);
fn insert_many<I: iter::IntoIterator<Item=T>>(&mut self, index: usize, iterable: I);
fn remove_many<R: RangeBounds<usize>>(&mut self, range: R);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> VecLike<T> for Vec<T> {
#[inline]
fn new() -> Vec<T> {
Vec::new()
}
#[inline]
fn with_capacity(capacity: usize) -> Vec<T> {
Vec::with_capacity(capacity)
}
#[inline]
fn capacity(&self) -> usize {
Vec::capacity(self)
}
#[inline]
fn reserve(&mut self, capacity: usize) {
Vec::reserve(self, capacity)
}
#[inline]
fn reserve_exact(&mut self, capacity: usize) {
Vec::reserve_exact(self, capacity)
}
#[inline]
fn shrink_to_fit(&mut self) {
Vec::shrink_to_fit(self)
}
#[inline]
fn truncate(&mut self, len: usize) {
Vec::truncate(self, len)
}
#[inline]
unsafe fn set_len(&mut self, new_len: usize) {
Vec::set_len(self, new_len);
}
#[inline]
fn swap_remove(&mut self, index: usize) -> T {
Vec::swap_remove(self, index)
}
#[inline]
fn insert(&mut self, index: usize, element: T) {
Vec::insert(self, index, element)
}
#[inline]
fn remove(&mut self, index: usize) -> T {
Vec::remove(self, index)
}
#[inline]
fn push(&mut self, value: T) {
Vec::push(self, value);
}
#[inline]
fn pop(&mut self) -> Option<T> {
Vec::pop(self)
}
#[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: RangeBounds<usize>>(&mut self, range: R) {
remove_many(self, range)
}
}
impl<A: arrayvec::Array> VecLike<A::Item> for arrayvec::ArrayVec<A> {
#[inline]
fn new() -> arrayvec::ArrayVec<A> {
arrayvec::ArrayVec::new()
}
#[inline]
fn with_capacity(capacity: usize) -> arrayvec::ArrayVec<A> {
let mut v = arrayvec::ArrayVec::new();
v.reserve(capacity);
v
}
#[inline]
fn capacity(&self) -> usize {
arrayvec::ArrayVec::capacity(self)
}
#[inline]
fn reserve(&mut self, capacity: usize) {
assert!(self.len() + capacity <= self.capacity());
}
#[inline]
fn reserve_exact(&mut self, capacity: usize) {
assert!(self.len() + capacity <= self.capacity());
}
#[inline]
fn shrink_to_fit(&mut self) {
}
#[inline]
fn truncate(&mut self, len: usize) {
arrayvec::ArrayVec::truncate(self, len)
}
#[inline]
unsafe fn set_len(&mut self, new_len: usize) {
arrayvec::ArrayVec::set_len(self, new_len);
}
#[inline]
fn swap_remove(&mut self, index: usize) -> A::Item {
arrayvec::ArrayVec::swap_remove(self, index)
}
#[inline]
fn insert(&mut self, index: usize, element: A::Item) {
arrayvec::ArrayVec::insert(self, index, element)
}
#[inline]
fn remove(&mut self, index: usize) -> A::Item {
arrayvec::ArrayVec::remove(self, index)
}
#[inline]
fn push(&mut self, value: A::Item) {
arrayvec::ArrayVec::push(self, value);
}
#[inline]
fn pop(&mut self) -> Option<A::Item> {
arrayvec::ArrayVec::pop(self)
}
#[inline]
fn clear(&mut self) {
arrayvec::ArrayVec::clear(self);
}
#[inline]
fn insert_many<I: iter::IntoIterator<Item=A::Item>>(&mut self, index: usize, iterable: I) {
insert_many(self, index, iterable)
}
#[inline]
fn remove_many<R: RangeBounds<usize>>(&mut self, range: R) {
remove_many(self, range)
}
}
pub trait CloneableVecLike<T: Clone + Copy + Send>: Send + VecLike<T>
{
fn extend_from_slice(&mut self, other: &[T]);
fn resize(&mut self, len: usize, value: T);
}
#[cfg(all(feature = "correct", feature = "radix"))]
impl<T> CloneableVecLike<T> for Vec<T>
where T: Clone + Copy + Send
{
#[inline]
fn extend_from_slice(&mut self, other: &[T]) {
Vec::extend_from_slice(self, other)
}
#[inline]
fn resize(&mut self, len: usize, value: T) {
Vec::resize(self, len, value)
}
}
impl<A: arrayvec::Array> CloneableVecLike<A::Item> for arrayvec::ArrayVec<A>
where A: Send,
A::Index: Send,
A::Item: Clone + Copy + Send
{
#[inline]
fn extend_from_slice(&mut self, other: &[A::Item]) {
self.extend(other.iter().cloned())
}
#[inline]
fn resize(&mut self, len: usize, value: A::Item) {
assert!(len <= self.capacity());
let old_len = self.len();
if len > old_len {
self.extend(iter::repeat(value).take(len - old_len));
} else {
self.truncate(len);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_insert_many() {
type V = arrayvec::ArrayVec<[u8; 8]>;
let mut v: V = V::new();
for x in 0..4 {
v.push(x);
}
assert_eq!(v.len(), 4);
v.insert_many(1, [5, 6].iter().cloned());
assert_eq!(&v[..], &[0, 5, 6, 1, 2, 3]);
}
#[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]);
}
}