use slab::Slab;
use std::ptr;
use std::time::Instant;
use crate::store::decorator::ordered;
use crate::store::item::{Key, Value};
use crate::store::{
StoreIterable, StoreIterableMut, StoreKeys, StoreMut, StoreValues,
};
use super::item::Item;
use super::Queue;
#[derive(Debug)]
pub struct Iter<'a, K, V>
where
K: Key,
{
inner: ordered::Iter<'a, K, Item>,
items: &'a Slab<V>,
deadline: Instant,
}
pub struct IterMut<'a, K, V>
where
K: Key,
{
inner: ordered::Iter<'a, K, Item>,
items: &'a mut Slab<V>,
deadline: Instant,
}
pub struct Keys<'a, K>
where
K: Key,
{
inner: ordered::Iter<'a, K, Item>,
deadline: Instant,
}
pub struct Values<'a, K, V>
where
K: Key,
{
inner: ordered::Values<'a, K, Item>,
items: &'a Slab<V>,
deadline: Instant,
}
impl<K, V, S> StoreIterable<K, V> for Queue<K, V, S>
where
K: Key,
V: Value,
S: StoreIterable<K, Item>,
{
type Iter<'a> = Iter<'a, K, V>
where
Self: 'a;
#[inline]
fn iter(&self) -> Self::Iter<'_> {
Iter {
inner: self.store.iter(),
items: &self.items,
deadline: Instant::now(),
}
}
}
impl<K, V, S> StoreIterableMut<K, V> for Queue<K, V, S>
where
K: Key,
V: Value,
S: StoreMut<K, Item> + StoreIterable<K, Item>,
{
type IterMut<'a> = IterMut<'a, K, V>
where
Self: 'a;
#[inline]
fn iter_mut(&mut self) -> Self::IterMut<'_> {
IterMut {
inner: self.store.iter(),
items: &mut self.items,
deadline: Instant::now(),
}
}
}
impl<K, V, S> StoreKeys<K, V> for Queue<K, V, S>
where
K: Key,
S: StoreIterable<K, Item>,
{
type Keys<'a> = Keys<'a, K>
where
Self: 'a;
#[inline]
fn keys(&self) -> Self::Keys<'_> {
Keys {
inner: self.store.iter(),
deadline: Instant::now(),
}
}
}
impl<K, V, S> StoreValues<K, V> for Queue<K, V, S>
where
K: Key,
V: Value,
S: StoreValues<K, Item>,
{
type Values<'a> = Values<'a, K, V>
where
Self: 'a;
#[inline]
fn values(&self) -> Self::Values<'_> {
Values {
inner: self.store.values(),
items: &self.items,
deadline: Instant::now(),
}
}
}
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.find_map(|(key, item)| {
(item.deadline() <= self.deadline)
.then(|| (key, &self.items[*item.data()]))
})
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
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> {
let items = ptr::addr_of_mut!(*self.items);
self.inner.find_map(|(key, item)| {
(item.deadline() <= self.deadline)
.then(|| (key, unsafe { &mut (&mut *items)[*item.data()] }))
})
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<'a, K> Iterator for Keys<'a, K>
where
K: Key,
{
type Item = &'a K;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.find_map(|(key, item)| {
(item.deadline() <= self.deadline).then_some(key)
})
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
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.find_map(|item| {
(item.deadline() <= self.deadline)
.then(|| &self.items[*item.data()])
})
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}