use super::tmo::*;
use std::{fmt, hash::Hash, marker::PhantomData};
pub struct Iter<'a, K, V>
where
K: Eq + Hash,
{
pub(crate) done: usize,
pub(crate) len: usize,
pub(crate) next: *const Node<K, V>,
pub(crate) phantom: PhantomData<&'a (K, V)>,
}
impl<'a, K, V> Iterator for Iter<'a, K, V>
where
K: Eq + Hash,
{
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<(&'a K, &'a V)> {
if self.done >= self.len {
return None;
}
unsafe {
let k = &(*(*self.next).key.as_ptr()) as &K;
let v = &(*(*self.next).value.as_ptr()) as &V;
self.next = (*self.next).next;
self.done += 1;
Some((k, v))
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.len - self.done))
}
}
impl<K, V> fmt::Debug for Iter<'_, K, V>
where
K: Eq + Hash + fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.done >= self.len {
write!(f, "Iter [{:?}/{:?}]", self.done, self.len)
} else {
let next = unsafe { &(*(*self.next).key.as_ptr()) };
write!(f, "Iter [{:?}/{:?} next: {:?}]", self.done, self.len, next)
}
}
}
impl<K, V> fmt::Display for Iter<'_, K, V>
where
K: Eq + Hash + fmt::Debug + fmt::Display,
V: fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.done >= self.len {
write!(f, "Iter [{}/{}]", self.done, self.len)
} else {
let next = unsafe { &(*(*self.next).key.as_ptr()) };
write!(f, "Iter [{}/{} next: {}]", self.done, self.len, next)
}
}
}