1use super::{Entries, VecSet};
2use alloc::vec::{self, Vec};
3use core::fmt;
4use core::iter::{Chain, FusedIterator};
5use core::ops::RangeBounds;
6use core::slice;
7
8macro_rules! impl_iterator {
9 ($ty:ident<$($lt:lifetime,)*$($gen:ident),+>, $item:ty) => {
10 impl<$($lt,)*$($gen),+> Iterator for $ty<$($lt,)*$($gen),+> {
11 type Item = $item;
12
13 fn next(&mut self) -> Option<Self::Item> {
14 self.iter.next()
15 }
16
17 fn size_hint(&self) -> (usize, Option<usize>) {
18 self.iter.size_hint()
19 }
20 }
21
22 impl<$($lt,)*$($gen),+> DoubleEndedIterator for $ty<$($lt,)*$($gen),+> {
23 fn next_back(&mut self) -> Option<Self::Item> {
24 self.iter.next_back()
25 }
26 }
27
28 impl<$($lt,)*$($gen),+> ExactSizeIterator for $ty<$($lt,)*$($gen),+> {
29 fn len(&self) -> usize {
30 self.iter.len()
31 }
32 }
33
34 impl<$($lt,)*$($gen),+> FusedIterator for $ty<$($lt,)*$($gen),+> {}
35
36 impl<$($lt,)*$($gen),+> fmt::Debug for $ty<$($lt,)*$($gen),+>
37 where
38 T: fmt::Debug,
39 {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 let iter = self.iter.as_slice().iter();
42 f.debug_list().entries(iter).finish()
43 }
44 }
45 };
46}
47
48impl<T> IntoIterator for VecSet<T> {
49 type Item = T;
50
51 type IntoIter = IntoIter<T>;
52
53 fn into_iter(self) -> Self::IntoIter {
54 IntoIter::new(self.into_entries())
55 }
56}
57
58impl<'a, T> IntoIterator for &'a VecSet<T> {
59 type Item = &'a T;
60
61 type IntoIter = Iter<'a, T>;
62
63 fn into_iter(self) -> Self::IntoIter {
64 self.iter()
65 }
66}
67
68pub struct Iter<'a, T> {
74 iter: slice::Iter<'a, T>,
75}
76
77impl<'a, T> Iter<'a, T> {
78 pub(super) fn new(entries: &'a [T]) -> Iter<'a, T> {
79 Iter {
80 iter: entries.iter(),
81 }
82 }
83}
84
85impl<T> Clone for Iter<'_, T> {
86 fn clone(&self) -> Self {
87 Iter {
88 iter: self.iter.clone(),
89 }
90 }
91}
92
93impl_iterator!(Iter<'a, T>, &'a T);
94
95pub struct IntoIter<T> {
103 iter: vec::IntoIter<T>,
104}
105
106impl<T> IntoIter<T> {
107 pub(super) fn new(entries: Vec<T>) -> IntoIter<T> {
108 IntoIter {
109 iter: entries.into_iter(),
110 }
111 }
112}
113
114impl<T> Clone for IntoIter<T>
115where
116 T: Clone,
117{
118 fn clone(&self) -> Self {
119 IntoIter {
120 iter: self.iter.clone(),
121 }
122 }
123}
124
125impl_iterator!(IntoIter<T>, T);
126
127pub struct Difference<'a, T> {
135 iter: Iter<'a, T>,
136 other: &'a VecSet<T>,
137}
138
139impl<'a, T> Difference<'a, T> {
140 pub(super) fn new(set: &'a VecSet<T>, other: &'a VecSet<T>) -> Difference<'a, T> {
141 Difference {
142 iter: set.iter(),
143 other,
144 }
145 }
146}
147
148impl<'a, T> Iterator for Difference<'a, T>
149where
150 T: Eq,
151{
152 type Item = &'a T;
153
154 fn next(&mut self) -> Option<Self::Item> {
155 loop {
156 let item = self.iter.next()?;
157
158 if !self.other.contains(item) {
159 return Some(item);
160 }
161 }
162 }
163
164 fn size_hint(&self) -> (usize, Option<usize>) {
165 (0, self.iter.size_hint().1)
166 }
167}
168
169impl<T> DoubleEndedIterator for Difference<'_, T>
170where
171 T: Eq,
172{
173 fn next_back(&mut self) -> Option<Self::Item> {
174 loop {
175 let item = self.iter.next_back()?;
176
177 if !self.other.contains(item) {
178 return Some(item);
179 }
180 }
181 }
182}
183
184impl<T> FusedIterator for Difference<'_, T> where T: Eq {}
185
186impl<T> Clone for Difference<'_, T> {
187 fn clone(&self) -> Self {
188 Difference {
189 iter: self.iter.clone(),
190 ..*self
191 }
192 }
193}
194
195impl<T> fmt::Debug for Difference<'_, T>
196where
197 T: fmt::Debug + Eq,
198{
199 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
200 f.debug_list().entries(self.clone()).finish()
201 }
202}
203
204pub struct Intersection<'a, T> {
212 iter: Iter<'a, T>,
213 other: &'a VecSet<T>,
214}
215
216impl<'a, T> Intersection<'a, T> {
217 pub(super) fn new(set: &'a VecSet<T>, other: &'a VecSet<T>) -> Intersection<'a, T> {
218 Intersection {
219 iter: set.iter(),
220 other,
221 }
222 }
223}
224
225impl<'a, T> Iterator for Intersection<'a, T>
226where
227 T: Eq,
228{
229 type Item = &'a T;
230
231 fn next(&mut self) -> Option<Self::Item> {
232 loop {
233 let item = self.iter.next()?;
234
235 if self.other.contains(item) {
236 return Some(item);
237 }
238 }
239 }
240
241 fn size_hint(&self) -> (usize, Option<usize>) {
242 (0, self.iter.size_hint().1)
243 }
244}
245
246impl<T> DoubleEndedIterator for Intersection<'_, T>
247where
248 T: Eq,
249{
250 fn next_back(&mut self) -> Option<Self::Item> {
251 loop {
252 let item = self.iter.next_back()?;
253
254 if self.other.contains(item) {
255 return Some(item);
256 }
257 }
258 }
259}
260
261impl<T> FusedIterator for Intersection<'_, T> where T: Eq {}
262
263impl<T> Clone for Intersection<'_, T> {
264 fn clone(&self) -> Self {
265 Intersection {
266 iter: self.iter.clone(),
267 ..*self
268 }
269 }
270}
271
272impl<T> fmt::Debug for Intersection<'_, T>
273where
274 T: fmt::Debug + Eq,
275{
276 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
277 f.debug_list().entries(self.clone()).finish()
278 }
279}
280
281pub struct SymmetricDifference<'a, T> {
289 iter: Chain<Difference<'a, T>, Difference<'a, T>>,
290}
291
292impl<'a, T> SymmetricDifference<'a, T>
293where
294 T: Eq,
295{
296 pub(super) fn new(set: &'a VecSet<T>, other: &'a VecSet<T>) -> SymmetricDifference<'a, T> {
297 SymmetricDifference {
298 iter: set.difference(other).chain(other.difference(set)),
299 }
300 }
301}
302
303impl<'a, T> Iterator for SymmetricDifference<'a, T>
304where
305 T: Eq,
306{
307 type Item = &'a T;
308
309 fn next(&mut self) -> Option<Self::Item> {
310 self.iter.next()
311 }
312
313 fn size_hint(&self) -> (usize, Option<usize>) {
314 self.iter.size_hint()
315 }
316}
317
318impl<T> DoubleEndedIterator for SymmetricDifference<'_, T>
319where
320 T: Eq,
321{
322 fn next_back(&mut self) -> Option<Self::Item> {
323 self.iter.next_back()
324 }
325}
326
327impl<T> FusedIterator for SymmetricDifference<'_, T> where T: Eq {}
328
329impl<T> Clone for SymmetricDifference<'_, T> {
330 fn clone(&self) -> Self {
331 SymmetricDifference {
332 iter: self.iter.clone(),
333 }
334 }
335}
336
337impl<T> fmt::Debug for SymmetricDifference<'_, T>
338where
339 T: fmt::Debug + Eq,
340{
341 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
342 f.debug_list().entries(self.clone()).finish()
343 }
344}
345
346pub struct Union<'a, T> {
353 iter: Chain<Iter<'a, T>, Difference<'a, T>>,
354}
355
356impl<'a, T> Union<'a, T>
357where
358 T: Eq,
359{
360 pub(super) fn new(set: &'a VecSet<T>, other: &'a VecSet<T>) -> Union<'a, T> {
361 Union {
362 iter: set.iter().chain(other.difference(set)),
363 }
364 }
365}
366
367impl<'a, T> Iterator for Union<'a, T>
368where
369 T: Eq,
370{
371 type Item = &'a T;
372
373 fn next(&mut self) -> Option<Self::Item> {
374 self.iter.next()
375 }
376
377 fn size_hint(&self) -> (usize, Option<usize>) {
378 self.iter.size_hint()
379 }
380}
381
382impl<T> DoubleEndedIterator for Union<'_, T>
383where
384 T: Eq,
385{
386 fn next_back(&mut self) -> Option<Self::Item> {
387 self.iter.next_back()
388 }
389}
390
391impl<T> FusedIterator for Union<'_, T> where T: Eq {}
392
393impl<T> Clone for Union<'_, T> {
394 fn clone(&self) -> Self {
395 Union {
396 iter: self.iter.clone(),
397 }
398 }
399}
400
401impl<T> fmt::Debug for Union<'_, T>
402where
403 T: fmt::Debug + Eq,
404{
405 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
406 f.debug_list().entries(self.clone()).finish()
407 }
408}
409
410pub struct Drain<'a, T> {
417 iter: vec::Drain<'a, T>,
418}
419
420impl<'a, T> Drain<'a, T> {
421 pub(super) fn new<R>(set: &'a mut VecSet<T>, range: R) -> Drain<'a, T>
422 where
423 R: RangeBounds<usize>,
424 {
425 Drain {
426 iter: set.base.drain(range),
427 }
428 }
429}
430
431impl_iterator!(Drain<'a, T>, T);