bumpish 0.4.1

A set of collections using bump allocations
Documentation
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, {}>);