use crate::{DeqMapError as Error, DeqMapResult as Result};
use core::{borrow::Borrow, hash::Hash};
use std::collections::{
hash_map::{Entry, HashMap},
VecDeque,
};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct DeqMap<K: Hash + Eq, V> {
vals: VecDeque<V>,
keys: HashMap<K, usize>,
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
pub fn new() -> DeqMap<K, V> {
DeqMap {
vals: VecDeque::default(),
keys: HashMap::default(),
}
}
pub fn from_array<const N: usize>(arr: [V; N]) -> DeqMap<K, V> {
DeqMap {
vals: VecDeque::from(arr),
keys: HashMap::default(),
}
}
pub fn from_keyed_array<const N: usize>(arr: [(K, V); N]) -> DeqMap<K, V> {
let mut dm = Self::with_capacity(N, N);
dm.extend_keyed(arr);
dm
}
pub fn from_some_keyed_array<const N: usize>(arr: [(Option<K>, V); N]) -> DeqMap<K, V> {
let mut dm = Self::with_capacity(N, N);
dm.extend_some_keyed(arr);
dm.shrink_keys_to_fit();
dm
}
pub fn from_vec(vec: Vec<V>) -> DeqMap<K, V> {
DeqMap {
vals: VecDeque::from(vec),
keys: HashMap::default(),
}
}
pub fn from_keyed_vec(vec: Vec<(K, V)>) -> DeqMap<K, V> {
let mut dm = Self::with_capacity(vec.len(), vec.len());
dm.extend_keyed(vec);
dm
}
pub fn from_some_keyed_vec(vec: Vec<(Option<K>, V)>) -> DeqMap<K, V> {
let mut dm = Self::with_capacity(vec.len(), vec.len());
dm.extend_some_keyed(vec);
dm.shrink_keys_to_fit();
dm
}
pub fn with_capacity(keys: usize, values: usize) -> DeqMap<K, V> {
DeqMap {
keys: HashMap::with_capacity(keys),
vals: VecDeque::with_capacity(values),
}
}
pub fn with_capacity_values(capacity: usize) -> DeqMap<K, V> {
DeqMap {
keys: HashMap::default(),
vals: VecDeque::with_capacity(capacity),
}
}
#[inline]
pub fn capacity(&self) -> (usize, usize) {
(self.keys.capacity(), self.vals.capacity())
}
#[inline]
pub fn capacity_keys(&self) -> usize {
self.keys.capacity()
}
#[inline]
pub fn capacity_values(&self) -> usize {
self.vals.capacity()
}
#[inline]
pub fn reserve(&mut self, keys: usize, values: usize) {
self.keys.reserve(keys);
self.vals.reserve(values);
}
#[inline]
pub fn reserve_values(&mut self, additional: usize) {
self.vals.reserve(additional);
}
#[inline]
pub fn reserve_keys(&mut self, additional: usize) {
self.keys.reserve(additional);
}
#[inline]
pub fn try_reserve(&mut self, keys: usize, values: usize) -> Result<()> {
self.keys.try_reserve(keys)?;
self.vals.try_reserve(values)?;
Ok(())
}
#[inline]
pub fn try_reserve_values(&mut self, additional: usize) -> Result<()> {
Ok(self.vals.try_reserve(additional)?)
}
#[inline]
pub fn try_reserve_keys(&mut self, additional: usize) -> Result<()> {
Ok(self.keys.try_reserve(additional)?)
}
#[inline]
pub fn shrink_to_fit(&mut self) {
self.vals.shrink_to_fit();
self.keys.shrink_to_fit();
}
#[inline]
pub fn shrink_values_to_fit(&mut self) {
self.vals.shrink_to_fit();
}
#[inline]
pub fn shrink_keys_to_fit(&mut self) {
self.keys.shrink_to_fit();
}
#[inline]
pub fn shrink_to(&mut self, min_capacity: usize) {
self.vals.shrink_to(min_capacity);
self.keys.shrink_to(min_capacity);
}
#[inline]
pub fn shrink_values_to(&mut self, min_capacity: usize) {
self.vals.shrink_to(min_capacity);
}
#[inline]
pub fn shrink_keys_to(&mut self, min_capacity: usize) {
self.keys.shrink_to(min_capacity);
}
#[inline]
pub fn as_slice(&mut self) -> &[V] {
self.vals.make_contiguous();
self.vals.as_slices().0
}
#[inline]
pub fn as_mut_slice(&mut self) -> &mut [V] {
self.vals.make_contiguous()
}
#[inline]
pub fn as_vec_with_keys(&self) -> Vec<(Option<&K>, &V)> {
self.iter_with_keys().collect()
}
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
#[inline]
pub fn len(&self) -> (usize, usize) {
(self.keys.len(), self.vals.len())
}
#[inline]
pub fn len_values(&self) -> usize {
self.vals.len()
}
#[inline]
pub fn len_keys(&self) -> usize {
self.keys.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.vals.is_empty()
}
#[inline]
pub fn has_no_keys(&self) -> bool {
self.keys.is_empty()
}
#[inline]
pub fn back_index(&self) -> Option<usize> {
let len = self.vals.len();
if len > 0 {
Some(len - 1)
} else {
None
}
}
#[inline]
pub fn clear(&mut self) {
self.vals.clear();
self.keys.clear();
}
#[inline]
pub fn clear_keys(&mut self) {
self.keys.clear();
}
#[inline]
pub fn front(&self) -> Option<&V> {
self.vals.front()
}
#[inline]
pub fn front_mut(&mut self) -> Option<&mut V> {
self.vals.front_mut()
}
#[inline]
pub fn front_with_key(&self) -> Option<(Option<&K>, &V)> {
self.get_with_key(0).ok()
}
#[inline]
pub fn front_mut_with_key(&mut self) -> Option<(Option<&K>, &mut V)> {
self.get_mut_with_key(0).ok()
}
#[inline]
pub fn back(&self) -> Option<&V> {
self.vals.back()
}
#[inline]
pub fn back_mut(&mut self) -> Option<&mut V> {
self.vals.back_mut()
}
#[inline]
pub fn back_with_key(&self) -> Option<(Option<&K>, &V)> {
self.get_with_key(self.back_index()?).ok()
}
#[inline]
pub fn back_mut_with_key(&mut self) -> Option<(Option<&K>, &mut V)> {
self.get_mut_with_key(self.back_index()?).ok()
}
#[inline]
pub fn pop_front(&mut self) -> Option<V> {
self.keys.retain(|_, v| {
if *v == 0 {
false
} else {
*v -= 1;
true
}
});
self.vals.pop_front()
}
#[inline]
pub fn pop_front_with_key(&mut self) -> Option<(Option<K>, V)>
where
K: Clone,
{
const IDX: usize = 0;
let key = self.find_key(IDX).cloned();
self.keys.retain(|_, v| {
if *v == IDX {
false
} else {
*v -= 1;
true
}
});
self.vals.pop_front().map(|v| (key, v))
}
#[inline]
pub fn pop_back(&mut self) -> Option<V> {
let idx = self.back_index()?;
self.keys.retain(|_, v| *v != idx);
self.vals.pop_back()
}
#[inline]
pub fn pop_back_with_key(&mut self) -> Option<(Option<K>, V)>
where
K: Clone,
{
let idx = self.back_index()?;
let key = self.find_key(idx).cloned();
if let Some(ref k) = key {
self.keys.remove_entry(k);
};
self.vals.pop_back().map(|v| (key, v))
}
#[inline]
pub fn push_front(&mut self, value: V) {
self.vals.push_front(value);
self.keys.iter_mut().for_each(|(_k, v)| *v += 1);
}
#[inline]
pub fn push_back(&mut self, value: V) -> usize {
self.vals.push_back(value);
self.vals.len() - 1
}
#[inline]
pub fn insert_front(&mut self, key: K, value: V) -> Option<&V> {
if let Some(idx) = self.keys.get(&key) {
self.vals.get(*idx)
} else {
self.vals.push_front(value);
self.keys.insert(key, 0);
self.keys.iter_mut().for_each(|(_, i)| *i += 1);
None
}
}
#[inline]
pub fn insert_back(&mut self, key: K, value: V) -> Option<&V> {
if let Some(idx) = self.keys.get(&key) {
self.vals.get(*idx)
} else {
self.vals.push_back(value);
self.keys.insert(key, self.vals.len() - 1);
None
}
}
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
#[inline]
pub fn contains_key<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
self.keys.contains_key(key)
}
#[inline]
pub fn get_index<Q>(&self, key: &Q) -> Option<usize>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
self.keys.get(key).copied()
}
#[inline]
pub fn get_keyed<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
if let Some(idx) = self.keys.get(key) {
self.vals.get(*idx)
} else {
None
}
}
#[inline]
pub fn get_mut_keyed<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
if let Some(idx) = self.keys.get(key) {
self.vals.get_mut(*idx)
} else {
None
}
}
pub fn reset_key<Q>(&mut self, old_key: &Q, new_key: K) -> Result<bool>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
if self.contains_key(new_key.borrow()) {
Err(Error::KeyAlreadyExists)
} else if let Some(v) = self.keys.remove(old_key) {
self.keys.insert(new_key, v);
Ok(true)
} else {
Ok(false)
}
}
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
#[inline]
pub fn is_at(&self, index: usize) -> bool {
self.len_values() > index
}
#[inline]
pub fn is_keyed_at(&self, index: usize) -> bool {
self.keys.iter().any(|(_k, &i)| i == index)
}
#[inline]
pub fn get(&self, index: usize) -> Result<&V> {
self.vals.get(index).ok_or(Error::IndexOutOfBounds)
}
#[inline]
pub fn get_mut(&mut self, index: usize) -> Result<&mut V> {
self.vals.get_mut(index).ok_or(Error::IndexOutOfBounds)
}
#[inline]
pub fn get_with_key(&self, index: usize) -> Result<(Option<&K>, &V)> {
if let Some(value) = self.vals.get(index) {
let key = self.find_key(index);
Ok((key, value))
} else {
Err(Error::IndexOutOfBounds)
}
}
#[inline]
pub fn get_mut_with_key(&mut self, index: usize) -> Result<(Option<&K>, &mut V)> {
if let Some(value) = self.vals.get_mut(index) {
let key = self
.keys
.iter_mut()
.find_map(|(key, &mut idx)| if idx == index { Some(key) } else { None });
Ok((key, value))
} else {
Err(Error::IndexOutOfBounds)
}
}
#[inline]
pub fn find_key(&self, index: usize) -> Option<&K> {
self.keys
.iter()
.find_map(|(key, &i)| if i == index { Some(key) } else { None })
}
#[inline]
pub fn find_key_value(&self, index: usize) -> Option<(&K, &V)> {
self.keys.iter().find_map(|(key, &i)| {
if i == index {
self.vals.get(i).map(|v| (key, v))
} else {
None
}
})
}
#[inline]
pub fn find_mut_key_value(&mut self, index: usize) -> Option<(&K, &mut V)> {
if let Some(key) =
self.keys
.iter_mut()
.find_map(|(key, &mut idx)| if idx == index { Some(key) } else { None })
{
let value = self.vals.get_mut(index).unwrap();
Some((key, value))
} else {
None
}
}
#[inline]
pub fn push_at(&mut self, index: usize, value: V) -> Result<()> {
if index < self.len_values() {
self.push_at_unchecked(index, value);
Ok(())
} else {
Err(Error::IndexOutOfBounds)
}
}
#[inline]
pub fn push_at_unchecked(&mut self, index: usize, value: V) {
self.vals.insert(index, value);
self.keys.iter_mut().for_each(|(_, i)| {
if *i >= index {
*i += 1
}
});
}
#[inline]
pub fn insert_at(&mut self, index: usize, key: K, value: V) -> Result<Option<&V>> {
if index < self.len_values() {
Ok(self.insert_at_unchecked(index, key, value))
} else {
Err(Error::IndexOutOfBounds)
}
}
#[inline]
pub fn insert_at_unchecked(&mut self, index: usize, key: K, value: V) -> Option<&V> {
if let Some(idx) = self.keys.get(&key) {
self.vals.get(*idx)
} else {
self.vals.insert(index, value);
self.keys.iter_mut().for_each(|(_, i)| {
if *i >= index {
*i += 1
}
});
self.keys.insert(key, index);
None
}
}
#[inline]
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&V) -> bool,
{
self.retain_mut(|elem| f(elem));
}
pub fn retain_mut<F>(&mut self, mut f: F)
where
F: FnMut(&mut V) -> bool,
{
let mut mapretain = vec![];
let mut mapchange = vec![];
let len = self.vals.len();
let mut idx = 0;
let mut cur = 0;
while cur < len {
if !f(&mut self.vals[cur]) {
cur += 1;
break;
}
cur += 1;
idx += 1;
}
while cur < len {
if !f(&mut self.vals[cur]) {
cur += 1;
continue;
}
mapretain.push(cur);
mapchange.push((cur, idx));
self.vals.swap(idx, cur);
cur += 1;
idx += 1;
}
if cur != idx {
self.vals.truncate(idx);
}
self.keys.retain(|_, &mut ival| {
if let Some(idx) = mapretain.iter().position(|e| e == &ival) {
mapretain.swap_remove(idx);
true
} else {
false
}
});
self.keys.iter_mut().for_each(|(_k, v)| {
let mut idx = 0;
while idx < mapchange.len() {
let (pre_idx, new_idx) = mapchange[idx];
if *v == pre_idx {
*v = new_idx;
mapchange.swap_remove(idx);
break;
}
idx += 1;
}
});
}
#[inline]
pub fn truncate(&mut self, len: usize) {
if len <= self.vals.len() {
self.vals.truncate(len);
self.keys.retain(|_, v| *v <= len);
}
}
#[inline]
pub fn swap(&mut self, i: usize, j: usize) -> Result<()> {
if i < self.vals.len() && j < self.vals.len() {
self.swap_unchecked(i, j);
Ok(())
} else {
Err(Error::IndexOutOfBounds)
}
}
#[inline]
pub fn swap_unchecked(&mut self, i: usize, j: usize) {
self.vals.swap(i, j);
let mut counter = 2;
for (_, v) in self.keys.iter_mut() {
if *v == i {
*v = j;
counter -= 1;
} else if *v == j {
*v = i;
counter -= 1;
}
if counter == 0 {
break;
}
}
}
pub fn swap_remove_front(&mut self, index: usize) -> Result<V>
where
V: core::fmt::Debug,
K: core::fmt::Debug,
{
let value = self
.vals
.swap_remove_front(index)
.ok_or(Error::IndexOutOfBounds)?;
self.keys.retain(|_k, ival| {
if *ival == index {
false
} else if *ival == 0 {
*ival = index - 1;
true
} else {
*ival -= 1;
true
}
});
Ok(value)
}
pub fn swap_remove_back(&mut self, index: usize) -> Result<V> {
let back_idx = self.back_index().ok_or(Error::IndexOutOfBounds)?;
let value = self
.vals
.swap_remove_back(index)
.ok_or(Error::IndexOutOfBounds)?;
self.keys.retain(|_, ival| {
if *ival == index {
false
} else if *ival == back_idx {
*ival = index;
true
} else {
true
}
});
Ok(value)
}
pub fn set_key(&mut self, index: usize, key: K) -> Result<Option<K>>
where
K: Clone,
{
if self.contains_key(&key) {
Err(Error::KeyAlreadyExists)
} else if index >= self.vals.len() {
Err(Error::IndexOutOfBounds)
} else {
let old_key = self.find_key(index).cloned();
if let Some(ref k) = old_key {
self.keys.remove(k.borrow());
};
self.keys.insert(key, index);
Ok(old_key)
}
}
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
pub fn contains(&self, value: &V) -> bool
where
V: PartialEq,
{
self.vals.contains(value)
}
#[inline]
pub fn extend<I>(&mut self, iterator: I)
where
I: IntoIterator<Item = V>,
{
self.vals.extend(iterator);
}
pub fn extend_keyed<I>(&mut self, iterator: I)
where
I: IntoIterator<Item = (K, V)>,
{
let (keys, values): (Vec<_>, Vec<_>) = iterator.into_iter().unzip();
let mut index = self.vals.len();
for (k, v) in keys.into_iter().zip(values) {
match self.keys.entry(k) {
Entry::Occupied(_) => self.vals[index] = v,
Entry::Vacant(e) => {
e.insert(index);
self.vals.push_back(v);
index += 1;
}
}
}
}
pub fn extend_some_keyed<I>(&mut self, iterator: I)
where
I: IntoIterator<Item = (Option<K>, V)>,
{
let (keys, values): (Vec<_>, Vec<_>) = iterator.into_iter().unzip();
let mut index = self.vals.len();
for (some_k, v) in keys.into_iter().zip(values) {
if let Some(k) = some_k {
match self.keys.entry(k) {
Entry::Occupied(_) => self.vals[index] = v,
Entry::Vacant(e) => {
e.insert(index);
self.vals.push_back(v);
index += 1;
}
}
} else {
self.vals.push_back(v);
index += 1;
}
}
}
}
impl<K: Hash + Eq, V> DeqMap<K, V> {
#[inline]
pub fn iter(&self) -> impl Iterator<Item = &V> {
self.vals.iter()
}
#[inline]
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut V> {
self.vals.iter_mut()
}
#[inline]
pub fn iter_keyed(&self) -> impl Iterator<Item = (&K, &V)> {
self.keys
.iter()
.map(|(k, idx)| (k, self.vals.get(*idx).unwrap()))
}
#[inline]
pub fn iter_with_keys(&self) -> DeqMapIter<'_, K, V> {
DeqMapIter { dm: self, idx: 0 }
}
}
impl<K, V> FromIterator<V> for DeqMap<K, V>
where
K: Hash + Eq,
{
fn from_iter<I: IntoIterator<Item = V>>(iter: I) -> Self {
let mut dm = DeqMap::new();
dm.extend(iter);
dm
}
}
impl<K, V> FromIterator<(K, V)> for DeqMap<K, V>
where
K: Hash + Eq,
{
fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
let mut dm = DeqMap::new();
dm.extend_keyed(iter);
dm
}
}
pub struct DeqMapIter<'dm, K, V>
where
K: Hash + Eq,
{
idx: usize,
dm: &'dm DeqMap<K, V>,
}
impl<'dm, K, V> Iterator for DeqMapIter<'dm, K, V>
where
K: Hash + Eq,
{
type Item = (Option<&'dm K>, &'dm V);
fn next(&mut self) -> Option<Self::Item> {
if self.dm.vals.get(self.idx).is_some() {
self.idx += 1;
self.dm.get_with_key(self.idx - 1).ok()
} else {
None
}
}
}
impl<K: Hash + Eq, V, const N: usize> From<[V; N]> for DeqMap<K, V> {
fn from(arr: [V; N]) -> Self {
DeqMap::from_array(arr)
}
}
impl<K: Hash + Eq, V, const N: usize> From<[(K, V); N]> for DeqMap<K, V> {
fn from(arr: [(K, V); N]) -> Self {
DeqMap::from_keyed_array(arr)
}
}
impl<K: Hash + Eq, V, const N: usize> From<[(Option<K>, V); N]> for DeqMap<K, V> {
fn from(arr: [(Option<K>, V); N]) -> Self {
DeqMap::from_some_keyed_array(arr)
}
}
impl<K: Hash + Eq, V> From<Vec<V>> for DeqMap<K, V> {
fn from(vec: Vec<V>) -> Self {
DeqMap::from_vec(vec)
}
}
impl<K: Hash + Eq, V> From<Vec<(K, V)>> for DeqMap<K, V> {
fn from(vec: Vec<(K, V)>) -> Self {
DeqMap::from_keyed_vec(vec)
}
}
impl<K: Hash + Eq, V> From<Vec<(Option<K>, V)>> for DeqMap<K, V> {
fn from(vec: Vec<(Option<K>, V)>) -> Self {
DeqMap::from_some_keyed_vec(vec)
}
}