iddqd/bi_hash_map/
iter.rs1use super::{RefMut, tables::BiHashMapTables};
2use crate::{
3 BiHashItem, DefaultHashBuilder,
4 support::{
5 alloc::{Allocator, Global},
6 item_set::{self, ItemSet},
7 },
8};
9use core::{hash::BuildHasher, iter::FusedIterator};
10
11#[derive(Clone, Debug, Default)]
21pub struct Iter<'a, T: BiHashItem> {
22 inner: item_set::Values<'a, T>,
23}
24
25impl<'a, T: BiHashItem> 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: BiHashItem> 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: BiHashItem> ExactSizeIterator for Iter<'_, T> {
41 #[inline]
42 fn len(&self) -> usize {
43 self.inner.len()
44 }
45}
46
47impl<T: BiHashItem> FusedIterator for Iter<'_, T> {}
48
49#[derive(Debug)]
61pub struct IterMut<
62 'a,
63 T: BiHashItem,
64 S = DefaultHashBuilder,
65 A: Allocator = Global,
66> {
67 tables: &'a BiHashMapTables<S, A>,
68 inner: item_set::ValuesMut<'a, T>,
69}
70
71impl<'a, T: BiHashItem, S: Clone + BuildHasher, A: Allocator>
72 IterMut<'a, T, S, A>
73{
74 pub(super) fn new(
75 tables: &'a BiHashMapTables<S, A>,
76 items: &'a mut ItemSet<T, A>,
77 ) -> Self {
78 Self { tables, inner: items.values_mut() }
79 }
80}
81
82impl<'a, T: BiHashItem, 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::<T>(&next.key1(), &next.key2());
91 Some(RefMut::new(self.tables.state.clone(), hashes, next))
92 }
93}
94
95impl<T: BiHashItem, 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: BiHashItem, S: Clone + BuildHasher, A: Allocator> FusedIterator
105 for IterMut<'_, T, S, A>
106{
107}
108
109#[derive(Debug)]
119pub struct IntoIter<T: BiHashItem, A: Allocator = Global> {
120 inner: item_set::IntoValues<T, A>,
121}
122
123impl<T: BiHashItem, 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: BiHashItem, 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: BiHashItem, A: Allocator> ExactSizeIterator for IntoIter<T, A> {
139 #[inline]
140 fn len(&self) -> usize {
141 self.inner.len()
142 }
143}
144
145impl<T: BiHashItem, A: Allocator> FusedIterator for IntoIter<T, A> {}