1use core::fmt;
2use core::iter::FusedIterator;
3
4pub struct Iter<'a, T> {
11 inner: crate::ordered_map::Iter<'a, T, ()>,
12}
13
14impl<'a, T> Iter<'a, T> {
15 fn return_key(val: (&'a T, &())) -> &'a T {
16 val.0
17 }
18}
19
20impl<T> Clone for Iter<'_, T> {
21 fn clone(&self) -> Self {
22 Self {
23 inner: self.inner.clone(),
24 }
25 }
26}
27
28impl<T> fmt::Debug for Iter<'_, T>
29where
30 T: fmt::Debug,
31{
32 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33 f.debug_list().entries((*self).clone()).finish()
34 }
35}
36
37impl<'a, T> Iterator for Iter<'a, T> {
38 type Item = &'a T;
39
40 #[inline]
41 fn next(&mut self) -> Option<Self::Item> {
42 self.inner.next().map(Self::return_key)
43 }
44
45 #[inline]
46 fn size_hint(&self) -> (usize, Option<usize>) {
47 self.inner.size_hint()
48 }
49}
50
51impl<T> DoubleEndedIterator for Iter<'_, T> {
52 fn next_back(&mut self) -> Option<Self::Item> {
53 self.inner.next_back().map(Self::return_key)
54 }
55}
56
57impl<T> ExactSizeIterator for Iter<'_, T> {}
58
59impl<T> FusedIterator for Iter<'_, T> {}
60
61impl<'a, T, S> IntoIterator for &'a super::OrderedHashSet<T, S> {
62 type Item = &'a T;
63 type IntoIter = Iter<'a, T>;
64
65 fn into_iter(self) -> Self::IntoIter {
66 Self::IntoIter {
67 inner: self.map.iter(),
68 }
69 }
70}
71
72pub struct IntoIter<T> {
79 inner: crate::ordered_map::IntoIter<T, ()>,
80}
81
82impl<T> IntoIter<T> {
83 fn return_key(val: (T, ())) -> T {
84 val.0
85 }
86}
87
88impl<T> IntoIter<T> {
89 fn iter(&self) -> Iter<'_, T> {
90 Iter {
91 inner: self.inner.iter(),
92 }
93 }
94}
95
96impl<T> fmt::Debug for IntoIter<T>
97where
98 T: fmt::Debug,
99{
100 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101 f.debug_list().entries(self.iter()).finish()
102 }
103}
104
105impl<T> Iterator for IntoIter<T> {
106 type Item = T;
107
108 fn next(&mut self) -> Option<Self::Item> {
109 self.inner.next().map(Self::return_key)
110 }
111
112 fn size_hint(&self) -> (usize, Option<usize>) {
113 self.inner.size_hint()
114 }
115}
116
117impl<T> DoubleEndedIterator for IntoIter<T> {
118 fn next_back(&mut self) -> Option<Self::Item> {
119 self.inner.next_back().map(Self::return_key)
120 }
121}
122
123impl<T> ExactSizeIterator for IntoIter<T> {}
124
125impl<T> FusedIterator for IntoIter<T> {}
126
127impl<T, S> IntoIterator for super::OrderedHashSet<T, S> {
128 type Item = T;
129 type IntoIter = IntoIter<T>;
130
131 fn into_iter(self) -> Self::IntoIter {
132 Self::IntoIter {
133 inner: self.map.into_iter(),
134 }
135 }
136}
137
138pub struct Drain<'a, T> {
147 pub(crate) inner: crate::ordered_map::Drain<'a, T, ()>,
148}
149
150impl<T> Drain<'_, T> {
151 fn iter(&self) -> Iter<'_, T> {
152 Iter {
153 inner: self.inner.iter(),
154 }
155 }
156}
157
158impl<T> fmt::Debug for Drain<'_, T>
159where
160 T: fmt::Debug,
161{
162 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
163 f.debug_list().entries(self.iter()).finish()
164 }
165}
166
167impl<T> Iterator for Drain<'_, T> {
168 type Item = T;
169
170 #[inline]
171 fn next(&mut self) -> Option<Self::Item> {
172 self.inner.next().map(|(x, _)| x)
173 }
174
175 #[inline]
176 fn size_hint(&self) -> (usize, Option<usize>) {
177 self.inner.size_hint()
178 }
179}
180
181impl<T> DoubleEndedIterator for Drain<'_, T> {
182 #[inline]
183 fn next_back(&mut self) -> Option<Self::Item> {
184 self.inner.next_back().map(|(x, _)| x)
185 }
186}
187
188impl<T> ExactSizeIterator for Drain<'_, T> {}
189
190impl<T> FusedIterator for Drain<'_, T> {}
191
192impl<'a, T, S> Extend<&'a T> for super::OrderedHashSet<T, S>
193where
194 T: 'a + Eq + core::hash::Hash + Copy,
195 S: core::hash::BuildHasher,
196{
197 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
198 self.map.extend(iter.into_iter().copied().map(|x| (x, ())));
199 }
200}
201
202impl<T, S> Extend<T> for super::OrderedHashSet<T, S>
203where
204 T: Eq + core::hash::Hash,
205 S: core::hash::BuildHasher,
206{
207 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
208 self.map.extend(iter.into_iter().map(|x| (x, ())));
209 }
210}
211
212impl<T, S> FromIterator<T> for super::OrderedHashSet<T, S>
213where
214 T: Eq + core::hash::Hash,
215 S: core::hash::BuildHasher + Default,
216{
217 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
218 let mut lhs = Self::default();
219 lhs.extend(iter);
220 lhs
221 }
222}
223
224impl<'a, T, S> FromIterator<&'a T> for super::OrderedHashSet<T, S>
225where
226 T: 'a + Eq + core::hash::Hash + Copy,
227 S: core::hash::BuildHasher + Default,
228{
229 fn from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Self {
230 let mut lhs = Self::default();
231 lhs.extend(iter);
232 lhs
233 }
234}
235
236#[cfg(test)]
237mod tests {
238 use super::super::OrderedHashSet;
239
240 #[test]
241 fn extend_and_drain() {
242 let mut set1: OrderedHashSet<i32> = [1, 2, 3].into_iter().collect();
243 let set2: OrderedHashSet<i32> = [4, 5, 6].into_iter().collect();
244
245 set1.extend(set2.into_iter());
246
247 assert_eq!(set1, [1, 2, 3, 4, 5, 6].into_iter().collect());
248
249 let mut drain = set1.drain();
250 assert_eq!(drain.size_hint(), (6, Some(6)));
251 assert_eq!(format!("{:?}", drain), "[1, 2, 3, 4, 5, 6]");
252 assert_eq!(drain.next(), Some(1));
253 drop(drain); assert_eq!(set1.len(), 0);
255 }
256
257 #[test]
258 fn iters() {
259 let set1: OrderedHashSet<i32> = [1, 2, 3].into_iter().collect();
260
261 let mut iter = set1.iter();
262 assert_eq!(iter.size_hint(), (3, Some(3)));
263 assert_eq!(format!("{:?}", iter), "[1, 2, 3]");
264 assert_eq!(iter.next(), Some(&1));
265
266 let mut into_iter = set1.into_iter();
267 assert_eq!(into_iter.size_hint(), (3, Some(3)));
268 assert_eq!(format!("{:?}", into_iter), "[1, 2, 3]");
269 assert_eq!(into_iter.next(), Some(1));
270 }
271}