1 //! A hash set implemented using `IndexMap`
2 
3 #[cfg(feature = "rayon")]
4 pub use crate::rayon::set as rayon;
5 
6 #[cfg(has_std)]
7 use std::collections::hash_map::RandomState;
8 
9 use crate::vec::{self, Vec};
10 use core::cmp::Ordering;
11 use core::fmt;
12 use core::hash::{BuildHasher, Hash};
13 use core::iter::{Chain, FusedIterator};
14 use core::ops::{BitAnd, BitOr, BitXor, Index, RangeBounds, Sub};
15 use core::slice;
16 
17 use super::{Entries, Equivalent, IndexMap};
18 
19 type Bucket<T> = super::Bucket<T, ()>;
20 
21 /// A hash set where the iteration order of the values is independent of their
22 /// hash values.
23 ///
24 /// The interface is closely compatible with the standard `HashSet`, but also
25 /// has additional features.
26 ///
27 /// # Order
28 ///
29 /// The values have a consistent order that is determined by the sequence of
30 /// insertion and removal calls on the set. The order does not depend on the
31 /// values or the hash function at all. Note that insertion order and value
32 /// are not affected if a re-insertion is attempted once an element is
33 /// already present.
34 ///
35 /// All iterators traverse the set *in order*.  Set operation iterators like
36 /// `union` produce a concatenated order, as do their matching "bitwise"
37 /// operators.  See their documentation for specifics.
38 ///
39 /// The insertion order is preserved, with **notable exceptions** like the
40 /// `.remove()` or `.swap_remove()` methods. Methods such as `.sort_by()` of
41 /// course result in a new order, depending on the sorting order.
42 ///
43 /// # Indices
44 ///
45 /// The values are indexed in a compact range without holes in the range
46 /// `0..self.len()`. For example, the method `.get_full` looks up the index for
47 /// a value, and the method `.get_index` looks up the value by index.
48 ///
49 /// # Examples
50 ///
51 /// ```
52 /// use indexmap::IndexSet;
53 ///
54 /// // Collects which letters appear in a sentence.
55 /// let letters: IndexSet<_> = "a short treatise on fungi".chars().collect();
56 ///
57 /// assert!(letters.contains(&'s'));
58 /// assert!(letters.contains(&'t'));
59 /// assert!(letters.contains(&'u'));
60 /// assert!(!letters.contains(&'y'));
61 /// ```
62 #[cfg(has_std)]
63 pub struct IndexSet<T, S = RandomState> {
64     pub(crate) map: IndexMap<T, (), S>,
65 }
66 #[cfg(not(has_std))]
67 pub struct IndexSet<T, S> {
68     pub(crate) map: IndexMap<T, (), S>,
69 }
70 
71 impl<T, S> Clone for IndexSet<T, S>
72 where
73     T: Clone,
74     S: Clone,
75 {
clone(&self) -> Self76     fn clone(&self) -> Self {
77         IndexSet {
78             map: self.map.clone(),
79         }
80     }
81 
clone_from(&mut self, other: &Self)82     fn clone_from(&mut self, other: &Self) {
83         self.map.clone_from(&other.map);
84     }
85 }
86 
87 impl<T, S> Entries for IndexSet<T, S> {
88     type Entry = Bucket<T>;
89 
90     #[inline]
into_entries(self) -> Vec<Self::Entry>91     fn into_entries(self) -> Vec<Self::Entry> {
92         self.map.into_entries()
93     }
94 
95     #[inline]
as_entries(&self) -> &[Self::Entry]96     fn as_entries(&self) -> &[Self::Entry] {
97         self.map.as_entries()
98     }
99 
100     #[inline]
as_entries_mut(&mut self) -> &mut [Self::Entry]101     fn as_entries_mut(&mut self) -> &mut [Self::Entry] {
102         self.map.as_entries_mut()
103     }
104 
with_entries<F>(&mut self, f: F) where F: FnOnce(&mut [Self::Entry]),105     fn with_entries<F>(&mut self, f: F)
106     where
107         F: FnOnce(&mut [Self::Entry]),
108     {
109         self.map.with_entries(f);
110     }
111 }
112 
113 impl<T, S> fmt::Debug for IndexSet<T, S>
114 where
115     T: fmt::Debug,
116 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result117     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
118         if cfg!(not(feature = "test_debug")) {
119             f.debug_set().entries(self.iter()).finish()
120         } else {
121             // Let the inner `IndexMap` print all of its details
122             f.debug_struct("IndexSet").field("map", &self.map).finish()
123         }
124     }
125 }
126 
127 #[cfg(has_std)]
128 impl<T> IndexSet<T> {
129     /// Create a new set. (Does not allocate.)
new() -> Self130     pub fn new() -> Self {
131         IndexSet {
132             map: IndexMap::new(),
133         }
134     }
135 
136     /// Create a new set with capacity for `n` elements.
137     /// (Does not allocate if `n` is zero.)
138     ///
139     /// Computes in **O(n)** time.
with_capacity(n: usize) -> Self140     pub fn with_capacity(n: usize) -> Self {
141         IndexSet {
142             map: IndexMap::with_capacity(n),
143         }
144     }
145 }
146 
147 impl<T, S> IndexSet<T, S> {
148     /// Create a new set with capacity for `n` elements.
149     /// (Does not allocate if `n` is zero.)
150     ///
151     /// Computes in **O(n)** time.
with_capacity_and_hasher(n: usize, hash_builder: S) -> Self152     pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self {
153         IndexSet {
154             map: IndexMap::with_capacity_and_hasher(n, hash_builder),
155         }
156     }
157 
158     /// Create a new set with `hash_builder`.
159     ///
160     /// This function is `const`, so it
161     /// can be called in `static` contexts.
with_hasher(hash_builder: S) -> Self162     pub const fn with_hasher(hash_builder: S) -> Self {
163         IndexSet {
164             map: IndexMap::with_hasher(hash_builder),
165         }
166     }
167 
168     /// Computes in **O(1)** time.
capacity(&self) -> usize169     pub fn capacity(&self) -> usize {
170         self.map.capacity()
171     }
172 
173     /// Return a reference to the set's `BuildHasher`.
hasher(&self) -> &S174     pub fn hasher(&self) -> &S {
175         self.map.hasher()
176     }
177 
178     /// Return the number of elements in the set.
179     ///
180     /// Computes in **O(1)** time.
len(&self) -> usize181     pub fn len(&self) -> usize {
182         self.map.len()
183     }
184 
185     /// Returns true if the set contains no elements.
186     ///
187     /// Computes in **O(1)** time.
is_empty(&self) -> bool188     pub fn is_empty(&self) -> bool {
189         self.map.is_empty()
190     }
191 
192     /// Return an iterator over the values of the set, in their order
iter(&self) -> Iter<'_, T>193     pub fn iter(&self) -> Iter<'_, T> {
194         Iter {
195             iter: self.map.as_entries().iter(),
196         }
197     }
198 
199     /// Remove all elements in the set, while preserving its capacity.
200     ///
201     /// Computes in **O(n)** time.
clear(&mut self)202     pub fn clear(&mut self) {
203         self.map.clear();
204     }
205 
206     /// Shortens the set, keeping the first `len` elements and dropping the rest.
207     ///
208     /// If `len` is greater than the set's current length, this has no effect.
truncate(&mut self, len: usize)209     pub fn truncate(&mut self, len: usize) {
210         self.map.truncate(len);
211     }
212 
213     /// Clears the `IndexSet` in the given index range, returning those values
214     /// as a drain iterator.
215     ///
216     /// The range may be any type that implements `RangeBounds<usize>`,
217     /// including all of the `std::ops::Range*` types, or even a tuple pair of
218     /// `Bound` start and end values. To drain the set entirely, use `RangeFull`
219     /// like `set.drain(..)`.
220     ///
221     /// This shifts down all entries following the drained range to fill the
222     /// gap, and keeps the allocated memory for reuse.
223     ///
224     /// ***Panics*** if the starting point is greater than the end point or if
225     /// the end point is greater than the length of the set.
drain<R>(&mut self, range: R) -> Drain<'_, T> where R: RangeBounds<usize>,226     pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
227     where
228         R: RangeBounds<usize>,
229     {
230         Drain {
231             iter: self.map.drain(range).iter,
232         }
233     }
234 
235     /// Splits the collection into two at the given index.
236     ///
237     /// Returns a newly allocated set containing the elements in the range
238     /// `[at, len)`. After the call, the original set will be left containing
239     /// the elements `[0, at)` with its previous capacity unchanged.
240     ///
241     /// ***Panics*** if `at > len`.
split_off(&mut self, at: usize) -> Self where S: Clone,242     pub fn split_off(&mut self, at: usize) -> Self
243     where
244         S: Clone,
245     {
246         Self {
247             map: self.map.split_off(at),
248         }
249     }
250 }
251 
252 impl<T, S> IndexSet<T, S>
253 where
254     T: Hash + Eq,
255     S: BuildHasher,
256 {
257     /// Reserve capacity for `additional` more values.
258     ///
259     /// Computes in **O(n)** time.
reserve(&mut self, additional: usize)260     pub fn reserve(&mut self, additional: usize) {
261         self.map.reserve(additional);
262     }
263 
264     /// Shrink the capacity of the set as much as possible.
265     ///
266     /// Computes in **O(n)** time.
shrink_to_fit(&mut self)267     pub fn shrink_to_fit(&mut self) {
268         self.map.shrink_to_fit();
269     }
270 
271     /// Shrink the capacity of the set with a lower limit.
272     ///
273     /// Computes in **O(n)** time.
shrink_to(&mut self, min_capacity: usize)274     pub fn shrink_to(&mut self, min_capacity: usize) {
275         self.map.shrink_to(min_capacity);
276     }
277 
278     /// Insert the value into the set.
279     ///
280     /// If an equivalent item already exists in the set, it returns
281     /// `false` leaving the original value in the set and without
282     /// altering its insertion order. Otherwise, it inserts the new
283     /// item and returns `true`.
284     ///
285     /// Computes in **O(1)** time (amortized average).
insert(&mut self, value: T) -> bool286     pub fn insert(&mut self, value: T) -> bool {
287         self.map.insert(value, ()).is_none()
288     }
289 
290     /// Insert the value into the set, and get its index.
291     ///
292     /// If an equivalent item already exists in the set, it returns
293     /// the index of the existing item and `false`, leaving the
294     /// original value in the set and without altering its insertion
295     /// order. Otherwise, it inserts the new item and returns the index
296     /// of the inserted item and `true`.
297     ///
298     /// Computes in **O(1)** time (amortized average).
insert_full(&mut self, value: T) -> (usize, bool)299     pub fn insert_full(&mut self, value: T) -> (usize, bool) {
300         use super::map::Entry::*;
301 
302         match self.map.entry(value) {
303             Occupied(e) => (e.index(), false),
304             Vacant(e) => {
305                 let index = e.index();
306                 e.insert(());
307                 (index, true)
308             }
309         }
310     }
311 
312     /// Return an iterator over the values that are in `self` but not `other`.
313     ///
314     /// Values are produced in the same order that they appear in `self`.
difference<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Difference<'a, T, S2> where S2: BuildHasher,315     pub fn difference<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Difference<'a, T, S2>
316     where
317         S2: BuildHasher,
318     {
319         Difference {
320             iter: self.iter(),
321             other,
322         }
323     }
324 
325     /// Return an iterator over the values that are in `self` or `other`,
326     /// but not in both.
327     ///
328     /// Values from `self` are produced in their original order, followed by
329     /// values from `other` in their original order.
symmetric_difference<'a, S2>( &'a self, other: &'a IndexSet<T, S2>, ) -> SymmetricDifference<'a, T, S, S2> where S2: BuildHasher,330     pub fn symmetric_difference<'a, S2>(
331         &'a self,
332         other: &'a IndexSet<T, S2>,
333     ) -> SymmetricDifference<'a, T, S, S2>
334     where
335         S2: BuildHasher,
336     {
337         SymmetricDifference {
338             iter: self.difference(other).chain(other.difference(self)),
339         }
340     }
341 
342     /// Return an iterator over the values that are in both `self` and `other`.
343     ///
344     /// Values are produced in the same order that they appear in `self`.
intersection<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Intersection<'a, T, S2> where S2: BuildHasher,345     pub fn intersection<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Intersection<'a, T, S2>
346     where
347         S2: BuildHasher,
348     {
349         Intersection {
350             iter: self.iter(),
351             other,
352         }
353     }
354 
355     /// Return an iterator over all values that are in `self` or `other`.
356     ///
357     /// Values from `self` are produced in their original order, followed by
358     /// values that are unique to `other` in their original order.
union<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Union<'a, T, S> where S2: BuildHasher,359     pub fn union<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Union<'a, T, S>
360     where
361         S2: BuildHasher,
362     {
363         Union {
364             iter: self.iter().chain(other.difference(self)),
365         }
366     }
367 
368     /// Return `true` if an equivalent to `value` exists in the set.
369     ///
370     /// Computes in **O(1)** time (average).
contains<Q: ?Sized>(&self, value: &Q) -> bool where Q: Hash + Equivalent<T>,371     pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
372     where
373         Q: Hash + Equivalent<T>,
374     {
375         self.map.contains_key(value)
376     }
377 
378     /// Return a reference to the value stored in the set, if it is present,
379     /// else `None`.
380     ///
381     /// Computes in **O(1)** time (average).
get<Q: ?Sized>(&self, value: &Q) -> Option<&T> where Q: Hash + Equivalent<T>,382     pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
383     where
384         Q: Hash + Equivalent<T>,
385     {
386         self.map.get_key_value(value).map(|(x, &())| x)
387     }
388 
389     /// Return item index and value
get_full<Q: ?Sized>(&self, value: &Q) -> Option<(usize, &T)> where Q: Hash + Equivalent<T>,390     pub fn get_full<Q: ?Sized>(&self, value: &Q) -> Option<(usize, &T)>
391     where
392         Q: Hash + Equivalent<T>,
393     {
394         self.map.get_full(value).map(|(i, x, &())| (i, x))
395     }
396 
397     /// Return item index, if it exists in the set
get_index_of<Q: ?Sized>(&self, value: &Q) -> Option<usize> where Q: Hash + Equivalent<T>,398     pub fn get_index_of<Q: ?Sized>(&self, value: &Q) -> Option<usize>
399     where
400         Q: Hash + Equivalent<T>,
401     {
402         self.map.get_index_of(value)
403     }
404 
405     /// Adds a value to the set, replacing the existing value, if any, that is
406     /// equal to the given one, without altering its insertion order. Returns
407     /// the replaced value.
408     ///
409     /// Computes in **O(1)** time (average).
replace(&mut self, value: T) -> Option<T>410     pub fn replace(&mut self, value: T) -> Option<T> {
411         self.replace_full(value).1
412     }
413 
414     /// Adds a value to the set, replacing the existing value, if any, that is
415     /// equal to the given one, without altering its insertion order. Returns
416     /// the index of the item and its replaced value.
417     ///
418     /// Computes in **O(1)** time (average).
replace_full(&mut self, value: T) -> (usize, Option<T>)419     pub fn replace_full(&mut self, value: T) -> (usize, Option<T>) {
420         use super::map::Entry::*;
421 
422         match self.map.entry(value) {
423             Vacant(e) => {
424                 let index = e.index();
425                 e.insert(());
426                 (index, None)
427             }
428             Occupied(e) => (e.index(), Some(e.replace_key())),
429         }
430     }
431 
432     /// Remove the value from the set, and return `true` if it was present.
433     ///
434     /// **NOTE:** This is equivalent to `.swap_remove(value)`, if you want
435     /// to preserve the order of the values in the set, use `.shift_remove(value)`.
436     ///
437     /// Computes in **O(1)** time (average).
remove<Q: ?Sized>(&mut self, value: &Q) -> bool where Q: Hash + Equivalent<T>,438     pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
439     where
440         Q: Hash + Equivalent<T>,
441     {
442         self.swap_remove(value)
443     }
444 
445     /// Remove the value from the set, and return `true` if it was present.
446     ///
447     /// Like `Vec::swap_remove`, the value is removed by swapping it with the
448     /// last element of the set and popping it off. **This perturbs
449     /// the position of what used to be the last element!**
450     ///
451     /// Return `false` if `value` was not in the set.
452     ///
453     /// Computes in **O(1)** time (average).
swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool where Q: Hash + Equivalent<T>,454     pub fn swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
455     where
456         Q: Hash + Equivalent<T>,
457     {
458         self.map.swap_remove(value).is_some()
459     }
460 
461     /// Remove the value from the set, and return `true` if it was present.
462     ///
463     /// Like `Vec::remove`, the value is removed by shifting all of the
464     /// elements that follow it, preserving their relative order.
465     /// **This perturbs the index of all of those elements!**
466     ///
467     /// Return `false` if `value` was not in the set.
468     ///
469     /// Computes in **O(n)** time (average).
shift_remove<Q: ?Sized>(&mut self, value: &Q) -> bool where Q: Hash + Equivalent<T>,470     pub fn shift_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
471     where
472         Q: Hash + Equivalent<T>,
473     {
474         self.map.shift_remove(value).is_some()
475     }
476 
477     /// Removes and returns the value in the set, if any, that is equal to the
478     /// given one.
479     ///
480     /// **NOTE:** This is equivalent to `.swap_take(value)`, if you need to
481     /// preserve the order of the values in the set, use `.shift_take(value)`
482     /// instead.
483     ///
484     /// Computes in **O(1)** time (average).
take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> where Q: Hash + Equivalent<T>,485     pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
486     where
487         Q: Hash + Equivalent<T>,
488     {
489         self.swap_take(value)
490     }
491 
492     /// Removes and returns the value in the set, if any, that is equal to the
493     /// given one.
494     ///
495     /// Like `Vec::swap_remove`, the value is removed by swapping it with the
496     /// last element of the set and popping it off. **This perturbs
497     /// the position of what used to be the last element!**
498     ///
499     /// Return `None` if `value` was not in the set.
500     ///
501     /// Computes in **O(1)** time (average).
swap_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> where Q: Hash + Equivalent<T>,502     pub fn swap_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
503     where
504         Q: Hash + Equivalent<T>,
505     {
506         self.map.swap_remove_entry(value).map(|(x, ())| x)
507     }
508 
509     /// Removes and returns the value in the set, if any, that is equal to the
510     /// given one.
511     ///
512     /// Like `Vec::remove`, the value is removed by shifting all of the
513     /// elements that follow it, preserving their relative order.
514     /// **This perturbs the index of all of those elements!**
515     ///
516     /// Return `None` if `value` was not in the set.
517     ///
518     /// Computes in **O(n)** time (average).
shift_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> where Q: Hash + Equivalent<T>,519     pub fn shift_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
520     where
521         Q: Hash + Equivalent<T>,
522     {
523         self.map.shift_remove_entry(value).map(|(x, ())| x)
524     }
525 
526     /// Remove the value from the set return it and the index it had.
527     ///
528     /// Like `Vec::swap_remove`, the value is removed by swapping it with the
529     /// last element of the set and popping it off. **This perturbs
530     /// the position of what used to be the last element!**
531     ///
532     /// Return `None` if `value` was not in the set.
swap_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)> where Q: Hash + Equivalent<T>,533     pub fn swap_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)>
534     where
535         Q: Hash + Equivalent<T>,
536     {
537         self.map.swap_remove_full(value).map(|(i, x, ())| (i, x))
538     }
539 
540     /// Remove the value from the set return it and the index it had.
541     ///
542     /// Like `Vec::remove`, the value is removed by shifting all of the
543     /// elements that follow it, preserving their relative order.
544     /// **This perturbs the index of all of those elements!**
545     ///
546     /// Return `None` if `value` was not in the set.
shift_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)> where Q: Hash + Equivalent<T>,547     pub fn shift_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)>
548     where
549         Q: Hash + Equivalent<T>,
550     {
551         self.map.shift_remove_full(value).map(|(i, x, ())| (i, x))
552     }
553 
554     /// Remove the last value
555     ///
556     /// This preserves the order of the remaining elements.
557     ///
558     /// Computes in **O(1)** time (average).
pop(&mut self) -> Option<T>559     pub fn pop(&mut self) -> Option<T> {
560         self.map.pop().map(|(x, ())| x)
561     }
562 
563     /// Scan through each value in the set and keep those where the
564     /// closure `keep` returns `true`.
565     ///
566     /// The elements are visited in order, and remaining elements keep their
567     /// order.
568     ///
569     /// Computes in **O(n)** time (average).
retain<F>(&mut self, mut keep: F) where F: FnMut(&T) -> bool,570     pub fn retain<F>(&mut self, mut keep: F)
571     where
572         F: FnMut(&T) -> bool,
573     {
574         self.map.retain(move |x, &mut ()| keep(x))
575     }
576 
577     /// Sort the set’s values by their default ordering.
578     ///
579     /// See [`sort_by`](Self::sort_by) for details.
sort(&mut self) where T: Ord,580     pub fn sort(&mut self)
581     where
582         T: Ord,
583     {
584         self.map.sort_keys()
585     }
586 
587     /// Sort the set’s values in place using the comparison function `cmp`.
588     ///
589     /// Computes in **O(n log n)** time and **O(n)** space. The sort is stable.
sort_by<F>(&mut self, mut cmp: F) where F: FnMut(&T, &T) -> Ordering,590     pub fn sort_by<F>(&mut self, mut cmp: F)
591     where
592         F: FnMut(&T, &T) -> Ordering,
593     {
594         self.map.sort_by(move |a, _, b, _| cmp(a, b));
595     }
596 
597     /// Sort the values of the set and return a by-value iterator of
598     /// the values with the result.
599     ///
600     /// The sort is stable.
sorted_by<F>(self, mut cmp: F) -> IntoIter<T> where F: FnMut(&T, &T) -> Ordering,601     pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<T>
602     where
603         F: FnMut(&T, &T) -> Ordering,
604     {
605         let mut entries = self.into_entries();
606         entries.sort_by(move |a, b| cmp(&a.key, &b.key));
607         IntoIter {
608             iter: entries.into_iter(),
609         }
610     }
611 
612     /// Sort the set's values by their default ordering.
613     ///
614     /// See [`sort_unstable_by`](Self::sort_unstable_by) for details.
sort_unstable(&mut self) where T: Ord,615     pub fn sort_unstable(&mut self)
616     where
617         T: Ord,
618     {
619         self.map.sort_unstable_keys()
620     }
621 
622     /// Sort the set's values in place using the comparison funtion `cmp`.
623     ///
624     /// Computes in **O(n log n)** time. The sort is unstable.
sort_unstable_by<F>(&mut self, mut cmp: F) where F: FnMut(&T, &T) -> Ordering,625     pub fn sort_unstable_by<F>(&mut self, mut cmp: F)
626     where
627         F: FnMut(&T, &T) -> Ordering,
628     {
629         self.map.sort_unstable_by(move |a, _, b, _| cmp(a, b))
630     }
631 
632     /// Sort the values of the set and return a by-value iterator of
633     /// the values with the result.
sorted_unstable_by<F>(self, mut cmp: F) -> IntoIter<T> where F: FnMut(&T, &T) -> Ordering,634     pub fn sorted_unstable_by<F>(self, mut cmp: F) -> IntoIter<T>
635     where
636         F: FnMut(&T, &T) -> Ordering,
637     {
638         let mut entries = self.into_entries();
639         entries.sort_unstable_by(move |a, b| cmp(&a.key, &b.key));
640         IntoIter {
641             iter: entries.into_iter(),
642         }
643     }
644 
645     /// Reverses the order of the set’s values in place.
646     ///
647     /// Computes in **O(n)** time and **O(1)** space.
reverse(&mut self)648     pub fn reverse(&mut self) {
649         self.map.reverse()
650     }
651 }
652 
653 impl<T, S> IndexSet<T, S> {
654     /// Get a value by index
655     ///
656     /// Valid indices are *0 <= index < self.len()*
657     ///
658     /// Computes in **O(1)** time.
get_index(&self, index: usize) -> Option<&T>659     pub fn get_index(&self, index: usize) -> Option<&T> {
660         self.as_entries().get(index).map(Bucket::key_ref)
661     }
662 
663     /// Get the first value
664     ///
665     /// Computes in **O(1)** time.
first(&self) -> Option<&T>666     pub fn first(&self) -> Option<&T> {
667         self.as_entries().first().map(Bucket::key_ref)
668     }
669 
670     /// Get the last value
671     ///
672     /// Computes in **O(1)** time.
last(&self) -> Option<&T>673     pub fn last(&self) -> Option<&T> {
674         self.as_entries().last().map(Bucket::key_ref)
675     }
676 
677     /// Remove the value by index
678     ///
679     /// Valid indices are *0 <= index < self.len()*
680     ///
681     /// Like `Vec::swap_remove`, the value is removed by swapping it with the
682     /// last element of the set and popping it off. **This perturbs
683     /// the position of what used to be the last element!**
684     ///
685     /// Computes in **O(1)** time (average).
swap_remove_index(&mut self, index: usize) -> Option<T>686     pub fn swap_remove_index(&mut self, index: usize) -> Option<T> {
687         self.map.swap_remove_index(index).map(|(x, ())| x)
688     }
689 
690     /// Remove the value by index
691     ///
692     /// Valid indices are *0 <= index < self.len()*
693     ///
694     /// Like `Vec::remove`, the value is removed by shifting all of the
695     /// elements that follow it, preserving their relative order.
696     /// **This perturbs the index of all of those elements!**
697     ///
698     /// Computes in **O(n)** time (average).
shift_remove_index(&mut self, index: usize) -> Option<T>699     pub fn shift_remove_index(&mut self, index: usize) -> Option<T> {
700         self.map.shift_remove_index(index).map(|(x, ())| x)
701     }
702 
703     /// Moves the position of a value from one index to another
704     /// by shifting all other values in-between.
705     ///
706     /// * If `from < to`, the other values will shift down while the targeted value moves up.
707     /// * If `from > to`, the other values will shift up while the targeted value moves down.
708     ///
709     /// ***Panics*** if `from` or `to` are out of bounds.
710     ///
711     /// Computes in **O(n)** time (average).
move_index(&mut self, from: usize, to: usize)712     pub fn move_index(&mut self, from: usize, to: usize) {
713         self.map.move_index(from, to)
714     }
715 
716     /// Swaps the position of two values in the set.
717     ///
718     /// ***Panics*** if `a` or `b` are out of bounds.
swap_indices(&mut self, a: usize, b: usize)719     pub fn swap_indices(&mut self, a: usize, b: usize) {
720         self.map.swap_indices(a, b)
721     }
722 }
723 
724 /// Access `IndexSet` values at indexed positions.
725 ///
726 /// # Examples
727 ///
728 /// ```
729 /// use indexmap::IndexSet;
730 ///
731 /// let mut set = IndexSet::new();
732 /// for word in "Lorem ipsum dolor sit amet".split_whitespace() {
733 ///     set.insert(word.to_string());
734 /// }
735 /// assert_eq!(set[0], "Lorem");
736 /// assert_eq!(set[1], "ipsum");
737 /// set.reverse();
738 /// assert_eq!(set[0], "amet");
739 /// assert_eq!(set[1], "sit");
740 /// set.sort();
741 /// assert_eq!(set[0], "Lorem");
742 /// assert_eq!(set[1], "amet");
743 /// ```
744 ///
745 /// ```should_panic
746 /// use indexmap::IndexSet;
747 ///
748 /// let mut set = IndexSet::new();
749 /// set.insert("foo");
750 /// println!("{:?}", set[10]); // panics!
751 /// ```
752 impl<T, S> Index<usize> for IndexSet<T, S> {
753     type Output = T;
754 
755     /// Returns a reference to the value at the supplied `index`.
756     ///
757     /// ***Panics*** if `index` is out of bounds.
index(&self, index: usize) -> &T758     fn index(&self, index: usize) -> &T {
759         self.get_index(index)
760             .expect("IndexSet: index out of bounds")
761     }
762 }
763 
764 /// An owning iterator over the items of a `IndexSet`.
765 ///
766 /// This `struct` is created by the [`into_iter`] method on [`IndexSet`]
767 /// (provided by the `IntoIterator` trait). See its documentation for more.
768 ///
769 /// [`IndexSet`]: struct.IndexSet.html
770 /// [`into_iter`]: struct.IndexSet.html#method.into_iter
771 pub struct IntoIter<T> {
772     iter: vec::IntoIter<Bucket<T>>,
773 }
774 
775 impl<T> Iterator for IntoIter<T> {
776     type Item = T;
777 
778     iterator_methods!(Bucket::key);
779 }
780 
781 impl<T> DoubleEndedIterator for IntoIter<T> {
782     double_ended_iterator_methods!(Bucket::key);
783 }
784 
785 impl<T> ExactSizeIterator for IntoIter<T> {
len(&self) -> usize786     fn len(&self) -> usize {
787         self.iter.len()
788     }
789 }
790 
791 impl<T> FusedIterator for IntoIter<T> {}
792 
793 impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result794     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
795         let iter = self.iter.as_slice().iter().map(Bucket::key_ref);
796         f.debug_list().entries(iter).finish()
797     }
798 }
799 
800 /// An iterator over the items of a `IndexSet`.
801 ///
802 /// This `struct` is created by the [`iter`] method on [`IndexSet`].
803 /// See its documentation for more.
804 ///
805 /// [`IndexSet`]: struct.IndexSet.html
806 /// [`iter`]: struct.IndexSet.html#method.iter
807 pub struct Iter<'a, T> {
808     iter: slice::Iter<'a, Bucket<T>>,
809 }
810 
811 impl<'a, T> Iterator for Iter<'a, T> {
812     type Item = &'a T;
813 
814     iterator_methods!(Bucket::key_ref);
815 }
816 
817 impl<T> DoubleEndedIterator for Iter<'_, T> {
818     double_ended_iterator_methods!(Bucket::key_ref);
819 }
820 
821 impl<T> ExactSizeIterator for Iter<'_, T> {
len(&self) -> usize822     fn len(&self) -> usize {
823         self.iter.len()
824     }
825 }
826 
827 impl<T> FusedIterator for Iter<'_, T> {}
828 
829 impl<T> Clone for Iter<'_, T> {
clone(&self) -> Self830     fn clone(&self) -> Self {
831         Iter {
832             iter: self.iter.clone(),
833         }
834     }
835 }
836 
837 impl<T: fmt::Debug> fmt::Debug for Iter<'_, T> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result838     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
839         f.debug_list().entries(self.clone()).finish()
840     }
841 }
842 
843 /// A draining iterator over the items of a `IndexSet`.
844 ///
845 /// This `struct` is created by the [`drain`] method on [`IndexSet`].
846 /// See its documentation for more.
847 ///
848 /// [`IndexSet`]: struct.IndexSet.html
849 /// [`drain`]: struct.IndexSet.html#method.drain
850 pub struct Drain<'a, T> {
851     iter: vec::Drain<'a, Bucket<T>>,
852 }
853 
854 impl<T> Iterator for Drain<'_, T> {
855     type Item = T;
856 
857     iterator_methods!(Bucket::key);
858 }
859 
860 impl<T> DoubleEndedIterator for Drain<'_, T> {
861     double_ended_iterator_methods!(Bucket::key);
862 }
863 
864 impl<T> ExactSizeIterator for Drain<'_, T> {
len(&self) -> usize865     fn len(&self) -> usize {
866         self.iter.len()
867     }
868 }
869 
870 impl<T> FusedIterator for Drain<'_, T> {}
871 
872 impl<T: fmt::Debug> fmt::Debug for Drain<'_, T> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result873     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
874         let iter = self.iter.as_slice().iter().map(Bucket::key_ref);
875         f.debug_list().entries(iter).finish()
876     }
877 }
878 
879 impl<'a, T, S> IntoIterator for &'a IndexSet<T, S> {
880     type Item = &'a T;
881     type IntoIter = Iter<'a, T>;
882 
into_iter(self) -> Self::IntoIter883     fn into_iter(self) -> Self::IntoIter {
884         self.iter()
885     }
886 }
887 
888 impl<T, S> IntoIterator for IndexSet<T, S> {
889     type Item = T;
890     type IntoIter = IntoIter<T>;
891 
into_iter(self) -> Self::IntoIter892     fn into_iter(self) -> Self::IntoIter {
893         IntoIter {
894             iter: self.into_entries().into_iter(),
895         }
896     }
897 }
898 
899 impl<T, S> FromIterator<T> for IndexSet<T, S>
900 where
901     T: Hash + Eq,
902     S: BuildHasher + Default,
903 {
from_iter<I: IntoIterator<Item = T>>(iterable: I) -> Self904     fn from_iter<I: IntoIterator<Item = T>>(iterable: I) -> Self {
905         let iter = iterable.into_iter().map(|x| (x, ()));
906         IndexSet {
907             map: IndexMap::from_iter(iter),
908         }
909     }
910 }
911 
912 #[cfg(has_std)]
913 impl<T, const N: usize> From<[T; N]> for IndexSet<T, RandomState>
914 where
915     T: Eq + Hash,
916 {
917     /// # Examples
918     ///
919     /// ```
920     /// use indexmap::IndexSet;
921     ///
922     /// let set1 = IndexSet::from([1, 2, 3, 4]);
923     /// let set2: IndexSet<_> = [1, 2, 3, 4].into();
924     /// assert_eq!(set1, set2);
925     /// ```
from(arr: [T; N]) -> Self926     fn from(arr: [T; N]) -> Self {
927         Self::from_iter(arr)
928     }
929 }
930 
931 impl<T, S> Extend<T> for IndexSet<T, S>
932 where
933     T: Hash + Eq,
934     S: BuildHasher,
935 {
extend<I: IntoIterator<Item = T>>(&mut self, iterable: I)936     fn extend<I: IntoIterator<Item = T>>(&mut self, iterable: I) {
937         let iter = iterable.into_iter().map(|x| (x, ()));
938         self.map.extend(iter);
939     }
940 }
941 
942 impl<'a, T, S> Extend<&'a T> for IndexSet<T, S>
943 where
944     T: Hash + Eq + Copy + 'a,
945     S: BuildHasher,
946 {
extend<I: IntoIterator<Item = &'a T>>(&mut self, iterable: I)947     fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iterable: I) {
948         let iter = iterable.into_iter().copied();
949         self.extend(iter);
950     }
951 }
952 
953 impl<T, S> Default for IndexSet<T, S>
954 where
955     S: Default,
956 {
957     /// Return an empty `IndexSet`
default() -> Self958     fn default() -> Self {
959         IndexSet {
960             map: IndexMap::default(),
961         }
962     }
963 }
964 
965 impl<T, S1, S2> PartialEq<IndexSet<T, S2>> for IndexSet<T, S1>
966 where
967     T: Hash + Eq,
968     S1: BuildHasher,
969     S2: BuildHasher,
970 {
eq(&self, other: &IndexSet<T, S2>) -> bool971     fn eq(&self, other: &IndexSet<T, S2>) -> bool {
972         self.len() == other.len() && self.is_subset(other)
973     }
974 }
975 
976 impl<T, S> Eq for IndexSet<T, S>
977 where
978     T: Eq + Hash,
979     S: BuildHasher,
980 {
981 }
982 
983 impl<T, S> IndexSet<T, S>
984 where
985     T: Eq + Hash,
986     S: BuildHasher,
987 {
988     /// Returns `true` if `self` has no elements in common with `other`.
is_disjoint<S2>(&self, other: &IndexSet<T, S2>) -> bool where S2: BuildHasher,989     pub fn is_disjoint<S2>(&self, other: &IndexSet<T, S2>) -> bool
990     where
991         S2: BuildHasher,
992     {
993         if self.len() <= other.len() {
994             self.iter().all(move |value| !other.contains(value))
995         } else {
996             other.iter().all(move |value| !self.contains(value))
997         }
998     }
999 
1000     /// Returns `true` if all elements of `self` are contained in `other`.
is_subset<S2>(&self, other: &IndexSet<T, S2>) -> bool where S2: BuildHasher,1001     pub fn is_subset<S2>(&self, other: &IndexSet<T, S2>) -> bool
1002     where
1003         S2: BuildHasher,
1004     {
1005         self.len() <= other.len() && self.iter().all(move |value| other.contains(value))
1006     }
1007 
1008     /// Returns `true` if all elements of `other` are contained in `self`.
is_superset<S2>(&self, other: &IndexSet<T, S2>) -> bool where S2: BuildHasher,1009     pub fn is_superset<S2>(&self, other: &IndexSet<T, S2>) -> bool
1010     where
1011         S2: BuildHasher,
1012     {
1013         other.is_subset(self)
1014     }
1015 }
1016 
1017 /// A lazy iterator producing elements in the difference of `IndexSet`s.
1018 ///
1019 /// This `struct` is created by the [`difference`] method on [`IndexSet`].
1020 /// See its documentation for more.
1021 ///
1022 /// [`IndexSet`]: struct.IndexSet.html
1023 /// [`difference`]: struct.IndexSet.html#method.difference
1024 pub struct Difference<'a, T, S> {
1025     iter: Iter<'a, T>,
1026     other: &'a IndexSet<T, S>,
1027 }
1028 
1029 impl<'a, T, S> Iterator for Difference<'a, T, S>
1030 where
1031     T: Eq + Hash,
1032     S: BuildHasher,
1033 {
1034     type Item = &'a T;
1035 
next(&mut self) -> Option<Self::Item>1036     fn next(&mut self) -> Option<Self::Item> {
1037         while let Some(item) = self.iter.next() {
1038             if !self.other.contains(item) {
1039                 return Some(item);
1040             }
1041         }
1042         None
1043     }
1044 
size_hint(&self) -> (usize, Option<usize>)1045     fn size_hint(&self) -> (usize, Option<usize>) {
1046         (0, self.iter.size_hint().1)
1047     }
1048 }
1049 
1050 impl<T, S> DoubleEndedIterator for Difference<'_, T, S>
1051 where
1052     T: Eq + Hash,
1053     S: BuildHasher,
1054 {
next_back(&mut self) -> Option<Self::Item>1055     fn next_back(&mut self) -> Option<Self::Item> {
1056         while let Some(item) = self.iter.next_back() {
1057             if !self.other.contains(item) {
1058                 return Some(item);
1059             }
1060         }
1061         None
1062     }
1063 }
1064 
1065 impl<T, S> FusedIterator for Difference<'_, T, S>
1066 where
1067     T: Eq + Hash,
1068     S: BuildHasher,
1069 {
1070 }
1071 
1072 impl<T, S> Clone for Difference<'_, T, S> {
clone(&self) -> Self1073     fn clone(&self) -> Self {
1074         Difference {
1075             iter: self.iter.clone(),
1076             ..*self
1077         }
1078     }
1079 }
1080 
1081 impl<T, S> fmt::Debug for Difference<'_, T, S>
1082 where
1083     T: fmt::Debug + Eq + Hash,
1084     S: BuildHasher,
1085 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1086     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1087         f.debug_list().entries(self.clone()).finish()
1088     }
1089 }
1090 
1091 /// A lazy iterator producing elements in the intersection of `IndexSet`s.
1092 ///
1093 /// This `struct` is created by the [`intersection`] method on [`IndexSet`].
1094 /// See its documentation for more.
1095 ///
1096 /// [`IndexSet`]: struct.IndexSet.html
1097 /// [`intersection`]: struct.IndexSet.html#method.intersection
1098 pub struct Intersection<'a, T, S> {
1099     iter: Iter<'a, T>,
1100     other: &'a IndexSet<T, S>,
1101 }
1102 
1103 impl<'a, T, S> Iterator for Intersection<'a, T, S>
1104 where
1105     T: Eq + Hash,
1106     S: BuildHasher,
1107 {
1108     type Item = &'a T;
1109 
next(&mut self) -> Option<Self::Item>1110     fn next(&mut self) -> Option<Self::Item> {
1111         while let Some(item) = self.iter.next() {
1112             if self.other.contains(item) {
1113                 return Some(item);
1114             }
1115         }
1116         None
1117     }
1118 
size_hint(&self) -> (usize, Option<usize>)1119     fn size_hint(&self) -> (usize, Option<usize>) {
1120         (0, self.iter.size_hint().1)
1121     }
1122 }
1123 
1124 impl<T, S> DoubleEndedIterator for Intersection<'_, T, S>
1125 where
1126     T: Eq + Hash,
1127     S: BuildHasher,
1128 {
next_back(&mut self) -> Option<Self::Item>1129     fn next_back(&mut self) -> Option<Self::Item> {
1130         while let Some(item) = self.iter.next_back() {
1131             if self.other.contains(item) {
1132                 return Some(item);
1133             }
1134         }
1135         None
1136     }
1137 }
1138 
1139 impl<T, S> FusedIterator for Intersection<'_, T, S>
1140 where
1141     T: Eq + Hash,
1142     S: BuildHasher,
1143 {
1144 }
1145 
1146 impl<T, S> Clone for Intersection<'_, T, S> {
clone(&self) -> Self1147     fn clone(&self) -> Self {
1148         Intersection {
1149             iter: self.iter.clone(),
1150             ..*self
1151         }
1152     }
1153 }
1154 
1155 impl<T, S> fmt::Debug for Intersection<'_, T, S>
1156 where
1157     T: fmt::Debug + Eq + Hash,
1158     S: BuildHasher,
1159 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1160     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1161         f.debug_list().entries(self.clone()).finish()
1162     }
1163 }
1164 
1165 /// A lazy iterator producing elements in the symmetric difference of `IndexSet`s.
1166 ///
1167 /// This `struct` is created by the [`symmetric_difference`] method on
1168 /// [`IndexSet`]. See its documentation for more.
1169 ///
1170 /// [`IndexSet`]: struct.IndexSet.html
1171 /// [`symmetric_difference`]: struct.IndexSet.html#method.symmetric_difference
1172 pub struct SymmetricDifference<'a, T, S1, S2> {
1173     iter: Chain<Difference<'a, T, S2>, Difference<'a, T, S1>>,
1174 }
1175 
1176 impl<'a, T, S1, S2> Iterator for SymmetricDifference<'a, T, S1, S2>
1177 where
1178     T: Eq + Hash,
1179     S1: BuildHasher,
1180     S2: BuildHasher,
1181 {
1182     type Item = &'a T;
1183 
next(&mut self) -> Option<Self::Item>1184     fn next(&mut self) -> Option<Self::Item> {
1185         self.iter.next()
1186     }
1187 
size_hint(&self) -> (usize, Option<usize>)1188     fn size_hint(&self) -> (usize, Option<usize>) {
1189         self.iter.size_hint()
1190     }
1191 
fold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,1192     fn fold<B, F>(self, init: B, f: F) -> B
1193     where
1194         F: FnMut(B, Self::Item) -> B,
1195     {
1196         self.iter.fold(init, f)
1197     }
1198 }
1199 
1200 impl<T, S1, S2> DoubleEndedIterator for SymmetricDifference<'_, T, S1, S2>
1201 where
1202     T: Eq + Hash,
1203     S1: BuildHasher,
1204     S2: BuildHasher,
1205 {
next_back(&mut self) -> Option<Self::Item>1206     fn next_back(&mut self) -> Option<Self::Item> {
1207         self.iter.next_back()
1208     }
1209 
rfold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,1210     fn rfold<B, F>(self, init: B, f: F) -> B
1211     where
1212         F: FnMut(B, Self::Item) -> B,
1213     {
1214         self.iter.rfold(init, f)
1215     }
1216 }
1217 
1218 impl<T, S1, S2> FusedIterator for SymmetricDifference<'_, T, S1, S2>
1219 where
1220     T: Eq + Hash,
1221     S1: BuildHasher,
1222     S2: BuildHasher,
1223 {
1224 }
1225 
1226 impl<T, S1, S2> Clone for SymmetricDifference<'_, T, S1, S2> {
clone(&self) -> Self1227     fn clone(&self) -> Self {
1228         SymmetricDifference {
1229             iter: self.iter.clone(),
1230         }
1231     }
1232 }
1233 
1234 impl<T, S1, S2> fmt::Debug for SymmetricDifference<'_, T, S1, S2>
1235 where
1236     T: fmt::Debug + Eq + Hash,
1237     S1: BuildHasher,
1238     S2: BuildHasher,
1239 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1240     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1241         f.debug_list().entries(self.clone()).finish()
1242     }
1243 }
1244 
1245 /// A lazy iterator producing elements in the union of `IndexSet`s.
1246 ///
1247 /// This `struct` is created by the [`union`] method on [`IndexSet`].
1248 /// See its documentation for more.
1249 ///
1250 /// [`IndexSet`]: struct.IndexSet.html
1251 /// [`union`]: struct.IndexSet.html#method.union
1252 pub struct Union<'a, T, S> {
1253     iter: Chain<Iter<'a, T>, Difference<'a, T, S>>,
1254 }
1255 
1256 impl<'a, T, S> Iterator for Union<'a, T, S>
1257 where
1258     T: Eq + Hash,
1259     S: BuildHasher,
1260 {
1261     type Item = &'a T;
1262 
next(&mut self) -> Option<Self::Item>1263     fn next(&mut self) -> Option<Self::Item> {
1264         self.iter.next()
1265     }
1266 
size_hint(&self) -> (usize, Option<usize>)1267     fn size_hint(&self) -> (usize, Option<usize>) {
1268         self.iter.size_hint()
1269     }
1270 
fold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,1271     fn fold<B, F>(self, init: B, f: F) -> B
1272     where
1273         F: FnMut(B, Self::Item) -> B,
1274     {
1275         self.iter.fold(init, f)
1276     }
1277 }
1278 
1279 impl<T, S> DoubleEndedIterator for Union<'_, T, S>
1280 where
1281     T: Eq + Hash,
1282     S: BuildHasher,
1283 {
next_back(&mut self) -> Option<Self::Item>1284     fn next_back(&mut self) -> Option<Self::Item> {
1285         self.iter.next_back()
1286     }
1287 
rfold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B,1288     fn rfold<B, F>(self, init: B, f: F) -> B
1289     where
1290         F: FnMut(B, Self::Item) -> B,
1291     {
1292         self.iter.rfold(init, f)
1293     }
1294 }
1295 
1296 impl<T, S> FusedIterator for Union<'_, T, S>
1297 where
1298     T: Eq + Hash,
1299     S: BuildHasher,
1300 {
1301 }
1302 
1303 impl<T, S> Clone for Union<'_, T, S> {
clone(&self) -> Self1304     fn clone(&self) -> Self {
1305         Union {
1306             iter: self.iter.clone(),
1307         }
1308     }
1309 }
1310 
1311 impl<T, S> fmt::Debug for Union<'_, T, S>
1312 where
1313     T: fmt::Debug + Eq + Hash,
1314     S: BuildHasher,
1315 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1316     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1317         f.debug_list().entries(self.clone()).finish()
1318     }
1319 }
1320 
1321 impl<T, S1, S2> BitAnd<&IndexSet<T, S2>> for &IndexSet<T, S1>
1322 where
1323     T: Eq + Hash + Clone,
1324     S1: BuildHasher + Default,
1325     S2: BuildHasher,
1326 {
1327     type Output = IndexSet<T, S1>;
1328 
1329     /// Returns the set intersection, cloned into a new set.
1330     ///
1331     /// Values are collected in the same order that they appear in `self`.
bitand(self, other: &IndexSet<T, S2>) -> Self::Output1332     fn bitand(self, other: &IndexSet<T, S2>) -> Self::Output {
1333         self.intersection(other).cloned().collect()
1334     }
1335 }
1336 
1337 impl<T, S1, S2> BitOr<&IndexSet<T, S2>> for &IndexSet<T, S1>
1338 where
1339     T: Eq + Hash + Clone,
1340     S1: BuildHasher + Default,
1341     S2: BuildHasher,
1342 {
1343     type Output = IndexSet<T, S1>;
1344 
1345     /// Returns the set union, cloned into a new set.
1346     ///
1347     /// Values from `self` are collected in their original order, followed by
1348     /// values that are unique to `other` in their original order.
bitor(self, other: &IndexSet<T, S2>) -> Self::Output1349     fn bitor(self, other: &IndexSet<T, S2>) -> Self::Output {
1350         self.union(other).cloned().collect()
1351     }
1352 }
1353 
1354 impl<T, S1, S2> BitXor<&IndexSet<T, S2>> for &IndexSet<T, S1>
1355 where
1356     T: Eq + Hash + Clone,
1357     S1: BuildHasher + Default,
1358     S2: BuildHasher,
1359 {
1360     type Output = IndexSet<T, S1>;
1361 
1362     /// Returns the set symmetric-difference, cloned into a new set.
1363     ///
1364     /// Values from `self` are collected in their original order, followed by
1365     /// values from `other` in their original order.
bitxor(self, other: &IndexSet<T, S2>) -> Self::Output1366     fn bitxor(self, other: &IndexSet<T, S2>) -> Self::Output {
1367         self.symmetric_difference(other).cloned().collect()
1368     }
1369 }
1370 
1371 impl<T, S1, S2> Sub<&IndexSet<T, S2>> for &IndexSet<T, S1>
1372 where
1373     T: Eq + Hash + Clone,
1374     S1: BuildHasher + Default,
1375     S2: BuildHasher,
1376 {
1377     type Output = IndexSet<T, S1>;
1378 
1379     /// Returns the set difference, cloned into a new set.
1380     ///
1381     /// Values are collected in the same order that they appear in `self`.
sub(self, other: &IndexSet<T, S2>) -> Self::Output1382     fn sub(self, other: &IndexSet<T, S2>) -> Self::Output {
1383         self.difference(other).cloned().collect()
1384     }
1385 }
1386 
1387 #[cfg(test)]
1388 mod tests {
1389     use super::*;
1390     use std::string::String;
1391 
1392     #[test]
it_works()1393     fn it_works() {
1394         let mut set = IndexSet::new();
1395         assert_eq!(set.is_empty(), true);
1396         set.insert(1);
1397         set.insert(1);
1398         assert_eq!(set.len(), 1);
1399         assert!(set.get(&1).is_some());
1400         assert_eq!(set.is_empty(), false);
1401     }
1402 
1403     #[test]
new()1404     fn new() {
1405         let set = IndexSet::<String>::new();
1406         println!("{:?}", set);
1407         assert_eq!(set.capacity(), 0);
1408         assert_eq!(set.len(), 0);
1409         assert_eq!(set.is_empty(), true);
1410     }
1411 
1412     #[test]
insert()1413     fn insert() {
1414         let insert = [0, 4, 2, 12, 8, 7, 11, 5];
1415         let not_present = [1, 3, 6, 9, 10];
1416         let mut set = IndexSet::with_capacity(insert.len());
1417 
1418         for (i, &elt) in insert.iter().enumerate() {
1419             assert_eq!(set.len(), i);
1420             set.insert(elt);
1421             assert_eq!(set.len(), i + 1);
1422             assert_eq!(set.get(&elt), Some(&elt));
1423         }
1424         println!("{:?}", set);
1425 
1426         for &elt in &not_present {
1427             assert!(set.get(&elt).is_none());
1428         }
1429     }
1430 
1431     #[test]
insert_full()1432     fn insert_full() {
1433         let insert = vec![9, 2, 7, 1, 4, 6, 13];
1434         let present = vec![1, 6, 2];
1435         let mut set = IndexSet::with_capacity(insert.len());
1436 
1437         for (i, &elt) in insert.iter().enumerate() {
1438             assert_eq!(set.len(), i);
1439             let (index, success) = set.insert_full(elt);
1440             assert!(success);
1441             assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1442             assert_eq!(set.len(), i + 1);
1443         }
1444 
1445         let len = set.len();
1446         for &elt in &present {
1447             let (index, success) = set.insert_full(elt);
1448             assert!(!success);
1449             assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1450             assert_eq!(set.len(), len);
1451         }
1452     }
1453 
1454     #[test]
insert_2()1455     fn insert_2() {
1456         let mut set = IndexSet::with_capacity(16);
1457 
1458         let mut values = vec![];
1459         values.extend(0..16);
1460         values.extend(if cfg!(miri) { 32..64 } else { 128..267 });
1461 
1462         for &i in &values {
1463             let old_set = set.clone();
1464             set.insert(i);
1465             for value in old_set.iter() {
1466                 if set.get(value).is_none() {
1467                     println!("old_set: {:?}", old_set);
1468                     println!("set: {:?}", set);
1469                     panic!("did not find {} in set", value);
1470                 }
1471             }
1472         }
1473 
1474         for &i in &values {
1475             assert!(set.get(&i).is_some(), "did not find {}", i);
1476         }
1477     }
1478 
1479     #[test]
insert_dup()1480     fn insert_dup() {
1481         let mut elements = vec![0, 2, 4, 6, 8];
1482         let mut set: IndexSet<u8> = elements.drain(..).collect();
1483         {
1484             let (i, v) = set.get_full(&0).unwrap();
1485             assert_eq!(set.len(), 5);
1486             assert_eq!(i, 0);
1487             assert_eq!(*v, 0);
1488         }
1489         {
1490             let inserted = set.insert(0);
1491             let (i, v) = set.get_full(&0).unwrap();
1492             assert_eq!(set.len(), 5);
1493             assert_eq!(inserted, false);
1494             assert_eq!(i, 0);
1495             assert_eq!(*v, 0);
1496         }
1497     }
1498 
1499     #[test]
insert_order()1500     fn insert_order() {
1501         let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1502         let mut set = IndexSet::new();
1503 
1504         for &elt in &insert {
1505             set.insert(elt);
1506         }
1507 
1508         assert_eq!(set.iter().count(), set.len());
1509         assert_eq!(set.iter().count(), insert.len());
1510         for (a, b) in insert.iter().zip(set.iter()) {
1511             assert_eq!(a, b);
1512         }
1513         for (i, v) in (0..insert.len()).zip(set.iter()) {
1514             assert_eq!(set.get_index(i).unwrap(), v);
1515         }
1516     }
1517 
1518     #[test]
replace()1519     fn replace() {
1520         let replace = [0, 4, 2, 12, 8, 7, 11, 5];
1521         let not_present = [1, 3, 6, 9, 10];
1522         let mut set = IndexSet::with_capacity(replace.len());
1523 
1524         for (i, &elt) in replace.iter().enumerate() {
1525             assert_eq!(set.len(), i);
1526             set.replace(elt);
1527             assert_eq!(set.len(), i + 1);
1528             assert_eq!(set.get(&elt), Some(&elt));
1529         }
1530         println!("{:?}", set);
1531 
1532         for &elt in &not_present {
1533             assert!(set.get(&elt).is_none());
1534         }
1535     }
1536 
1537     #[test]
replace_full()1538     fn replace_full() {
1539         let replace = vec![9, 2, 7, 1, 4, 6, 13];
1540         let present = vec![1, 6, 2];
1541         let mut set = IndexSet::with_capacity(replace.len());
1542 
1543         for (i, &elt) in replace.iter().enumerate() {
1544             assert_eq!(set.len(), i);
1545             let (index, replaced) = set.replace_full(elt);
1546             assert!(replaced.is_none());
1547             assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1548             assert_eq!(set.len(), i + 1);
1549         }
1550 
1551         let len = set.len();
1552         for &elt in &present {
1553             let (index, replaced) = set.replace_full(elt);
1554             assert_eq!(Some(elt), replaced);
1555             assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1556             assert_eq!(set.len(), len);
1557         }
1558     }
1559 
1560     #[test]
replace_2()1561     fn replace_2() {
1562         let mut set = IndexSet::with_capacity(16);
1563 
1564         let mut values = vec![];
1565         values.extend(0..16);
1566         values.extend(if cfg!(miri) { 32..64 } else { 128..267 });
1567 
1568         for &i in &values {
1569             let old_set = set.clone();
1570             set.replace(i);
1571             for value in old_set.iter() {
1572                 if set.get(value).is_none() {
1573                     println!("old_set: {:?}", old_set);
1574                     println!("set: {:?}", set);
1575                     panic!("did not find {} in set", value);
1576                 }
1577             }
1578         }
1579 
1580         for &i in &values {
1581             assert!(set.get(&i).is_some(), "did not find {}", i);
1582         }
1583     }
1584 
1585     #[test]
replace_dup()1586     fn replace_dup() {
1587         let mut elements = vec![0, 2, 4, 6, 8];
1588         let mut set: IndexSet<u8> = elements.drain(..).collect();
1589         {
1590             let (i, v) = set.get_full(&0).unwrap();
1591             assert_eq!(set.len(), 5);
1592             assert_eq!(i, 0);
1593             assert_eq!(*v, 0);
1594         }
1595         {
1596             let replaced = set.replace(0);
1597             let (i, v) = set.get_full(&0).unwrap();
1598             assert_eq!(set.len(), 5);
1599             assert_eq!(replaced, Some(0));
1600             assert_eq!(i, 0);
1601             assert_eq!(*v, 0);
1602         }
1603     }
1604 
1605     #[test]
replace_order()1606     fn replace_order() {
1607         let replace = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1608         let mut set = IndexSet::new();
1609 
1610         for &elt in &replace {
1611             set.replace(elt);
1612         }
1613 
1614         assert_eq!(set.iter().count(), set.len());
1615         assert_eq!(set.iter().count(), replace.len());
1616         for (a, b) in replace.iter().zip(set.iter()) {
1617             assert_eq!(a, b);
1618         }
1619         for (i, v) in (0..replace.len()).zip(set.iter()) {
1620             assert_eq!(set.get_index(i).unwrap(), v);
1621         }
1622     }
1623 
1624     #[test]
grow()1625     fn grow() {
1626         let insert = [0, 4, 2, 12, 8, 7, 11];
1627         let not_present = [1, 3, 6, 9, 10];
1628         let mut set = IndexSet::with_capacity(insert.len());
1629 
1630         for (i, &elt) in insert.iter().enumerate() {
1631             assert_eq!(set.len(), i);
1632             set.insert(elt);
1633             assert_eq!(set.len(), i + 1);
1634             assert_eq!(set.get(&elt), Some(&elt));
1635         }
1636 
1637         println!("{:?}", set);
1638         for &elt in &insert {
1639             set.insert(elt * 10);
1640         }
1641         for &elt in &insert {
1642             set.insert(elt * 100);
1643         }
1644         for (i, &elt) in insert.iter().cycle().enumerate().take(100) {
1645             set.insert(elt * 100 + i as i32);
1646         }
1647         println!("{:?}", set);
1648         for &elt in &not_present {
1649             assert!(set.get(&elt).is_none());
1650         }
1651     }
1652 
1653     #[test]
reserve()1654     fn reserve() {
1655         let mut set = IndexSet::<usize>::new();
1656         assert_eq!(set.capacity(), 0);
1657         set.reserve(100);
1658         let capacity = set.capacity();
1659         assert!(capacity >= 100);
1660         for i in 0..capacity {
1661             assert_eq!(set.len(), i);
1662             set.insert(i);
1663             assert_eq!(set.len(), i + 1);
1664             assert_eq!(set.capacity(), capacity);
1665             assert_eq!(set.get(&i), Some(&i));
1666         }
1667         set.insert(capacity);
1668         assert_eq!(set.len(), capacity + 1);
1669         assert!(set.capacity() > capacity);
1670         assert_eq!(set.get(&capacity), Some(&capacity));
1671     }
1672 
1673     #[test]
shrink_to_fit()1674     fn shrink_to_fit() {
1675         let mut set = IndexSet::<usize>::new();
1676         assert_eq!(set.capacity(), 0);
1677         for i in 0..100 {
1678             assert_eq!(set.len(), i);
1679             set.insert(i);
1680             assert_eq!(set.len(), i + 1);
1681             assert!(set.capacity() >= i + 1);
1682             assert_eq!(set.get(&i), Some(&i));
1683             set.shrink_to_fit();
1684             assert_eq!(set.len(), i + 1);
1685             assert_eq!(set.capacity(), i + 1);
1686             assert_eq!(set.get(&i), Some(&i));
1687         }
1688     }
1689 
1690     #[test]
remove()1691     fn remove() {
1692         let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1693         let mut set = IndexSet::new();
1694 
1695         for &elt in &insert {
1696             set.insert(elt);
1697         }
1698 
1699         assert_eq!(set.iter().count(), set.len());
1700         assert_eq!(set.iter().count(), insert.len());
1701         for (a, b) in insert.iter().zip(set.iter()) {
1702             assert_eq!(a, b);
1703         }
1704 
1705         let remove_fail = [99, 77];
1706         let remove = [4, 12, 8, 7];
1707 
1708         for &value in &remove_fail {
1709             assert!(set.swap_remove_full(&value).is_none());
1710         }
1711         println!("{:?}", set);
1712         for &value in &remove {
1713             //println!("{:?}", set);
1714             let index = set.get_full(&value).unwrap().0;
1715             assert_eq!(set.swap_remove_full(&value), Some((index, value)));
1716         }
1717         println!("{:?}", set);
1718 
1719         for value in &insert {
1720             assert_eq!(set.get(value).is_some(), !remove.contains(value));
1721         }
1722         assert_eq!(set.len(), insert.len() - remove.len());
1723         assert_eq!(set.iter().count(), insert.len() - remove.len());
1724     }
1725 
1726     #[test]
swap_remove_index()1727     fn swap_remove_index() {
1728         let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1729         let mut set = IndexSet::new();
1730 
1731         for &elt in &insert {
1732             set.insert(elt);
1733         }
1734 
1735         let mut vector = insert.to_vec();
1736         let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1];
1737 
1738         // check that the same swap remove sequence on vec and set
1739         // have the same result.
1740         for &rm in remove_sequence {
1741             let out_vec = vector.swap_remove(rm);
1742             let out_set = set.swap_remove_index(rm).unwrap();
1743             assert_eq!(out_vec, out_set);
1744         }
1745         assert_eq!(vector.len(), set.len());
1746         for (a, b) in vector.iter().zip(set.iter()) {
1747             assert_eq!(a, b);
1748         }
1749     }
1750 
1751     #[test]
partial_eq_and_eq()1752     fn partial_eq_and_eq() {
1753         let mut set_a = IndexSet::new();
1754         set_a.insert(1);
1755         set_a.insert(2);
1756         let mut set_b = set_a.clone();
1757         assert_eq!(set_a, set_b);
1758         set_b.swap_remove(&1);
1759         assert_ne!(set_a, set_b);
1760 
1761         let set_c: IndexSet<_> = set_b.into_iter().collect();
1762         assert_ne!(set_a, set_c);
1763         assert_ne!(set_c, set_a);
1764     }
1765 
1766     #[test]
extend()1767     fn extend() {
1768         let mut set = IndexSet::new();
1769         set.extend(vec![&1, &2, &3, &4]);
1770         set.extend(vec![5, 6]);
1771         assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6]);
1772     }
1773 
1774     #[test]
comparisons()1775     fn comparisons() {
1776         let set_a: IndexSet<_> = (0..3).collect();
1777         let set_b: IndexSet<_> = (3..6).collect();
1778         let set_c: IndexSet<_> = (0..6).collect();
1779         let set_d: IndexSet<_> = (3..9).collect();
1780 
1781         assert!(!set_a.is_disjoint(&set_a));
1782         assert!(set_a.is_subset(&set_a));
1783         assert!(set_a.is_superset(&set_a));
1784 
1785         assert!(set_a.is_disjoint(&set_b));
1786         assert!(set_b.is_disjoint(&set_a));
1787         assert!(!set_a.is_subset(&set_b));
1788         assert!(!set_b.is_subset(&set_a));
1789         assert!(!set_a.is_superset(&set_b));
1790         assert!(!set_b.is_superset(&set_a));
1791 
1792         assert!(!set_a.is_disjoint(&set_c));
1793         assert!(!set_c.is_disjoint(&set_a));
1794         assert!(set_a.is_subset(&set_c));
1795         assert!(!set_c.is_subset(&set_a));
1796         assert!(!set_a.is_superset(&set_c));
1797         assert!(set_c.is_superset(&set_a));
1798 
1799         assert!(!set_c.is_disjoint(&set_d));
1800         assert!(!set_d.is_disjoint(&set_c));
1801         assert!(!set_c.is_subset(&set_d));
1802         assert!(!set_d.is_subset(&set_c));
1803         assert!(!set_c.is_superset(&set_d));
1804         assert!(!set_d.is_superset(&set_c));
1805     }
1806 
1807     #[test]
iter_comparisons()1808     fn iter_comparisons() {
1809         use std::iter::empty;
1810 
1811         fn check<'a, I1, I2>(iter1: I1, iter2: I2)
1812         where
1813             I1: Iterator<Item = &'a i32>,
1814             I2: Iterator<Item = i32>,
1815         {
1816             assert!(iter1.copied().eq(iter2));
1817         }
1818 
1819         let set_a: IndexSet<_> = (0..3).collect();
1820         let set_b: IndexSet<_> = (3..6).collect();
1821         let set_c: IndexSet<_> = (0..6).collect();
1822         let set_d: IndexSet<_> = (3..9).rev().collect();
1823 
1824         check(set_a.difference(&set_a), empty());
1825         check(set_a.symmetric_difference(&set_a), empty());
1826         check(set_a.intersection(&set_a), 0..3);
1827         check(set_a.union(&set_a), 0..3);
1828 
1829         check(set_a.difference(&set_b), 0..3);
1830         check(set_b.difference(&set_a), 3..6);
1831         check(set_a.symmetric_difference(&set_b), 0..6);
1832         check(set_b.symmetric_difference(&set_a), (3..6).chain(0..3));
1833         check(set_a.intersection(&set_b), empty());
1834         check(set_b.intersection(&set_a), empty());
1835         check(set_a.union(&set_b), 0..6);
1836         check(set_b.union(&set_a), (3..6).chain(0..3));
1837 
1838         check(set_a.difference(&set_c), empty());
1839         check(set_c.difference(&set_a), 3..6);
1840         check(set_a.symmetric_difference(&set_c), 3..6);
1841         check(set_c.symmetric_difference(&set_a), 3..6);
1842         check(set_a.intersection(&set_c), 0..3);
1843         check(set_c.intersection(&set_a), 0..3);
1844         check(set_a.union(&set_c), 0..6);
1845         check(set_c.union(&set_a), 0..6);
1846 
1847         check(set_c.difference(&set_d), 0..3);
1848         check(set_d.difference(&set_c), (6..9).rev());
1849         check(
1850             set_c.symmetric_difference(&set_d),
1851             (0..3).chain((6..9).rev()),
1852         );
1853         check(set_d.symmetric_difference(&set_c), (6..9).rev().chain(0..3));
1854         check(set_c.intersection(&set_d), 3..6);
1855         check(set_d.intersection(&set_c), (3..6).rev());
1856         check(set_c.union(&set_d), (0..6).chain((6..9).rev()));
1857         check(set_d.union(&set_c), (3..9).rev().chain(0..3));
1858     }
1859 
1860     #[test]
ops()1861     fn ops() {
1862         let empty = IndexSet::<i32>::new();
1863         let set_a: IndexSet<_> = (0..3).collect();
1864         let set_b: IndexSet<_> = (3..6).collect();
1865         let set_c: IndexSet<_> = (0..6).collect();
1866         let set_d: IndexSet<_> = (3..9).rev().collect();
1867 
1868         #[allow(clippy::eq_op)]
1869         {
1870             assert_eq!(&set_a & &set_a, set_a);
1871             assert_eq!(&set_a | &set_a, set_a);
1872             assert_eq!(&set_a ^ &set_a, empty);
1873             assert_eq!(&set_a - &set_a, empty);
1874         }
1875 
1876         assert_eq!(&set_a & &set_b, empty);
1877         assert_eq!(&set_b & &set_a, empty);
1878         assert_eq!(&set_a | &set_b, set_c);
1879         assert_eq!(&set_b | &set_a, set_c);
1880         assert_eq!(&set_a ^ &set_b, set_c);
1881         assert_eq!(&set_b ^ &set_a, set_c);
1882         assert_eq!(&set_a - &set_b, set_a);
1883         assert_eq!(&set_b - &set_a, set_b);
1884 
1885         assert_eq!(&set_a & &set_c, set_a);
1886         assert_eq!(&set_c & &set_a, set_a);
1887         assert_eq!(&set_a | &set_c, set_c);
1888         assert_eq!(&set_c | &set_a, set_c);
1889         assert_eq!(&set_a ^ &set_c, set_b);
1890         assert_eq!(&set_c ^ &set_a, set_b);
1891         assert_eq!(&set_a - &set_c, empty);
1892         assert_eq!(&set_c - &set_a, set_b);
1893 
1894         assert_eq!(&set_c & &set_d, set_b);
1895         assert_eq!(&set_d & &set_c, set_b);
1896         assert_eq!(&set_c | &set_d, &set_a | &set_d);
1897         assert_eq!(&set_d | &set_c, &set_a | &set_d);
1898         assert_eq!(&set_c ^ &set_d, &set_a | &(&set_d - &set_b));
1899         assert_eq!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b));
1900         assert_eq!(&set_c - &set_d, set_a);
1901         assert_eq!(&set_d - &set_c, &set_d - &set_b);
1902     }
1903 
1904     #[test]
1905     #[cfg(has_std)]
from_array()1906     fn from_array() {
1907         let set1 = IndexSet::from([1, 2, 3, 4]);
1908         let set2: IndexSet<_> = [1, 2, 3, 4].into();
1909 
1910         assert_eq!(set1, set2);
1911     }
1912 }
1913