Skip to main content

iddqd/tri_hash_map/
iter.rs

1use super::{RefMut, tables::TriHashMapTables};
2use crate::{
3    DefaultHashBuilder, TriHashItem,
4    support::{
5        alloc::{Allocator, Global},
6        item_set::{self, ItemSet},
7    },
8};
9use core::{hash::BuildHasher, iter::FusedIterator};
10
11/// An iterator over the elements of a [`TriHashMap`] by shared reference.
12/// Created by [`TriHashMap::iter`].
13///
14/// Similar to [`HashMap`], the iteration order is arbitrary and not guaranteed
15/// to be stable.
16///
17/// [`TriHashMap`]: crate::TriHashMap
18/// [`TriHashMap::iter`]: crate::TriHashMap::iter
19/// [`HashMap`]: std::collections::HashMap
20#[derive(Clone, Debug, Default)]
21pub struct Iter<'a, T: TriHashItem> {
22    inner: item_set::Values<'a, T>,
23}
24
25impl<'a, T: TriHashItem> Iter<'a, T> {
26    pub(crate) fn new<A: Allocator>(items: &'a ItemSet<T, A>) -> Self {
27        Self { inner: items.values() }
28    }
29}
30
31impl<'a, T: TriHashItem> Iterator for Iter<'a, T> {
32    type Item = &'a T;
33
34    #[inline]
35    fn next(&mut self) -> Option<Self::Item> {
36        self.inner.next()
37    }
38}
39
40impl<T: TriHashItem> ExactSizeIterator for Iter<'_, T> {
41    #[inline]
42    fn len(&self) -> usize {
43        self.inner.len()
44    }
45}
46
47impl<T: TriHashItem> FusedIterator for Iter<'_, T> {}
48
49/// An iterator over the elements of a [`TriHashMap`] by mutable reference.
50/// Created by [`TriHashMap::iter_mut`].
51///
52/// This iterator returns [`RefMut`] instances.
53///
54/// Similar to [`HashMap`], the iteration order is arbitrary and not guaranteed
55/// to be stable.
56///
57/// [`TriHashMap`]: crate::TriHashMap
58/// [`TriHashMap::iter_mut`]: crate::TriHashMap::iter_mut
59/// [`HashMap`]: std::collections::HashMap
60#[derive(Debug)]
61pub struct IterMut<
62    'a,
63    T: TriHashItem,
64    S: Clone + BuildHasher = DefaultHashBuilder,
65    A: Allocator = Global,
66> {
67    tables: &'a TriHashMapTables<S, A>,
68    inner: item_set::ValuesMut<'a, T>,
69}
70
71impl<'a, T: TriHashItem, S: Clone + BuildHasher, A: Allocator>
72    IterMut<'a, T, S, A>
73{
74    pub(super) fn new(
75        tables: &'a TriHashMapTables<S, A>,
76        items: &'a mut ItemSet<T, A>,
77    ) -> Self {
78        Self { tables, inner: items.values_mut() }
79    }
80}
81
82impl<'a, T: TriHashItem, S: Clone + BuildHasher, A: Allocator> Iterator
83    for IterMut<'a, T, S, A>
84{
85    type Item = RefMut<'a, T, S>;
86
87    #[inline]
88    fn next(&mut self) -> Option<Self::Item> {
89        let next = self.inner.next()?;
90        let hashes = self.tables.make_hashes(next);
91        Some(RefMut::new(self.tables.state.clone(), hashes, next))
92    }
93}
94
95impl<T: TriHashItem, S: Clone + BuildHasher, A: Allocator> ExactSizeIterator
96    for IterMut<'_, T, S, A>
97{
98    #[inline]
99    fn len(&self) -> usize {
100        self.inner.len()
101    }
102}
103
104impl<T: TriHashItem, S: Clone + BuildHasher, A: Allocator> FusedIterator
105    for IterMut<'_, T, S, A>
106{
107}
108
109/// An iterator over the elements of a [`TriHashMap`] by ownership. Created by
110/// [`TriHashMap::into_iter`].
111///
112/// Similar to [`HashMap`], the iteration order is arbitrary and not guaranteed
113/// to be stable.
114///
115/// [`TriHashMap`]: crate::TriHashMap
116/// [`TriHashMap::into_iter`]: crate::TriHashMap::into_iter
117/// [`HashMap`]: std::collections::HashMap
118#[derive(Debug)]
119pub struct IntoIter<T: TriHashItem, A: Allocator = Global> {
120    inner: item_set::IntoValues<T, A>,
121}
122
123impl<T: TriHashItem, A: Allocator> IntoIter<T, A> {
124    pub(crate) fn new(items: ItemSet<T, A>) -> Self {
125        Self { inner: items.into_values() }
126    }
127}
128
129impl<T: TriHashItem, A: Allocator> Iterator for IntoIter<T, A> {
130    type Item = T;
131
132    #[inline]
133    fn next(&mut self) -> Option<Self::Item> {
134        self.inner.next()
135    }
136}
137
138impl<T: TriHashItem, A: Allocator> ExactSizeIterator for IntoIter<T, A> {
139    #[inline]
140    fn len(&self) -> usize {
141        self.inner.len()
142    }
143}
144
145impl<T: TriHashItem, A: Allocator> FusedIterator for IntoIter<T, A> {}