mod test;
use core::fmt;
use core::hash::{Hash, Hasher};
use core::marker::PhantomData;
use core::ops::{self, Index, IndexMut};
use core::slice::{self, SliceIndex};
use std::collections::TryReserveError;
use std::mem::MaybeUninit;
use std::vec::Drain;
use delegate::delegate;
use std::cmp::Ordering;
use std::ops::RangeBounds;
pub trait IndexLike {
fn to_index(&self) -> usize;
fn from_index(i: usize) -> Self;
}
#[derive(Eq, PartialEq)]
pub struct KeyedVec<K: IndexLike, T> {
phantom_for_k: PhantomData<K>, vec: Vec<T>,
}
impl<K: IndexLike, T> KeyedVec<K, T> {
pub const fn new() -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: PhantomData,
vec: Vec::new(),
}
}
pub fn with_capacity(capacity: usize) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: PhantomData,
vec: Vec::with_capacity(capacity),
}
}
pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: PhantomData,
vec: Vec::from_raw_parts(ptr, length, capacity),
}
}
}
impl<K: IndexLike, T> KeyedVec<K, T> {
#[inline]
pub fn enumerate(&self) -> impl Iterator<Item = (K, &T)> {
self.vec.iter().enumerate().map(|(i, e)| (K::from_index(i), e))
}
}
impl<K: IndexLike, T> KeyedVec<K, T> {
delegate! {
to self.vec {
pub fn capacity(&self) -> usize;
pub fn reserve(&mut self, additional: usize);
pub fn reserve_exact(&mut self, additional: usize);
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>;
pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError>;
pub fn shrink_to_fit(&mut self);
pub fn shrink_to(&mut self, min_capacity: usize);
pub fn truncate(&mut self, len: usize);
pub fn as_slice(&self) -> &[T];
pub fn as_mut_slice(&mut self) -> &mut [T];
pub fn as_ptr(&self) -> *const T;
pub fn as_mut_ptr(&mut self) -> *mut T;
pub unsafe fn set_len(&mut self, new_len: usize);
pub fn swap_remove(&mut self, index: usize) -> T;
pub fn insert(&mut self, index: usize, element: T);
pub fn remove(&mut self, index: usize) -> T;
pub fn retain<F: FnMut(&T) -> bool>(&mut self, f: F);
pub fn retain_mut<F: FnMut(&mut T) -> bool>(&mut self, f: F);
pub fn dedup_by<F: FnMut(&mut T, &mut T) -> bool>(&mut self, same_bucket: F);
pub fn pop(&mut self) -> Option<T>;
pub fn drain<R: RangeBounds<usize>>(&mut self, range: R) -> Drain<'_, T>;
pub fn clear(&mut self);
pub fn len(&self) -> usize;
pub fn is_empty(&self) -> bool;
pub fn resize_with<F: FnMut() -> T>(&mut self, new_len: usize, f: F);
pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>];
}
}
#[inline]
pub fn append(&mut self, other: &mut Self) {
self.vec.append(&mut other.vec)
}
#[inline]
pub fn push(&mut self, value: T) -> K {
self.vec.push(value);
K::from_index(self.vec.len() - 1)
}
#[inline]
#[must_use]
pub fn get(&self, index: K) -> Option<&T> {
self.vec.get(index.to_index())
}
#[inline]
#[must_use]
pub fn get_mut(&mut self, index: K) -> Option<&mut T> {
self.vec.get_mut(index.to_index())
}
}
impl<K: IndexLike, T: Clone> KeyedVec<K, T> {
delegate! {
to self.vec {
pub fn resize(&mut self, new_len: usize, value: T);
pub fn extend_from_slice(&mut self, other: &[T]);
pub fn extend_from_within<R: RangeBounds<usize>>(&mut self, src: R);
}
}
}
trait ExtendWith<T> {
fn next(&mut self) -> T;
fn last(self) -> T;
}
struct ExtendElement<T>(T);
impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
fn next(&mut self) -> T {
self.0.clone()
}
fn last(self) -> T {
self.0
}
}
impl<K: IndexLike, T: PartialEq> KeyedVec<K, T> {
delegate! {
to self.vec {
pub fn dedup(&mut self);
}
}
}
impl<K: IndexLike, T> ops::Deref for KeyedVec<K, T> {
type Target = [T];
delegate! {
to self.vec {
fn deref(&self) -> &[T];
}
}
}
impl<K: IndexLike, T: Clone> Clone for KeyedVec<K, T> {
#[inline]
fn clone(&self) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: Default::default(),
vec: self.vec.clone(),
}
}
#[inline]
fn clone_from(&mut self, other: &KeyedVec<K, T>) {
self.vec.clone_from(&other.vec);
}
}
impl<K: IndexLike, T: Hash> Hash for KeyedVec<K, T> {
fn hash<H: Hasher>(&self, state: &mut H) {
Hash::hash(&**self, state)
}
}
impl<K: IndexLike, T, I: SliceIndex<[T]>> Index<I> for KeyedVec<K, T> {
type Output = I::Output;
delegate! {
to self.vec {
fn index(&self, index: I) -> &Self::Output;
}
}
}
impl<K: IndexLike, T, I: SliceIndex<[T]>> IndexMut<I> for KeyedVec<K, T> {
delegate! {
to self.vec {
fn index_mut(&mut self, index: I) -> &mut Self::Output;
}
}
}
impl<'a, K: IndexLike, T> IntoIterator for &'a KeyedVec<K, T> {
type Item = &'a T;
type IntoIter = slice::Iter<'a, T>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.vec.iter()
}
}
impl<'a, K: IndexLike, T> IntoIterator for &'a mut KeyedVec<K, T> {
type Item = &'a mut T;
type IntoIter = slice::IterMut<'a, T>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.vec.iter_mut()
}
}
impl<K: IndexLike, T> Extend<T> for KeyedVec<K, T> {
#[inline]
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
self.vec.extend(iter)
}
}
impl<K: IndexLike, T> KeyedVec<K, T> {
delegate! {
to self.vec {
pub fn splice<R: RangeBounds<usize>, I: IntoIterator<Item = T>>(&mut self, range: R, replace_with: I);
}
}
}
#[cfg(not(no_global_oom_handling))]
impl<'a, K: IndexLike, T: Copy + 'a> Extend<&'a T> for KeyedVec<K, T> {
delegate! {
to self.vec {
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I);
}
}
}
impl<K: IndexLike + PartialOrd, T: PartialOrd> PartialOrd for KeyedVec<K, T> {
#[inline(always)]
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.vec.partial_cmp(&other.vec)
}
}
impl<K: IndexLike + Ord, T: Ord> Ord for KeyedVec<K, T> {
#[inline(always)]
fn cmp(&self, other: &Self) -> Ordering {
self.vec.cmp(&other.vec)
}
}
impl<K: IndexLike, T> Default for KeyedVec<K, T> {
fn default() -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: Default::default(),
vec: Vec::new(),
}
}
}
impl<K: IndexLike, T: fmt::Debug> fmt::Debug for KeyedVec<K, T> {
delegate! {
to self.vec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
}
}
}
impl<K: IndexLike, T> AsRef<KeyedVec<K, T>> for KeyedVec<K, T> {
fn as_ref(&self) -> &KeyedVec<K, T> {
self
}
}
impl<K: IndexLike, T> AsMut<KeyedVec<K, T>> for KeyedVec<K, T> {
fn as_mut(&mut self) -> &mut KeyedVec<K, T> {
self
}
}
impl<K: IndexLike, T: Clone> From<&[T]> for KeyedVec<K, T> {
#[inline]
fn from(s: &[T]) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: Default::default(),
vec: s.to_vec(),
}
}
}
impl<K: IndexLike, T: Clone> From<&mut [T]> for KeyedVec<K, T> {
#[inline]
fn from(s: &mut [T]) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: Default::default(),
vec: s.to_vec(),
}
}
}
impl<K: IndexLike, T, const N: usize> From<[T; N]> for KeyedVec<K, T> {
#[inline]
fn from(s: [T; N]) -> KeyedVec<K, T> {
KeyedVec {
phantom_for_k: Default::default(),
vec: Vec::from(s),
}
}
}
impl<K: IndexLike, T> From<Box<[T]>> for KeyedVec<K, T> {
#[inline]
fn from(s: Box<[T]>) -> Self {
KeyedVec {
phantom_for_k: Default::default(),
vec: s.into_vec(),
}
}
}