1#[cfg(feature = "rayon")]
4pub use crate::rayon::set as rayon;
5
6#[cfg(feature = "std")]
7use std::collections::hash_map::RandomState;
8
9use crate::vec::{self, Vec};
10use core::cmp::Ordering;
11use core::fmt;
12use core::hash::{BuildHasher, Hash};
13use core::iter::{Chain, FromIterator};
14use core::ops::{BitAnd, BitOr, BitXor, Index, RangeBounds, Sub};
15use core::slice;
16
17use super::{Entries, Equivalent, IndexMap};
18
19type Bucket<T> = super::Bucket<T, ()>;
20
21#[cfg(feature = "std")]
63pub struct IndexSet<T, S = RandomState> {
64 map: IndexMap<T, (), S>,
65}
66#[cfg(not(feature = "std"))]
67pub struct IndexSet<T, S> {
68 map: IndexMap<T, (), S>,
69}
70
71impl<T, S> Clone for IndexSet<T, S>
72where
73 T: Clone,
74 S: Clone,
75{
76 fn clone(&self) -> Self {
77 IndexSet {
78 map: self.map.clone(),
79 }
80 }
81
82 fn clone_from(&mut self, other: &Self) {
83 self.map.clone_from(&other.map);
84 }
85}
86
87impl<T, S> Entries for IndexSet<T, S> {
88 type Entry = Bucket<T>;
89
90 #[inline]
91 fn into_entries(self) -> Vec<Self::Entry> {
92 self.map.into_entries()
93 }
94
95 #[inline]
96 fn as_entries(&self) -> &[Self::Entry] {
97 self.map.as_entries()
98 }
99
100 #[inline]
101 fn as_entries_mut(&mut self) -> &mut [Self::Entry] {
102 self.map.as_entries_mut()
103 }
104
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
113impl<T, S> fmt::Debug for IndexSet<T, S>
114where
115 T: fmt::Debug,
116{
117 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 f.debug_struct("IndexSet").field("map", &self.map).finish()
123 }
124 }
125}
126
127#[cfg(feature = "std")]
128impl<T> IndexSet<T> {
129 pub fn new() -> Self {
131 IndexSet {
132 map: IndexMap::new(),
133 }
134 }
135
136 pub fn with_capacity(n: usize) -> Self {
141 IndexSet {
142 map: IndexMap::with_capacity(n),
143 }
144 }
145}
146
147impl<T, S> IndexSet<T, S> {
148 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 pub fn with_hasher(hash_builder: S) -> Self {
160 IndexSet {
161 map: IndexMap::with_hasher(hash_builder),
162 }
163 }
164
165 pub fn capacity(&self) -> usize {
167 self.map.capacity()
168 }
169
170 pub fn hasher(&self) -> &S {
172 self.map.hasher()
173 }
174
175 pub fn len(&self) -> usize {
179 self.map.len()
180 }
181
182 pub fn is_empty(&self) -> bool {
186 self.map.is_empty()
187 }
188
189 pub fn iter(&self) -> Iter<'_, T> {
191 Iter {
192 iter: self.map.keys().iter,
193 }
194 }
195
196 pub fn clear(&mut self) {
200 self.map.clear();
201 }
202
203 pub fn truncate(&mut self, len: usize) {
207 self.map.truncate(len);
208 }
209
210 pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
224 where
225 R: RangeBounds<usize>,
226 {
227 Drain {
228 iter: self.map.drain(range).iter,
229 }
230 }
231
232 pub fn split_off(&mut self, at: usize) -> Self
240 where
241 S: Clone,
242 {
243 Self {
244 map: self.map.split_off(at),
245 }
246 }
247}
248
249impl<T, S> IndexSet<T, S>
250where
251 T: Hash + Eq,
252 S: BuildHasher,
253{
254 pub fn reserve(&mut self, additional: usize) {
258 self.map.reserve(additional);
259 }
260
261 pub fn shrink_to_fit(&mut self) {
265 self.map.shrink_to_fit();
266 }
267
268 pub fn insert(&mut self, value: T) -> bool {
277 self.map.insert(value, ()).is_none()
278 }
279
280 pub fn insert_full(&mut self, value: T) -> (usize, bool) {
290 use super::map::Entry::*;
291
292 match self.map.entry(value) {
293 Occupied(e) => (e.index(), false),
294 Vacant(e) => {
295 let index = e.index();
296 e.insert(());
297 (index, true)
298 }
299 }
300 }
301
302 pub fn difference<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Difference<'a, T, S2>
306 where
307 S2: BuildHasher,
308 {
309 Difference {
310 iter: self.iter(),
311 other,
312 }
313 }
314
315 pub fn symmetric_difference<'a, S2>(
321 &'a self,
322 other: &'a IndexSet<T, S2>,
323 ) -> SymmetricDifference<'a, T, S, S2>
324 where
325 S2: BuildHasher,
326 {
327 SymmetricDifference {
328 iter: self.difference(other).chain(other.difference(self)),
329 }
330 }
331
332 pub fn intersection<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Intersection<'a, T, S2>
336 where
337 S2: BuildHasher,
338 {
339 Intersection {
340 iter: self.iter(),
341 other,
342 }
343 }
344
345 pub fn union<'a, S2>(&'a self, other: &'a IndexSet<T, S2>) -> Union<'a, T, S>
350 where
351 S2: BuildHasher,
352 {
353 Union {
354 iter: self.iter().chain(other.difference(self)),
355 }
356 }
357
358 pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
362 where
363 Q: Hash + Equivalent<T>,
364 {
365 self.map.contains_key(value)
366 }
367
368 pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
373 where
374 Q: Hash + Equivalent<T>,
375 {
376 self.map.get_key_value(value).map(|(x, &())| x)
377 }
378
379 pub fn get_full<Q: ?Sized>(&self, value: &Q) -> Option<(usize, &T)>
381 where
382 Q: Hash + Equivalent<T>,
383 {
384 self.map.get_full(value).map(|(i, x, &())| (i, x))
385 }
386
387 pub fn get_index_of<Q: ?Sized>(&self, value: &Q) -> Option<usize>
389 where
390 Q: Hash + Equivalent<T>,
391 {
392 self.map.get_index_of(value)
393 }
394
395 pub fn replace(&mut self, value: T) -> Option<T> {
400 use super::map::Entry::*;
401
402 match self.map.entry(value) {
403 Vacant(e) => {
404 e.insert(());
405 None
406 }
407 Occupied(e) => Some(e.replace_key()),
408 }
409 }
410
411 pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
418 where
419 Q: Hash + Equivalent<T>,
420 {
421 self.swap_remove(value)
422 }
423
424 pub fn swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
434 where
435 Q: Hash + Equivalent<T>,
436 {
437 self.map.swap_remove(value).is_some()
438 }
439
440 pub fn shift_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
450 where
451 Q: Hash + Equivalent<T>,
452 {
453 self.map.shift_remove(value).is_some()
454 }
455
456 pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
465 where
466 Q: Hash + Equivalent<T>,
467 {
468 self.swap_take(value)
469 }
470
471 pub fn swap_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
482 where
483 Q: Hash + Equivalent<T>,
484 {
485 self.map.swap_remove_entry(value).map(|(x, ())| x)
486 }
487
488 pub fn shift_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
499 where
500 Q: Hash + Equivalent<T>,
501 {
502 self.map.shift_remove_entry(value).map(|(x, ())| x)
503 }
504
505 pub fn swap_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)>
513 where
514 Q: Hash + Equivalent<T>,
515 {
516 self.map.swap_remove_full(value).map(|(i, x, ())| (i, x))
517 }
518
519 pub fn shift_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)>
527 where
528 Q: Hash + Equivalent<T>,
529 {
530 self.map.shift_remove_full(value).map(|(i, x, ())| (i, x))
531 }
532
533 pub fn pop(&mut self) -> Option<T> {
537 self.map.pop().map(|(x, ())| x)
538 }
539
540 pub fn retain<F>(&mut self, mut keep: F)
548 where
549 F: FnMut(&T) -> bool,
550 {
551 self.map.retain(move |x, &mut ()| keep(x))
552 }
553
554 pub fn sort(&mut self)
558 where
559 T: Ord,
560 {
561 self.map.sort_keys()
562 }
563
564 pub fn sort_by<F>(&mut self, mut compare: F)
568 where
569 F: FnMut(&T, &T) -> Ordering,
570 {
571 self.map.sort_by(move |a, _, b, _| compare(a, b));
572 }
573
574 pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<T>
579 where
580 F: FnMut(&T, &T) -> Ordering,
581 {
582 IntoIter {
583 iter: self.map.sorted_by(move |a, &(), b, &()| cmp(a, b)).iter,
584 }
585 }
586
587 pub fn reverse(&mut self) {
591 self.map.reverse()
592 }
593}
594
595impl<T, S> IndexSet<T, S> {
596 pub fn get_index(&self, index: usize) -> Option<&T> {
602 self.as_entries().get(index).map(Bucket::key_ref)
603 }
604
605 pub fn first(&self) -> Option<&T> {
609 self.as_entries().first().map(Bucket::key_ref)
610 }
611
612 pub fn last(&self) -> Option<&T> {
616 self.as_entries().last().map(Bucket::key_ref)
617 }
618
619 pub fn swap_remove_index(&mut self, index: usize) -> Option<T> {
629 self.map.swap_remove_index(index).map(|(x, ())| x)
630 }
631
632 pub fn shift_remove_index(&mut self, index: usize) -> Option<T> {
642 self.map.shift_remove_index(index).map(|(x, ())| x)
643 }
644
645 pub fn swap_indices(&mut self, a: usize, b: usize) {
649 self.map.swap_indices(a, b)
650 }
651}
652
653impl<T, S> Index<usize> for IndexSet<T, S> {
682 type Output = T;
683
684 fn index(&self, index: usize) -> &T {
688 self.get_index(index)
689 .expect("IndexSet: index out of bounds")
690 }
691}
692
693pub struct IntoIter<T> {
701 iter: vec::IntoIter<Bucket<T>>,
702}
703
704impl<T> Iterator for IntoIter<T> {
705 type Item = T;
706
707 iterator_methods!(Bucket::key);
708}
709
710impl<T> DoubleEndedIterator for IntoIter<T> {
711 fn next_back(&mut self) -> Option<Self::Item> {
712 self.iter.next_back().map(Bucket::key)
713 }
714}
715
716impl<T> ExactSizeIterator for IntoIter<T> {
717 fn len(&self) -> usize {
718 self.iter.len()
719 }
720}
721
722impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
723 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
724 let iter = self.iter.as_slice().iter().map(Bucket::key_ref);
725 f.debug_list().entries(iter).finish()
726 }
727}
728
729pub struct Iter<'a, T> {
737 iter: slice::Iter<'a, Bucket<T>>,
738}
739
740impl<'a, T> Iterator for Iter<'a, T> {
741 type Item = &'a T;
742
743 iterator_methods!(Bucket::key_ref);
744}
745
746impl<T> DoubleEndedIterator for Iter<'_, T> {
747 fn next_back(&mut self) -> Option<Self::Item> {
748 self.iter.next_back().map(Bucket::key_ref)
749 }
750}
751
752impl<T> ExactSizeIterator for Iter<'_, T> {
753 fn len(&self) -> usize {
754 self.iter.len()
755 }
756}
757
758impl<T> Clone for Iter<'_, T> {
759 fn clone(&self) -> Self {
760 Iter {
761 iter: self.iter.clone(),
762 }
763 }
764}
765
766impl<T: fmt::Debug> fmt::Debug for Iter<'_, T> {
767 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
768 f.debug_list().entries(self.clone()).finish()
769 }
770}
771
772pub struct Drain<'a, T> {
780 iter: vec::Drain<'a, Bucket<T>>,
781}
782
783impl<T> Iterator for Drain<'_, T> {
784 type Item = T;
785
786 iterator_methods!(Bucket::key);
787}
788
789impl<T> DoubleEndedIterator for Drain<'_, T> {
790 double_ended_iterator_methods!(Bucket::key);
791}
792
793impl<'a, T, S> IntoIterator for &'a IndexSet<T, S> {
794 type Item = &'a T;
795 type IntoIter = Iter<'a, T>;
796
797 fn into_iter(self) -> Self::IntoIter {
798 self.iter()
799 }
800}
801
802impl<T, S> IntoIterator for IndexSet<T, S> {
803 type Item = T;
804 type IntoIter = IntoIter<T>;
805
806 fn into_iter(self) -> Self::IntoIter {
807 IntoIter {
808 iter: self.map.into_iter().iter,
809 }
810 }
811}
812
813impl<T, S> FromIterator<T> for IndexSet<T, S>
814where
815 T: Hash + Eq,
816 S: BuildHasher + Default,
817{
818 fn from_iter<I: IntoIterator<Item = T>>(iterable: I) -> Self {
819 let iter = iterable.into_iter().map(|x| (x, ()));
820 IndexSet {
821 map: IndexMap::from_iter(iter),
822 }
823 }
824}
825
826impl<T, S> Extend<T> for IndexSet<T, S>
827where
828 T: Hash + Eq,
829 S: BuildHasher,
830{
831 fn extend<I: IntoIterator<Item = T>>(&mut self, iterable: I) {
832 let iter = iterable.into_iter().map(|x| (x, ()));
833 self.map.extend(iter);
834 }
835}
836
837impl<'a, T, S> Extend<&'a T> for IndexSet<T, S>
838where
839 T: Hash + Eq + Copy + 'a,
840 S: BuildHasher,
841{
842 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iterable: I) {
843 let iter = iterable.into_iter().cloned(); self.extend(iter);
845 }
846}
847
848impl<T, S> Default for IndexSet<T, S>
849where
850 S: Default,
851{
852 fn default() -> Self {
854 IndexSet {
855 map: IndexMap::default(),
856 }
857 }
858}
859
860impl<T, S1, S2> PartialEq<IndexSet<T, S2>> for IndexSet<T, S1>
861where
862 T: Hash + Eq,
863 S1: BuildHasher,
864 S2: BuildHasher,
865{
866 fn eq(&self, other: &IndexSet<T, S2>) -> bool {
867 self.len() == other.len() && self.is_subset(other)
868 }
869}
870
871impl<T, S> Eq for IndexSet<T, S>
872where
873 T: Eq + Hash,
874 S: BuildHasher,
875{
876}
877
878impl<T, S> IndexSet<T, S>
879where
880 T: Eq + Hash,
881 S: BuildHasher,
882{
883 pub fn is_disjoint<S2>(&self, other: &IndexSet<T, S2>) -> bool
885 where
886 S2: BuildHasher,
887 {
888 if self.len() <= other.len() {
889 self.iter().all(move |value| !other.contains(value))
890 } else {
891 other.iter().all(move |value| !self.contains(value))
892 }
893 }
894
895 pub fn is_subset<S2>(&self, other: &IndexSet<T, S2>) -> bool
897 where
898 S2: BuildHasher,
899 {
900 self.len() <= other.len() && self.iter().all(move |value| other.contains(value))
901 }
902
903 pub fn is_superset<S2>(&self, other: &IndexSet<T, S2>) -> bool
905 where
906 S2: BuildHasher,
907 {
908 other.is_subset(self)
909 }
910}
911
912pub struct Difference<'a, T, S> {
920 iter: Iter<'a, T>,
921 other: &'a IndexSet<T, S>,
922}
923
924impl<'a, T, S> Iterator for Difference<'a, T, S>
925where
926 T: Eq + Hash,
927 S: BuildHasher,
928{
929 type Item = &'a T;
930
931 fn next(&mut self) -> Option<Self::Item> {
932 while let Some(item) = self.iter.next() {
933 if !self.other.contains(item) {
934 return Some(item);
935 }
936 }
937 None
938 }
939
940 fn size_hint(&self) -> (usize, Option<usize>) {
941 (0, self.iter.size_hint().1)
942 }
943}
944
945impl<T, S> DoubleEndedIterator for Difference<'_, T, S>
946where
947 T: Eq + Hash,
948 S: BuildHasher,
949{
950 fn next_back(&mut self) -> Option<Self::Item> {
951 while let Some(item) = self.iter.next_back() {
952 if !self.other.contains(item) {
953 return Some(item);
954 }
955 }
956 None
957 }
958}
959
960impl<T, S> Clone for Difference<'_, T, S> {
961 fn clone(&self) -> Self {
962 Difference {
963 iter: self.iter.clone(),
964 ..*self
965 }
966 }
967}
968
969impl<T, S> fmt::Debug for Difference<'_, T, S>
970where
971 T: fmt::Debug + Eq + Hash,
972 S: BuildHasher,
973{
974 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
975 f.debug_list().entries(self.clone()).finish()
976 }
977}
978
979pub struct Intersection<'a, T, S> {
987 iter: Iter<'a, T>,
988 other: &'a IndexSet<T, S>,
989}
990
991impl<'a, T, S> Iterator for Intersection<'a, T, S>
992where
993 T: Eq + Hash,
994 S: BuildHasher,
995{
996 type Item = &'a T;
997
998 fn next(&mut self) -> Option<Self::Item> {
999 while let Some(item) = self.iter.next() {
1000 if self.other.contains(item) {
1001 return Some(item);
1002 }
1003 }
1004 None
1005 }
1006
1007 fn size_hint(&self) -> (usize, Option<usize>) {
1008 (0, self.iter.size_hint().1)
1009 }
1010}
1011
1012impl<T, S> DoubleEndedIterator for Intersection<'_, T, S>
1013where
1014 T: Eq + Hash,
1015 S: BuildHasher,
1016{
1017 fn next_back(&mut self) -> Option<Self::Item> {
1018 while let Some(item) = self.iter.next_back() {
1019 if self.other.contains(item) {
1020 return Some(item);
1021 }
1022 }
1023 None
1024 }
1025}
1026
1027impl<T, S> Clone for Intersection<'_, T, S> {
1028 fn clone(&self) -> Self {
1029 Intersection {
1030 iter: self.iter.clone(),
1031 ..*self
1032 }
1033 }
1034}
1035
1036impl<T, S> fmt::Debug for Intersection<'_, T, S>
1037where
1038 T: fmt::Debug + Eq + Hash,
1039 S: BuildHasher,
1040{
1041 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1042 f.debug_list().entries(self.clone()).finish()
1043 }
1044}
1045
1046pub struct SymmetricDifference<'a, T, S1, S2> {
1054 iter: Chain<Difference<'a, T, S2>, Difference<'a, T, S1>>,
1055}
1056
1057impl<'a, T, S1, S2> Iterator for SymmetricDifference<'a, T, S1, S2>
1058where
1059 T: Eq + Hash,
1060 S1: BuildHasher,
1061 S2: BuildHasher,
1062{
1063 type Item = &'a T;
1064
1065 fn next(&mut self) -> Option<Self::Item> {
1066 self.iter.next()
1067 }
1068
1069 fn size_hint(&self) -> (usize, Option<usize>) {
1070 self.iter.size_hint()
1071 }
1072
1073 fn fold<B, F>(self, init: B, f: F) -> B
1074 where
1075 F: FnMut(B, Self::Item) -> B,
1076 {
1077 self.iter.fold(init, f)
1078 }
1079}
1080
1081impl<T, S1, S2> DoubleEndedIterator for SymmetricDifference<'_, T, S1, S2>
1082where
1083 T: Eq + Hash,
1084 S1: BuildHasher,
1085 S2: BuildHasher,
1086{
1087 fn next_back(&mut self) -> Option<Self::Item> {
1088 self.iter.next_back()
1089 }
1090}
1091
1092impl<T, S1, S2> Clone for SymmetricDifference<'_, T, S1, S2> {
1093 fn clone(&self) -> Self {
1094 SymmetricDifference {
1095 iter: self.iter.clone(),
1096 }
1097 }
1098}
1099
1100impl<T, S1, S2> fmt::Debug for SymmetricDifference<'_, T, S1, S2>
1101where
1102 T: fmt::Debug + Eq + Hash,
1103 S1: BuildHasher,
1104 S2: BuildHasher,
1105{
1106 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1107 f.debug_list().entries(self.clone()).finish()
1108 }
1109}
1110
1111pub struct Union<'a, T, S> {
1119 iter: Chain<Iter<'a, T>, Difference<'a, T, S>>,
1120}
1121
1122impl<'a, T, S> Iterator for Union<'a, T, S>
1123where
1124 T: Eq + Hash,
1125 S: BuildHasher,
1126{
1127 type Item = &'a T;
1128
1129 fn next(&mut self) -> Option<Self::Item> {
1130 self.iter.next()
1131 }
1132
1133 fn size_hint(&self) -> (usize, Option<usize>) {
1134 self.iter.size_hint()
1135 }
1136
1137 fn fold<B, F>(self, init: B, f: F) -> B
1138 where
1139 F: FnMut(B, Self::Item) -> B,
1140 {
1141 self.iter.fold(init, f)
1142 }
1143}
1144
1145impl<T, S> DoubleEndedIterator for Union<'_, T, S>
1146where
1147 T: Eq + Hash,
1148 S: BuildHasher,
1149{
1150 fn next_back(&mut self) -> Option<Self::Item> {
1151 self.iter.next_back()
1152 }
1153}
1154
1155impl<T, S> Clone for Union<'_, T, S> {
1156 fn clone(&self) -> Self {
1157 Union {
1158 iter: self.iter.clone(),
1159 }
1160 }
1161}
1162
1163impl<T, S> fmt::Debug for Union<'_, T, S>
1164where
1165 T: fmt::Debug + Eq + Hash,
1166 S: BuildHasher,
1167{
1168 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1169 f.debug_list().entries(self.clone()).finish()
1170 }
1171}
1172
1173impl<T, S1, S2> BitAnd<&IndexSet<T, S2>> for &IndexSet<T, S1>
1174where
1175 T: Eq + Hash + Clone,
1176 S1: BuildHasher + Default,
1177 S2: BuildHasher,
1178{
1179 type Output = IndexSet<T, S1>;
1180
1181 fn bitand(self, other: &IndexSet<T, S2>) -> Self::Output {
1185 self.intersection(other).cloned().collect()
1186 }
1187}
1188
1189impl<T, S1, S2> BitOr<&IndexSet<T, S2>> for &IndexSet<T, S1>
1190where
1191 T: Eq + Hash + Clone,
1192 S1: BuildHasher + Default,
1193 S2: BuildHasher,
1194{
1195 type Output = IndexSet<T, S1>;
1196
1197 fn bitor(self, other: &IndexSet<T, S2>) -> Self::Output {
1202 self.union(other).cloned().collect()
1203 }
1204}
1205
1206impl<T, S1, S2> BitXor<&IndexSet<T, S2>> for &IndexSet<T, S1>
1207where
1208 T: Eq + Hash + Clone,
1209 S1: BuildHasher + Default,
1210 S2: BuildHasher,
1211{
1212 type Output = IndexSet<T, S1>;
1213
1214 fn bitxor(self, other: &IndexSet<T, S2>) -> Self::Output {
1219 self.symmetric_difference(other).cloned().collect()
1220 }
1221}
1222
1223impl<T, S1, S2> Sub<&IndexSet<T, S2>> for &IndexSet<T, S1>
1224where
1225 T: Eq + Hash + Clone,
1226 S1: BuildHasher + Default,
1227 S2: BuildHasher,
1228{
1229 type Output = IndexSet<T, S1>;
1230
1231 fn sub(self, other: &IndexSet<T, S2>) -> Self::Output {
1235 self.difference(other).cloned().collect()
1236 }
1237}
1238
1239#[cfg(test)]
1240mod tests {
1241 use super::*;
1242 use crate::util::enumerate;
1243 use std::string::String;
1244
1245 #[test]
1246 fn it_works() {
1247 let mut set = IndexSet::new();
1248 assert_eq!(set.is_empty(), true);
1249 set.insert(1);
1250 set.insert(1);
1251 assert_eq!(set.len(), 1);
1252 assert!(set.get(&1).is_some());
1253 assert_eq!(set.is_empty(), false);
1254 }
1255
1256 #[test]
1257 fn new() {
1258 let set = IndexSet::<String>::new();
1259 println!("{:?}", set);
1260 assert_eq!(set.capacity(), 0);
1261 assert_eq!(set.len(), 0);
1262 assert_eq!(set.is_empty(), true);
1263 }
1264
1265 #[test]
1266 fn insert() {
1267 let insert = [0, 4, 2, 12, 8, 7, 11, 5];
1268 let not_present = [1, 3, 6, 9, 10];
1269 let mut set = IndexSet::with_capacity(insert.len());
1270
1271 for (i, &elt) in enumerate(&insert) {
1272 assert_eq!(set.len(), i);
1273 set.insert(elt);
1274 assert_eq!(set.len(), i + 1);
1275 assert_eq!(set.get(&elt), Some(&elt));
1276 }
1277 println!("{:?}", set);
1278
1279 for &elt in ¬_present {
1280 assert!(set.get(&elt).is_none());
1281 }
1282 }
1283
1284 #[test]
1285 fn insert_full() {
1286 let insert = vec![9, 2, 7, 1, 4, 6, 13];
1287 let present = vec![1, 6, 2];
1288 let mut set = IndexSet::with_capacity(insert.len());
1289
1290 for (i, &elt) in enumerate(&insert) {
1291 assert_eq!(set.len(), i);
1292 let (index, success) = set.insert_full(elt);
1293 assert!(success);
1294 assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1295 assert_eq!(set.len(), i + 1);
1296 }
1297
1298 let len = set.len();
1299 for &elt in &present {
1300 let (index, success) = set.insert_full(elt);
1301 assert!(!success);
1302 assert_eq!(Some(index), set.get_full(&elt).map(|x| x.0));
1303 assert_eq!(set.len(), len);
1304 }
1305 }
1306
1307 #[test]
1308 fn insert_2() {
1309 let mut set = IndexSet::with_capacity(16);
1310
1311 let mut values = vec![];
1312 values.extend(0..16);
1313 values.extend(128..267);
1314
1315 for &i in &values {
1316 let old_set = set.clone();
1317 set.insert(i);
1318 for value in old_set.iter() {
1319 if set.get(value).is_none() {
1320 println!("old_set: {:?}", old_set);
1321 println!("set: {:?}", set);
1322 panic!("did not find {} in set", value);
1323 }
1324 }
1325 }
1326
1327 for &i in &values {
1328 assert!(set.get(&i).is_some(), "did not find {}", i);
1329 }
1330 }
1331
1332 #[test]
1333 fn insert_dup() {
1334 let mut elements = vec![0, 2, 4, 6, 8];
1335 let mut set: IndexSet<u8> = elements.drain(..).collect();
1336 {
1337 let (i, v) = set.get_full(&0).unwrap();
1338 assert_eq!(set.len(), 5);
1339 assert_eq!(i, 0);
1340 assert_eq!(*v, 0);
1341 }
1342 {
1343 let inserted = set.insert(0);
1344 let (i, v) = set.get_full(&0).unwrap();
1345 assert_eq!(set.len(), 5);
1346 assert_eq!(inserted, false);
1347 assert_eq!(i, 0);
1348 assert_eq!(*v, 0);
1349 }
1350 }
1351
1352 #[test]
1353 fn insert_order() {
1354 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1355 let mut set = IndexSet::new();
1356
1357 for &elt in &insert {
1358 set.insert(elt);
1359 }
1360
1361 assert_eq!(set.iter().count(), set.len());
1362 assert_eq!(set.iter().count(), insert.len());
1363 for (a, b) in insert.iter().zip(set.iter()) {
1364 assert_eq!(a, b);
1365 }
1366 for (i, v) in (0..insert.len()).zip(set.iter()) {
1367 assert_eq!(set.get_index(i).unwrap(), v);
1368 }
1369 }
1370
1371 #[test]
1372 fn grow() {
1373 let insert = [0, 4, 2, 12, 8, 7, 11];
1374 let not_present = [1, 3, 6, 9, 10];
1375 let mut set = IndexSet::with_capacity(insert.len());
1376
1377 for (i, &elt) in enumerate(&insert) {
1378 assert_eq!(set.len(), i);
1379 set.insert(elt);
1380 assert_eq!(set.len(), i + 1);
1381 assert_eq!(set.get(&elt), Some(&elt));
1382 }
1383
1384 println!("{:?}", set);
1385 for &elt in &insert {
1386 set.insert(elt * 10);
1387 }
1388 for &elt in &insert {
1389 set.insert(elt * 100);
1390 }
1391 for (i, &elt) in insert.iter().cycle().enumerate().take(100) {
1392 set.insert(elt * 100 + i as i32);
1393 }
1394 println!("{:?}", set);
1395 for &elt in ¬_present {
1396 assert!(set.get(&elt).is_none());
1397 }
1398 }
1399
1400 #[test]
1401 fn reserve() {
1402 let mut set = IndexSet::<usize>::new();
1403 assert_eq!(set.capacity(), 0);
1404 set.reserve(100);
1405 let capacity = set.capacity();
1406 assert!(capacity >= 100);
1407 for i in 0..capacity {
1408 assert_eq!(set.len(), i);
1409 set.insert(i);
1410 assert_eq!(set.len(), i + 1);
1411 assert_eq!(set.capacity(), capacity);
1412 assert_eq!(set.get(&i), Some(&i));
1413 }
1414 set.insert(capacity);
1415 assert_eq!(set.len(), capacity + 1);
1416 assert!(set.capacity() > capacity);
1417 assert_eq!(set.get(&capacity), Some(&capacity));
1418 }
1419
1420 #[test]
1421 fn shrink_to_fit() {
1422 let mut set = IndexSet::<usize>::new();
1423 assert_eq!(set.capacity(), 0);
1424 for i in 0..100 {
1425 assert_eq!(set.len(), i);
1426 set.insert(i);
1427 assert_eq!(set.len(), i + 1);
1428 assert!(set.capacity() >= i + 1);
1429 assert_eq!(set.get(&i), Some(&i));
1430 set.shrink_to_fit();
1431 assert_eq!(set.len(), i + 1);
1432 assert_eq!(set.capacity(), i + 1);
1433 assert_eq!(set.get(&i), Some(&i));
1434 }
1435 }
1436
1437 #[test]
1438 fn remove() {
1439 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1440 let mut set = IndexSet::new();
1441
1442 for &elt in &insert {
1443 set.insert(elt);
1444 }
1445
1446 assert_eq!(set.iter().count(), set.len());
1447 assert_eq!(set.iter().count(), insert.len());
1448 for (a, b) in insert.iter().zip(set.iter()) {
1449 assert_eq!(a, b);
1450 }
1451
1452 let remove_fail = [99, 77];
1453 let remove = [4, 12, 8, 7];
1454
1455 for &value in &remove_fail {
1456 assert!(set.swap_remove_full(&value).is_none());
1457 }
1458 println!("{:?}", set);
1459 for &value in &remove {
1460 let index = set.get_full(&value).unwrap().0;
1462 assert_eq!(set.swap_remove_full(&value), Some((index, value)));
1463 }
1464 println!("{:?}", set);
1465
1466 for value in &insert {
1467 assert_eq!(set.get(value).is_some(), !remove.contains(value));
1468 }
1469 assert_eq!(set.len(), insert.len() - remove.len());
1470 assert_eq!(set.iter().count(), insert.len() - remove.len());
1471 }
1472
1473 #[test]
1474 fn swap_remove_index() {
1475 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1476 let mut set = IndexSet::new();
1477
1478 for &elt in &insert {
1479 set.insert(elt);
1480 }
1481
1482 let mut vector = insert.to_vec();
1483 let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1];
1484
1485 for &rm in remove_sequence {
1488 let out_vec = vector.swap_remove(rm);
1489 let out_set = set.swap_remove_index(rm).unwrap();
1490 assert_eq!(out_vec, out_set);
1491 }
1492 assert_eq!(vector.len(), set.len());
1493 for (a, b) in vector.iter().zip(set.iter()) {
1494 assert_eq!(a, b);
1495 }
1496 }
1497
1498 #[test]
1499 fn partial_eq_and_eq() {
1500 let mut set_a = IndexSet::new();
1501 set_a.insert(1);
1502 set_a.insert(2);
1503 let mut set_b = set_a.clone();
1504 assert_eq!(set_a, set_b);
1505 set_b.swap_remove(&1);
1506 assert_ne!(set_a, set_b);
1507
1508 let set_c: IndexSet<_> = set_b.into_iter().collect();
1509 assert_ne!(set_a, set_c);
1510 assert_ne!(set_c, set_a);
1511 }
1512
1513 #[test]
1514 fn extend() {
1515 let mut set = IndexSet::new();
1516 set.extend(vec![&1, &2, &3, &4]);
1517 set.extend(vec![5, 6]);
1518 assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6]);
1519 }
1520
1521 #[test]
1522 fn comparisons() {
1523 let set_a: IndexSet<_> = (0..3).collect();
1524 let set_b: IndexSet<_> = (3..6).collect();
1525 let set_c: IndexSet<_> = (0..6).collect();
1526 let set_d: IndexSet<_> = (3..9).collect();
1527
1528 assert!(!set_a.is_disjoint(&set_a));
1529 assert!(set_a.is_subset(&set_a));
1530 assert!(set_a.is_superset(&set_a));
1531
1532 assert!(set_a.is_disjoint(&set_b));
1533 assert!(set_b.is_disjoint(&set_a));
1534 assert!(!set_a.is_subset(&set_b));
1535 assert!(!set_b.is_subset(&set_a));
1536 assert!(!set_a.is_superset(&set_b));
1537 assert!(!set_b.is_superset(&set_a));
1538
1539 assert!(!set_a.is_disjoint(&set_c));
1540 assert!(!set_c.is_disjoint(&set_a));
1541 assert!(set_a.is_subset(&set_c));
1542 assert!(!set_c.is_subset(&set_a));
1543 assert!(!set_a.is_superset(&set_c));
1544 assert!(set_c.is_superset(&set_a));
1545
1546 assert!(!set_c.is_disjoint(&set_d));
1547 assert!(!set_d.is_disjoint(&set_c));
1548 assert!(!set_c.is_subset(&set_d));
1549 assert!(!set_d.is_subset(&set_c));
1550 assert!(!set_c.is_superset(&set_d));
1551 assert!(!set_d.is_superset(&set_c));
1552 }
1553
1554 #[test]
1555 fn iter_comparisons() {
1556 use std::iter::empty;
1557
1558 fn check<'a, I1, I2>(iter1: I1, iter2: I2)
1559 where
1560 I1: Iterator<Item = &'a i32>,
1561 I2: Iterator<Item = i32>,
1562 {
1563 assert!(iter1.cloned().eq(iter2));
1564 }
1565
1566 let set_a: IndexSet<_> = (0..3).collect();
1567 let set_b: IndexSet<_> = (3..6).collect();
1568 let set_c: IndexSet<_> = (0..6).collect();
1569 let set_d: IndexSet<_> = (3..9).rev().collect();
1570
1571 check(set_a.difference(&set_a), empty());
1572 check(set_a.symmetric_difference(&set_a), empty());
1573 check(set_a.intersection(&set_a), 0..3);
1574 check(set_a.union(&set_a), 0..3);
1575
1576 check(set_a.difference(&set_b), 0..3);
1577 check(set_b.difference(&set_a), 3..6);
1578 check(set_a.symmetric_difference(&set_b), 0..6);
1579 check(set_b.symmetric_difference(&set_a), (3..6).chain(0..3));
1580 check(set_a.intersection(&set_b), empty());
1581 check(set_b.intersection(&set_a), empty());
1582 check(set_a.union(&set_b), 0..6);
1583 check(set_b.union(&set_a), (3..6).chain(0..3));
1584
1585 check(set_a.difference(&set_c), empty());
1586 check(set_c.difference(&set_a), 3..6);
1587 check(set_a.symmetric_difference(&set_c), 3..6);
1588 check(set_c.symmetric_difference(&set_a), 3..6);
1589 check(set_a.intersection(&set_c), 0..3);
1590 check(set_c.intersection(&set_a), 0..3);
1591 check(set_a.union(&set_c), 0..6);
1592 check(set_c.union(&set_a), 0..6);
1593
1594 check(set_c.difference(&set_d), 0..3);
1595 check(set_d.difference(&set_c), (6..9).rev());
1596 check(
1597 set_c.symmetric_difference(&set_d),
1598 (0..3).chain((6..9).rev()),
1599 );
1600 check(set_d.symmetric_difference(&set_c), (6..9).rev().chain(0..3));
1601 check(set_c.intersection(&set_d), 3..6);
1602 check(set_d.intersection(&set_c), (3..6).rev());
1603 check(set_c.union(&set_d), (0..6).chain((6..9).rev()));
1604 check(set_d.union(&set_c), (3..9).rev().chain(0..3));
1605 }
1606
1607 #[test]
1608 fn ops() {
1609 let empty = IndexSet::<i32>::new();
1610 let set_a: IndexSet<_> = (0..3).collect();
1611 let set_b: IndexSet<_> = (3..6).collect();
1612 let set_c: IndexSet<_> = (0..6).collect();
1613 let set_d: IndexSet<_> = (3..9).rev().collect();
1614
1615 #[cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints, eq_op))]
1617 {
1618 assert_eq!(&set_a & &set_a, set_a);
1619 assert_eq!(&set_a | &set_a, set_a);
1620 assert_eq!(&set_a ^ &set_a, empty);
1621 assert_eq!(&set_a - &set_a, empty);
1622 }
1623
1624 assert_eq!(&set_a & &set_b, empty);
1625 assert_eq!(&set_b & &set_a, empty);
1626 assert_eq!(&set_a | &set_b, set_c);
1627 assert_eq!(&set_b | &set_a, set_c);
1628 assert_eq!(&set_a ^ &set_b, set_c);
1629 assert_eq!(&set_b ^ &set_a, set_c);
1630 assert_eq!(&set_a - &set_b, set_a);
1631 assert_eq!(&set_b - &set_a, set_b);
1632
1633 assert_eq!(&set_a & &set_c, set_a);
1634 assert_eq!(&set_c & &set_a, set_a);
1635 assert_eq!(&set_a | &set_c, set_c);
1636 assert_eq!(&set_c | &set_a, set_c);
1637 assert_eq!(&set_a ^ &set_c, set_b);
1638 assert_eq!(&set_c ^ &set_a, set_b);
1639 assert_eq!(&set_a - &set_c, empty);
1640 assert_eq!(&set_c - &set_a, set_b);
1641
1642 assert_eq!(&set_c & &set_d, set_b);
1643 assert_eq!(&set_d & &set_c, set_b);
1644 assert_eq!(&set_c | &set_d, &set_a | &set_d);
1645 assert_eq!(&set_d | &set_c, &set_a | &set_d);
1646 assert_eq!(&set_c ^ &set_d, &set_a | &(&set_d - &set_b));
1647 assert_eq!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b));
1648 assert_eq!(&set_c - &set_d, set_a);
1649 assert_eq!(&set_d - &set_c, &set_d - &set_b);
1650 }
1651}