use slab::Slab;
use crate::store::item::{Key, Value};
use crate::store::{StoreIterable, StoreIterableMut, StoreKeys, StoreValues};
#[derive(Debug)]
pub struct Iter<'a, K, V> {
inner: slab::Iter<'a, (K, V)>,
}
#[derive(Debug)]
pub struct IterMut<'a, K, V> {
inner: slab::IterMut<'a, (K, V)>,
}
#[derive(Debug)]
pub struct Keys<'a, K, V> {
inner: slab::Iter<'a, (K, V)>,
}
#[derive(Debug)]
pub struct Values<'a, K, V> {
inner: slab::Iter<'a, (K, V)>,
}
impl<K, V> StoreIterable<K, V> for Slab<(K, V)>
where
K: Key,
V: Value,
{
type Iter<'a> = Iter<'a, K, V>
where
Self: 'a;
#[inline]
fn iter(&self) -> Self::Iter<'_> {
Iter { inner: Slab::iter(self) }
}
}
impl<K, V> StoreIterableMut<K, V> for Slab<(K, V)>
where
K: Key,
V: Value,
{
type IterMut<'a> = IterMut<'a, K, V>
where
Self: 'a;
#[inline]
fn iter_mut(&mut self) -> Self::IterMut<'_> {
IterMut { inner: Slab::iter_mut(self) }
}
}
impl<K, V> StoreKeys<K, V> for Slab<(K, V)>
where
K: Key,
{
type Keys<'a> = Keys<'a, K, V>
where
Self: 'a;
#[inline]
fn keys(&self) -> Self::Keys<'_> {
Keys { inner: Slab::iter(self) }
}
}
impl<K, V> StoreValues<K, V> for Slab<(K, V)>
where
K: Key,
V: Value,
{
type Values<'a> = Values<'a, K, V>
where
Self: 'a;
#[inline]
fn values(&self) -> Self::Values<'_> {
Values { inner: Slab::iter(self) }
}
}
impl<'a, K, V> Iterator for Iter<'a, K, V>
where
K: Key,
{
type Item = (&'a K, &'a V);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, (key, value))| (key, value))
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> ExactSizeIterator for Iter<'_, K, V>
where
K: Key,
{
#[inline]
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K, V> Iterator for IterMut<'a, K, V>
where
K: Key,
{
type Item = (&'a K, &'a mut V);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, (key, value))| (&*key, value))
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> ExactSizeIterator for IterMut<'_, K, V>
where
K: Key,
{
#[inline]
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K, V> Iterator for Keys<'a, K, V>
where
K: Key,
{
type Item = &'a K;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, (key, _))| key)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> ExactSizeIterator for Keys<'_, K, V>
where
K: Key,
{
#[inline]
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K, V> Iterator for Values<'a, K, V>
where
K: Key,
{
type Item = &'a V;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, (_, value))| value)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> ExactSizeIterator for Values<'_, K, V>
where
K: Key,
{
#[inline]
fn len(&self) -> usize {
self.inner.len()
}
}