use crate::CapacityState;
use core::{
cmp::Ordering,
ops::{Index, IndexMut, RangeBounds},
};
use orx_iterable::{Collection, CollectionMut};
use orx_pseudo_default::PseudoDefault;
pub trait PinnedVec<T>:
IntoIterator<Item = T>
+ Collection<Item = T>
+ CollectionMut<Item = T>
+ PseudoDefault
+ Index<usize, Output = T>
+ IndexMut<usize, Output = T>
{
type IterRev<'a>: Iterator<Item = &'a T>
where
T: 'a,
Self: 'a;
type IterMutRev<'a>: Iterator<Item = &'a mut T>
where
T: 'a,
Self: 'a;
type SliceIter<'a>: IntoIterator<Item = &'a [T]> + Default
where
T: 'a,
Self: 'a;
type SliceMutIter<'a>: IntoIterator<Item = &'a mut [T]> + Default
where
T: 'a,
Self: 'a;
fn index_of(&self, element: &T) -> Option<usize>;
fn index_of_ptr(&self, element_ptr: *const T) -> Option<usize>;
fn push_get_ptr(&mut self, value: T) -> *const T;
unsafe fn iter_ptr<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
where
T: 'i;
unsafe fn iter_ptr_rev<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
where
T: 'i;
fn contains_reference(&self, element: &T) -> bool;
fn contains_ptr(&self, element_ptr: *const T) -> bool;
fn clear(&mut self);
fn capacity(&self) -> usize;
fn capacity_state(&self) -> CapacityState;
fn extend_from_slice(&mut self, other: &[T])
where
T: Clone;
unsafe fn extend_from_nonoverlapping(&mut self, src: *const T, count: usize);
fn get(&self, index: usize) -> Option<&T>;
fn get_mut(&mut self, index: usize) -> Option<&mut T>;
unsafe fn get_unchecked(&self, index: usize) -> &T;
unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T;
fn first(&self) -> Option<&T>;
fn last(&self) -> Option<&T>;
unsafe fn first_unchecked(&self) -> &T;
unsafe fn last_unchecked(&self) -> &T;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn len(&self) -> usize;
fn push(&mut self, value: T);
fn insert(&mut self, index: usize, element: T);
fn remove(&mut self, index: usize) -> T;
fn pop(&mut self) -> Option<T>;
fn swap(&mut self, a: usize, b: usize);
fn truncate(&mut self, len: usize);
fn iter_rev(&self) -> Self::IterRev<'_>;
fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_>;
fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_>;
fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_>;
fn iter_over<'a>(
&'a self,
range: impl RangeBounds<usize>,
) -> impl ExactSizeIterator<Item = &'a T>
where
T: 'a;
fn iter_mut_over<'a>(
&'a mut self,
range: impl RangeBounds<usize>,
) -> impl ExactSizeIterator<Item = &'a mut T>
where
T: 'a;
fn get_ptr(&self, index: usize) -> Option<*const T>;
fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T>;
unsafe fn set_len(&mut self, new_len: usize);
fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
where
F: FnMut(&T) -> Ordering;
fn binary_search(&self, search_value: &T) -> Result<usize, usize>
where
T: Ord,
{
self.binary_search_by(|p| p.cmp(search_value))
}
fn binary_search_by_key<B, F>(&self, b: &B, mut f: F) -> Result<usize, usize>
where
F: FnMut(&T) -> B,
B: Ord,
{
self.binary_search_by(|k| f(k).cmp(b))
}
fn sort(&mut self)
where
T: Ord;
fn sort_by<F>(&mut self, compare: F)
where
F: FnMut(&T, &T) -> Ordering;
fn sort_by_key<K, F>(&mut self, f: F)
where
F: FnMut(&T) -> K,
K: Ord;
fn capacity_bound(&self) -> usize;
}
#[cfg(test)]
mod tests {
use crate::{PinnedVec, pinned_vec_tests::testvec::TestVec};
#[test]
fn is_empty() {
let mut vec = TestVec::new(5);
assert!(vec.is_empty());
vec.push(1);
assert!(!vec.is_empty());
vec.push(2);
vec.push(3);
assert!(!vec.is_empty());
vec.clear();
assert!(vec.is_empty());
}
}