use super::bucket::Bucket;
use super::inner::Entries;
use crate::raw;
use crate::util::{impl_deiter, impl_iter};
pub struct Iter<'a, K, V> {
raw_iter: raw::IterPtr<'a, Bucket<K, V>, 0>,
}
impl<'a, K, V> Iter<'a, K, V> {
pub(super) fn new(entries: &'a Entries<K, V>) -> Self {
Self {
raw_iter: entries.iter(),
}
}
}
impl_iter!(|ptr| unsafe { ptr.as_ref().as_tuple() }, Iter<'a, K, V, {}> => (&'a K, &'a V));
impl_deiter!(|ptr| unsafe { ptr.as_ref().as_tuple() }, Iter<'a, K, V, {}>);
pub struct IterMut<'a, K, V> {
raw_iter: raw::IterPtr<'a, Bucket<K, V>, 0>,
}
impl<'a, K, V> IterMut<'a, K, V> {
pub(super) fn new(entries: &'a mut Entries<K, V>) -> Self {
Self {
raw_iter: entries.iter(),
}
}
}
impl_iter!(|mut ptr| unsafe { ptr.as_mut().as_tuple_mut() }, IterMut<'a, K, V, {}> => (&'a K, &'a mut V));
impl_deiter!(
|mut ptr| unsafe { ptr.as_mut().as_tuple_mut() },
IterMut<'a, K, V, {}>
);
pub struct Keys<'a, K, V> {
raw_iter: raw::IterPtr<'a, Bucket<K, V>, 0>,
}
impl<'a, K, V> Keys<'a, K, V> {
pub(super) fn new(entries: &'a Entries<K, V>) -> Self {
Self {
raw_iter: entries.iter(),
}
}
}
impl_iter!(|ptr| unsafe { ptr.as_ref().as_key() }, Keys<'a, K, V, {}> => &'a K);
impl_deiter!(|ptr| unsafe { ptr.as_ref().as_key() }, Keys<'a, K, V, {}>);
pub struct Values<'a, K, V> {
raw_iter: raw::IterPtr<'a, Bucket<K, V>, 0>,
}
impl<'a, K, V> Values<'a, K, V> {
pub(super) fn new(entries: &'a Entries<K, V>) -> Self {
Self {
raw_iter: entries.iter(),
}
}
}
impl_iter!(|ptr| unsafe { ptr.as_ref().as_value() }, Values<'a, K, V, {}> => &'a V);
impl_deiter!(
|ptr| unsafe { ptr.as_ref().as_value() },
Values<'a, K, V, {}>
);
pub struct ValuesMut<'a, K, V> {
raw_iter: raw::IterPtr<'a, Bucket<K, V>, 0>,
}
impl<'a, K, V> ValuesMut<'a, K, V> {
pub(super) fn new(entries: &'a mut Entries<K, V>) -> Self {
Self {
raw_iter: entries.iter(),
}
}
}
impl_iter!(|mut ptr| unsafe { ptr.as_mut().as_value_mut() }, ValuesMut<'a, K, V, {}> => &'a mut V);
impl_deiter!(
|mut ptr| unsafe { ptr.as_mut().as_value_mut() },
ValuesMut<'a, K, V, {}>
);
pub struct IntoIter<K, V> {
raw_iter: raw::IntoIter<Bucket<K, V>, 0>,
}
impl<K, V> IntoIter<K, V> {
pub(super) fn new(entries: Entries<K, V>) -> Self {
Self {
raw_iter: entries.into_iter(),
}
}
}
impl_iter!(Bucket::into_tuple, IntoIter<K, V, {}> => (K, V));
impl_deiter!(Bucket::into_tuple, IntoIter<K, V, {}>);