clashmap 1.2.1

Sharded hashmap suitable for fast concurrent access
Documentation
use crate::setref::multiple::RefMulti;
use core::hash::Hash;

pub struct OwningIter<K> {
    inner: crate::iter::OwningIter<K, ()>,
}

impl<K: Eq + Hash> OwningIter<K> {
    pub(crate) fn new(inner: crate::iter::OwningIter<K, ()>) -> Self {
        Self { inner }
    }
}

impl<K: Eq + Hash> Iterator for OwningIter<K> {
    type Item = K;

    fn next(&mut self) -> Option<Self::Item> {
        self.inner.next().map(|(k, _)| k)
    }
}

pub struct Iter<'a, K> {
    inner: crate::iter::Iter<'a, K, ()>,
}

impl<K> Clone for Iter<'_, K> {
    fn clone(&self) -> Self {
        Self {
            inner: self.inner.clone(),
        }
    }
}

impl<'a, K: 'a> Iter<'a, K> {
    pub(crate) fn new(inner: crate::iter::Iter<'a, K, ()>) -> Self {
        Self { inner }
    }
}

impl<'a, K: 'a> Iterator for Iter<'a, K> {
    type Item = RefMulti<'a, K>;

    fn next(&mut self) -> Option<Self::Item> {
        self.inner.next().map(RefMulti::new)
    }
}

#[cfg(test)]
mod tests {
    use crate::ClashSet;

    #[test]
    fn into_iter_count() {
        let set = ClashSet::new();

        set.insert("Johnny");
        let c = set.into_iter().count();

        assert_eq!(c, 1);
    }

    #[test]
    fn iter_count() {
        let set = ClashSet::new();

        set.insert("Johnny");

        assert_eq!(set.len(), 1);

        assert_eq!(set.iter().count(), 1);
    }

    #[test]
    fn iter_clone() {
        let set = ClashSet::new();

        set.insert("Johnny");
        set.insert("Chucky");

        let mut iter = set.iter();
        iter.next();

        let iter2 = iter.clone();

        assert_eq!(iter.count(), 1);
        assert_eq!(iter2.count(), 1);
    }
}