1#![no_std]
53#![cfg_attr(feature = "bench", feature(test))]
54
55extern crate bit_vec_omnitool;
56#[cfg(test)]
57extern crate rand;
58#[cfg(feature = "bench")]
59extern crate test;
60
61#[cfg(any(test, feature = "std"))]
62extern crate std;
63
64use bit_vec_omnitool::{BitBlock, BitVec, Blocks};
65use core::cmp;
66use core::cmp::Ordering;
67use core::fmt;
68use core::hash;
69use core::iter::{self, Chain, Enumerate, FromIterator, Repeat, Skip, Take};
70
71type MatchWords<'a, B> = Chain<Enumerate<Blocks<'a, B>>, Skip<Take<Enumerate<Repeat<B>>>>>;
72
73fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
75 if bits % B::bits() == 0 {
84 bits / B::bits()
85 } else {
86 bits / B::bits() + 1
87 }
88}
89
90#[allow(clippy::iter_skip_zero)]
91fn match_words<'a, 'b, B: BitBlock>(
94 a: &'a BitVec<B>,
95 b: &'b BitVec<B>,
96) -> (MatchWords<'a, B>, MatchWords<'b, B>) {
97 let a_len = a.storage().len();
98 let b_len = b.storage().len();
99
100 if a_len < b_len {
102 (
103 a.blocks()
104 .enumerate()
105 .chain(iter::repeat(B::zero()).enumerate().take(b_len).skip(a_len)),
106 b.blocks()
107 .enumerate()
108 .chain(iter::repeat(B::zero()).enumerate().take(0).skip(0)),
109 )
110 } else {
111 (
112 a.blocks()
113 .enumerate()
114 .chain(iter::repeat(B::zero()).enumerate().take(0).skip(0)),
115 b.blocks()
116 .enumerate()
117 .chain(iter::repeat(B::zero()).enumerate().take(a_len).skip(b_len)),
118 )
119 }
120}
121
122pub struct BitSet<B = u32> {
123 bit_vec: BitVec<B>,
124}
125
126impl<B: BitBlock> Clone for BitSet<B> {
127 fn clone(&self) -> Self {
128 BitSet {
129 bit_vec: self.bit_vec.clone(),
130 }
131 }
132
133 fn clone_from(&mut self, other: &Self) {
134 self.bit_vec.clone_from(&other.bit_vec);
135 }
136}
137
138impl<B: BitBlock> Default for BitSet<B> {
139 #[inline]
140 fn default() -> Self {
141 BitSet {
142 bit_vec: Default::default(),
143 }
144 }
145}
146
147impl<B: BitBlock> FromIterator<usize> for BitSet<B> {
148 fn from_iter<I: IntoIterator<Item = usize>>(iter: I) -> Self {
149 let mut ret = Self::default();
150 ret.extend(iter);
151 ret
152 }
153}
154
155impl<B: BitBlock> Extend<usize> for BitSet<B> {
156 #[inline]
157 fn extend<I: IntoIterator<Item = usize>>(&mut self, iter: I) {
158 for i in iter {
159 self.insert(i);
160 }
161 }
162}
163
164impl<B: BitBlock> PartialOrd for BitSet<B> {
165 #[inline]
166 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
167 Some(self.cmp(other))
168 }
169}
170
171impl<B: BitBlock> Ord for BitSet<B> {
172 #[inline]
173 fn cmp(&self, other: &Self) -> Ordering {
174 self.iter().cmp(other)
175 }
176}
177
178impl<B: BitBlock> PartialEq for BitSet<B> {
179 #[inline]
180 fn eq(&self, other: &Self) -> bool {
181 self.iter().eq(other)
182 }
183}
184
185impl<B: BitBlock> Eq for BitSet<B> {}
186
187impl BitSet<u32> {
188 #[inline]
198 pub fn new() -> Self {
199 Self::default()
200 }
201
202 #[inline]
214 pub fn with_capacity(nbits: usize) -> Self {
215 let bit_vec = BitVec::from_elem(nbits, false);
216 Self::from_bit_vec(bit_vec)
217 }
218
219 #[inline]
241 pub fn from_bit_vec(bit_vec: BitVec) -> Self {
242 BitSet { bit_vec }
243 }
244
245 pub fn from_bytes(bytes: &[u8]) -> Self {
246 BitSet {
247 bit_vec: BitVec::from_bytes(bytes),
248 }
249 }
250}
251
252impl<B: BitBlock> BitSet<B> {
253 #[inline]
265 pub fn capacity(&self) -> usize {
266 self.bit_vec.capacity()
267 }
268
269 pub fn reserve_len(&mut self, len: usize) {
286 let cur_len = self.bit_vec.len();
287 if len >= cur_len {
288 self.bit_vec.reserve(len - cur_len);
289 }
290 }
291
292 pub fn reserve_len_exact(&mut self, len: usize) {
311 let cur_len = self.bit_vec.len();
312 if len >= cur_len {
313 self.bit_vec.reserve_exact(len - cur_len);
314 }
315 }
316
317 #[inline]
333 pub fn into_bit_vec(self) -> BitVec<B> {
334 self.bit_vec
335 }
336
337 #[inline]
351 pub fn get_ref(&self) -> &BitVec<B> {
352 &self.bit_vec
353 }
354
355 #[inline]
356 fn other_op<F>(&mut self, other: &Self, mut f: F)
357 where
358 F: FnMut(B, B) -> B,
359 {
360 let self_bit_vec = &mut self.bit_vec;
362 let other_bit_vec = &other.bit_vec;
363
364 let self_len = self_bit_vec.len();
365 let other_len = other_bit_vec.len();
366
367 if self_len < other_len {
369 self_bit_vec.grow(other_len - self_len, false);
370 }
371
372 let other_words = {
374 let (_, result) = match_words(self_bit_vec, other_bit_vec);
375 result
376 };
377
378 for (i, w) in other_words {
380 let old = self_bit_vec.storage()[i];
381 let new = f(old, w);
382 unsafe {
383 self_bit_vec.storage_mut()[i] = new;
384 }
385 }
386 }
387
388 #[inline]
408 pub fn shrink_to_fit(&mut self) {
409 let bit_vec = &mut self.bit_vec;
410 let old_len = bit_vec.storage().len();
412 let n = bit_vec
414 .storage()
415 .iter()
416 .rev()
417 .take_while(|&&n| n == B::zero())
418 .count();
419 let trunc_len = old_len - n;
421 unsafe {
422 bit_vec.storage_mut().truncate(trunc_len);
423 bit_vec.set_len(trunc_len * B::bits());
424 }
425 bit_vec.shrink_to_fit();
426 }
427
428 #[inline]
443 pub fn iter(&self) -> Iter<B> {
444 Iter(BlockIter::from_blocks(self.bit_vec.blocks()))
445 }
446
447 #[inline]
466 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, B> {
467 fn or<B: BitBlock>(w1: B, w2: B) -> B {
468 w1 | w2
469 }
470
471 Union(BlockIter::from_blocks(TwoBitPositions {
472 set: self.bit_vec.blocks(),
473 other: other.bit_vec.blocks(),
474 merge: or,
475 }))
476 }
477
478 #[inline]
497 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, B> {
498 fn bitand<B: BitBlock>(w1: B, w2: B) -> B {
499 w1 & w2
500 }
501 let min = cmp::min(self.bit_vec.len(), other.bit_vec.len());
502
503 Intersection {
504 iter: BlockIter::from_blocks(TwoBitPositions {
505 set: self.bit_vec.blocks(),
506 other: other.bit_vec.blocks(),
507 merge: bitand,
508 }),
509 n: min,
510 }
511 }
512
513 #[inline]
539 pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, B> {
540 fn diff<B: BitBlock>(w1: B, w2: B) -> B {
541 w1 & !w2
542 }
543
544 Difference(BlockIter::from_blocks(TwoBitPositions {
545 set: self.bit_vec.blocks(),
546 other: other.bit_vec.blocks(),
547 merge: diff,
548 }))
549 }
550
551 #[inline]
570 pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, B> {
571 fn bitxor<B: BitBlock>(w1: B, w2: B) -> B {
572 w1 ^ w2
573 }
574
575 SymmetricDifference(BlockIter::from_blocks(TwoBitPositions {
576 set: self.bit_vec.blocks(),
577 other: other.bit_vec.blocks(),
578 merge: bitxor,
579 }))
580 }
581
582 #[inline]
601 pub fn union_with(&mut self, other: &Self) {
602 self.other_op(other, |w1, w2| w1 | w2);
603 }
604
605 #[inline]
624 pub fn intersect_with(&mut self, other: &Self) {
625 self.other_op(other, |w1, w2| w1 & w2);
626 }
627
628 #[inline]
656 pub fn difference_with(&mut self, other: &Self) {
657 self.other_op(other, |w1, w2| w1 & !w2);
658 }
659
660 #[inline]
680 pub fn symmetric_difference_with(&mut self, other: &Self) {
681 self.other_op(other, |w1, w2| w1 ^ w2);
682 }
683
684 #[inline]
766 pub fn len(&self) -> usize {
767 self.bit_vec.blocks().fold(0, |acc, n| acc + n.count_ones())
768 }
769
770 #[inline]
772 pub fn is_empty(&self) -> bool {
773 self.bit_vec.none()
774 }
775
776 #[inline]
778 pub fn clear(&mut self) {
779 self.bit_vec.clear();
780 }
781
782 #[inline]
784 pub fn contains(&self, value: usize) -> bool {
785 let bit_vec = &self.bit_vec;
786 value < bit_vec.len() && bit_vec[value]
787 }
788
789 #[inline]
792 pub fn is_disjoint(&self, other: &Self) -> bool {
793 self.intersection(other).next().is_none()
794 }
795
796 #[inline]
798 pub fn is_subset(&self, other: &Self) -> bool {
799 let self_bit_vec = &self.bit_vec;
800 let other_bit_vec = &other.bit_vec;
801 let other_blocks = blocks_for_bits::<B>(other_bit_vec.len());
802
803 self_bit_vec.blocks().zip(other_bit_vec.blocks()).all(|(w1, w2)| w1 & w2 == w1) &&
805 self_bit_vec.blocks().skip(other_blocks).all(|w| w == B::zero())
807 }
808
809 #[inline]
811 pub fn is_superset(&self, other: &Self) -> bool {
812 other.is_subset(self)
813 }
814
815 pub fn insert(&mut self, value: usize) -> bool {
818 if self.contains(value) {
819 return false;
820 }
821
822 let len = self.bit_vec.len();
824 if value >= len {
825 self.bit_vec.grow(value - len + 1, false);
826 }
827
828 self.bit_vec.set(value, true);
829 true
830 }
831
832 pub fn remove(&mut self, value: usize) -> bool {
835 if !self.contains(value) {
836 return false;
837 }
838
839 self.bit_vec.set(value, false);
840
841 true
842 }
843}
844
845impl<B: BitBlock> fmt::Debug for BitSet<B> {
846 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
847 fmt.debug_set().entries(self).finish()
848 }
849}
850
851impl<B: BitBlock> hash::Hash for BitSet<B> {
852 fn hash<H: hash::Hasher>(&self, state: &mut H) {
853 for pos in self {
854 pos.hash(state);
855 }
856 }
857}
858
859#[derive(Clone)]
860struct BlockIter<T, B> {
861 head: B,
862 head_offset: usize,
863 tail: T,
864}
865
866impl<T, B: BitBlock> BlockIter<T, B>
867where
868 T: Iterator<Item = B>,
869{
870 fn from_blocks(mut blocks: T) -> BlockIter<T, B> {
871 let h = blocks.next().unwrap_or_else(B::zero);
872 BlockIter {
873 tail: blocks,
874 head: h,
875 head_offset: 0,
876 }
877 }
878}
879
880#[derive(Clone)]
882struct TwoBitPositions<'a, B: 'a> {
883 set: Blocks<'a, B>,
884 other: Blocks<'a, B>,
885 merge: fn(B, B) -> B,
886}
887
888#[derive(Clone)]
890pub struct Iter<'a, B: 'a>(BlockIter<Blocks<'a, B>, B>);
891#[derive(Clone)]
892pub struct Union<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
893#[derive(Clone)]
894pub struct Intersection<'a, B: 'a> {
895 iter: BlockIter<TwoBitPositions<'a, B>, B>,
896 n: usize,
901}
902#[derive(Clone)]
903pub struct Difference<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
904#[derive(Clone)]
905pub struct SymmetricDifference<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
906
907impl<T, B: BitBlock> Iterator for BlockIter<T, B>
908where
909 T: Iterator<Item = B>,
910{
911 type Item = usize;
912
913 fn next(&mut self) -> Option<usize> {
914 while self.head == B::zero() {
915 match self.tail.next() {
916 Some(w) => self.head = w,
917 None => return None,
918 }
919 self.head_offset += B::bits();
920 }
921
922 let k = (self.head & (!self.head + B::one())) - B::one();
927 self.head = self.head & (self.head - B::one());
929 Some(self.head_offset + (B::count_ones(k)))
931 }
932
933 fn count(self) -> usize {
934 self.head.count_ones() + self.tail.map(|block| block.count_ones()).sum::<usize>()
935 }
936
937 #[inline]
938 fn size_hint(&self) -> (usize, Option<usize>) {
939 match self.tail.size_hint() {
940 (_, Some(h)) => (0, Some((1 + h) * B::bits())),
941 _ => (0, None),
942 }
943 }
944}
945
946impl<'a, B: BitBlock> Iterator for TwoBitPositions<'a, B> {
947 type Item = B;
948
949 fn next(&mut self) -> Option<B> {
950 match (self.set.next(), self.other.next()) {
951 (Some(a), Some(b)) => Some((self.merge)(a, b)),
952 (Some(a), None) => Some((self.merge)(a, B::zero())),
953 (None, Some(b)) => Some((self.merge)(B::zero(), b)),
954 _ => None,
955 }
956 }
957
958 #[inline]
959 fn size_hint(&self) -> (usize, Option<usize>) {
960 let (a, au) = self.set.size_hint();
961 let (b, bu) = self.other.size_hint();
962
963 let upper = match (au, bu) {
964 (Some(au), Some(bu)) => Some(cmp::max(au, bu)),
965 _ => None,
966 };
967
968 (cmp::max(a, b), upper)
969 }
970}
971
972impl<'a, B: BitBlock> Iterator for Iter<'a, B> {
973 type Item = usize;
974
975 #[inline]
976 fn next(&mut self) -> Option<usize> {
977 self.0.next()
978 }
979 #[inline]
980 fn size_hint(&self) -> (usize, Option<usize>) {
981 self.0.size_hint()
982 }
983 #[inline]
984 fn count(self) -> usize {
985 self.0.count()
986 }
987}
988
989impl<'a, B: BitBlock> Iterator for Union<'a, B> {
990 type Item = usize;
991
992 #[inline]
993 fn next(&mut self) -> Option<usize> {
994 self.0.next()
995 }
996 #[inline]
997 fn size_hint(&self) -> (usize, Option<usize>) {
998 self.0.size_hint()
999 }
1000 #[inline]
1001 fn count(self) -> usize {
1002 self.0.count()
1003 }
1004}
1005
1006impl<'a, B: BitBlock> Iterator for Intersection<'a, B> {
1007 type Item = usize;
1008
1009 #[inline]
1010 fn next(&mut self) -> Option<usize> {
1011 if self.n != 0 {
1012 self.n -= 1;
1013 self.iter.next()
1014 } else {
1015 None
1016 }
1017 }
1018 #[inline]
1019 fn size_hint(&self) -> (usize, Option<usize>) {
1020 (0, Some(self.n))
1026 }
1027 #[inline]
1028 fn count(self) -> usize {
1029 self.iter.count()
1030 }
1031}
1032
1033impl<'a, B: BitBlock> Iterator for Difference<'a, B> {
1034 type Item = usize;
1035
1036 #[inline]
1037 fn next(&mut self) -> Option<usize> {
1038 self.0.next()
1039 }
1040 #[inline]
1041 fn size_hint(&self) -> (usize, Option<usize>) {
1042 self.0.size_hint()
1043 }
1044 #[inline]
1045 fn count(self) -> usize {
1046 self.0.count()
1047 }
1048}
1049
1050impl<'a, B: BitBlock> Iterator for SymmetricDifference<'a, B> {
1051 type Item = usize;
1052
1053 #[inline]
1054 fn next(&mut self) -> Option<usize> {
1055 self.0.next()
1056 }
1057 #[inline]
1058 fn size_hint(&self) -> (usize, Option<usize>) {
1059 self.0.size_hint()
1060 }
1061 #[inline]
1062 fn count(self) -> usize {
1063 self.0.count()
1064 }
1065}
1066
1067impl<'a, B: BitBlock> IntoIterator for &'a BitSet<B> {
1068 type Item = usize;
1069 type IntoIter = Iter<'a, B>;
1070
1071 fn into_iter(self) -> Iter<'a, B> {
1072 self.iter()
1073 }
1074}
1075
1076#[cfg(test)]
1077mod tests {
1078 use super::BitSet;
1079 use bit_vec_omnitool::BitVec;
1080 use std::cmp::Ordering::{Equal, Greater, Less};
1081 use std::vec::Vec;
1082 use std::{format, vec};
1083
1084 #[test]
1085 fn test_bit_set_show() {
1086 let mut s = BitSet::new();
1087 s.insert(1);
1088 s.insert(10);
1089 s.insert(50);
1090 s.insert(2);
1091 assert_eq!("{1, 2, 10, 50}", format!("{:?}", s));
1092 }
1093
1094 #[test]
1095 fn test_bit_set_from_usizes() {
1096 let usizes = vec![0, 2, 2, 3];
1097 let a: BitSet = usizes.into_iter().collect();
1098 let mut b = BitSet::new();
1099 b.insert(0);
1100 b.insert(2);
1101 b.insert(3);
1102 assert_eq!(a, b);
1103 }
1104
1105 #[test]
1106 fn test_bit_set_iterator() {
1107 let usizes = vec![0, 2, 2, 3];
1108 let bit_vec: BitSet = usizes.into_iter().collect();
1109
1110 let idxs: Vec<_> = bit_vec.iter().collect();
1111 assert_eq!(idxs, [0, 2, 3]);
1112 assert_eq!(bit_vec.iter().count(), 3);
1113
1114 let long: BitSet = (0..10000).filter(|&n| n % 2 == 0).collect();
1115 let real: Vec<_> = (0..10000 / 2).map(|x| x * 2).collect();
1116
1117 let idxs: Vec<_> = long.iter().collect();
1118 assert_eq!(idxs, real);
1119 assert_eq!(long.iter().count(), real.len());
1120 }
1121
1122 #[test]
1123 fn test_bit_set_frombit_vec_init() {
1124 let bools = [true, false];
1125 let lengths = [10, 64, 100];
1126 for &b in &bools {
1127 for &l in &lengths {
1128 let bitset = BitSet::from_bit_vec(BitVec::from_elem(l, b));
1129 assert_eq!(bitset.contains(1), b);
1130 assert_eq!(bitset.contains(l - 1), b);
1131 assert!(!bitset.contains(l));
1132 }
1133 }
1134 }
1135
1136 #[test]
1137 fn test_bit_vec_masking() {
1138 let b = BitVec::from_elem(140, true);
1139 let mut bs = BitSet::from_bit_vec(b);
1140 assert!(bs.contains(139));
1141 assert!(!bs.contains(140));
1142 assert!(bs.insert(150));
1143 assert!(!bs.contains(140));
1144 assert!(!bs.contains(149));
1145 assert!(bs.contains(150));
1146 assert!(!bs.contains(151));
1147 }
1148
1149 #[test]
1150 fn test_bit_set_basic() {
1151 let mut b = BitSet::new();
1152 assert!(b.insert(3));
1153 assert!(!b.insert(3));
1154 assert!(b.contains(3));
1155 assert!(b.insert(4));
1156 assert!(!b.insert(4));
1157 assert!(b.contains(3));
1158 assert!(b.insert(400));
1159 assert!(!b.insert(400));
1160 assert!(b.contains(400));
1161 assert_eq!(b.len(), 3);
1162 }
1163
1164 #[test]
1165 fn test_bit_set_intersection() {
1166 let mut a = BitSet::new();
1167 let mut b = BitSet::new();
1168
1169 assert!(a.insert(11));
1170 assert!(a.insert(1));
1171 assert!(a.insert(3));
1172 assert!(a.insert(77));
1173 assert!(a.insert(103));
1174 assert!(a.insert(5));
1175
1176 assert!(b.insert(2));
1177 assert!(b.insert(11));
1178 assert!(b.insert(77));
1179 assert!(b.insert(5));
1180 assert!(b.insert(3));
1181
1182 let expected = [3, 5, 11, 77];
1183 let actual: Vec<_> = a.intersection(&b).collect();
1184 assert_eq!(actual, expected);
1185 assert_eq!(a.intersection(&b).count(), expected.len());
1186 }
1187
1188 #[test]
1189 fn test_bit_set_difference() {
1190 let mut a = BitSet::new();
1191 let mut b = BitSet::new();
1192
1193 assert!(a.insert(1));
1194 assert!(a.insert(3));
1195 assert!(a.insert(5));
1196 assert!(a.insert(200));
1197 assert!(a.insert(500));
1198
1199 assert!(b.insert(3));
1200 assert!(b.insert(200));
1201
1202 let expected = [1, 5, 500];
1203 let actual: Vec<_> = a.difference(&b).collect();
1204 assert_eq!(actual, expected);
1205 assert_eq!(a.difference(&b).count(), expected.len());
1206 }
1207
1208 #[test]
1209 fn test_bit_set_symmetric_difference() {
1210 let mut a = BitSet::new();
1211 let mut b = BitSet::new();
1212
1213 assert!(a.insert(1));
1214 assert!(a.insert(3));
1215 assert!(a.insert(5));
1216 assert!(a.insert(9));
1217 assert!(a.insert(11));
1218
1219 assert!(b.insert(3));
1220 assert!(b.insert(9));
1221 assert!(b.insert(14));
1222 assert!(b.insert(220));
1223
1224 let expected = [1, 5, 11, 14, 220];
1225 let actual: Vec<_> = a.symmetric_difference(&b).collect();
1226 assert_eq!(actual, expected);
1227 assert_eq!(a.symmetric_difference(&b).count(), expected.len());
1228 }
1229
1230 #[test]
1231 fn test_bit_set_union() {
1232 let mut a = BitSet::new();
1233 let mut b = BitSet::new();
1234 assert!(a.insert(1));
1235 assert!(a.insert(3));
1236 assert!(a.insert(5));
1237 assert!(a.insert(9));
1238 assert!(a.insert(11));
1239 assert!(a.insert(160));
1240 assert!(a.insert(19));
1241 assert!(a.insert(24));
1242 assert!(a.insert(200));
1243
1244 assert!(b.insert(1));
1245 assert!(b.insert(5));
1246 assert!(b.insert(9));
1247 assert!(b.insert(13));
1248 assert!(b.insert(19));
1249
1250 let expected = [1, 3, 5, 9, 11, 13, 19, 24, 160, 200];
1251 let actual: Vec<_> = a.union(&b).collect();
1252 assert_eq!(actual, expected);
1253 assert_eq!(a.union(&b).count(), expected.len());
1254 }
1255
1256 #[test]
1257 fn test_bit_set_subset() {
1258 let mut set1 = BitSet::new();
1259 let mut set2 = BitSet::new();
1260
1261 assert!(set1.is_subset(&set2)); set2.insert(100);
1263 assert!(set1.is_subset(&set2)); set2.insert(200);
1265 assert!(set1.is_subset(&set2)); set1.insert(200);
1267 assert!(set1.is_subset(&set2)); set1.insert(300);
1269 assert!(!set1.is_subset(&set2)); set2.insert(300);
1271 assert!(set1.is_subset(&set2)); set2.insert(400);
1273 assert!(set1.is_subset(&set2)); set2.remove(100);
1275 assert!(set1.is_subset(&set2)); set2.remove(300);
1277 assert!(!set1.is_subset(&set2)); set1.remove(300);
1279 assert!(set1.is_subset(&set2)); }
1281
1282 #[test]
1283 fn test_bit_set_is_disjoint() {
1284 let a = BitSet::from_bytes(&[0b10100010]);
1285 let b = BitSet::from_bytes(&[0b01000000]);
1286 let c = BitSet::new();
1287 let d = BitSet::from_bytes(&[0b00110000]);
1288
1289 assert!(!a.is_disjoint(&d));
1290 assert!(!d.is_disjoint(&a));
1291
1292 assert!(a.is_disjoint(&b));
1293 assert!(a.is_disjoint(&c));
1294 assert!(b.is_disjoint(&a));
1295 assert!(b.is_disjoint(&c));
1296 assert!(c.is_disjoint(&a));
1297 assert!(c.is_disjoint(&b));
1298 }
1299
1300 #[test]
1301 fn test_bit_set_union_with() {
1302 let mut a = BitSet::new();
1304 a.insert(0);
1305 let mut b = BitSet::new();
1306 b.insert(5);
1307 let expected = BitSet::from_bytes(&[0b10000100]);
1308 a.union_with(&b);
1309 assert_eq!(a, expected);
1310
1311 let mut a = BitSet::from_bytes(&[0b10100010]);
1313 let mut b = BitSet::from_bytes(&[0b01100010]);
1314 let c = a.clone();
1315 a.union_with(&b);
1316 b.union_with(&c);
1317 assert_eq!(a.len(), 4);
1318 assert_eq!(b.len(), 4);
1319 }
1320
1321 #[test]
1322 fn test_bit_set_intersect_with() {
1323 let mut a = BitSet::from_bytes(&[0b10100010]);
1325 let mut b = BitSet::from_bytes(&[0b00000000]);
1326 let c = a.clone();
1327 a.intersect_with(&b);
1328 b.intersect_with(&c);
1329 assert!(a.is_empty());
1330 assert!(b.is_empty());
1331
1332 let mut a = BitSet::from_bytes(&[0b10100010]);
1334 let mut b = BitSet::new();
1335 let c = a.clone();
1336 a.intersect_with(&b);
1337 b.intersect_with(&c);
1338 assert!(a.is_empty());
1339 assert!(b.is_empty());
1340
1341 let mut a = BitSet::from_bytes(&[0b10100010]);
1343 let mut b = BitSet::from_bytes(&[0b01100010]);
1344 let c = a.clone();
1345 a.intersect_with(&b);
1346 b.intersect_with(&c);
1347 assert_eq!(a.len(), 2);
1348 assert_eq!(b.len(), 2);
1349 }
1350
1351 #[test]
1352 fn test_bit_set_difference_with() {
1353 let mut a = BitSet::from_bytes(&[0b00000000]);
1355 let b = BitSet::from_bytes(&[0b10100010]);
1356 a.difference_with(&b);
1357 assert!(a.is_empty());
1358
1359 let mut a = BitSet::new();
1361 let b = BitSet::from_bytes(&[0b11111111]);
1362 a.difference_with(&b);
1363 assert!(a.is_empty());
1364
1365 let mut a = BitSet::from_bytes(&[0b10100010]);
1367 let mut b = BitSet::from_bytes(&[0b01100010]);
1368 let c = a.clone();
1369 a.difference_with(&b);
1370 b.difference_with(&c);
1371 assert_eq!(a.len(), 1);
1372 assert_eq!(b.len(), 1);
1373 }
1374
1375 #[test]
1376 fn test_bit_set_symmetric_difference_with() {
1377 let mut a = BitSet::new();
1379 a.insert(0);
1380 a.insert(1);
1381 let mut b = BitSet::new();
1382 b.insert(1);
1383 b.insert(5);
1384 let expected = BitSet::from_bytes(&[0b10000100]);
1385 a.symmetric_difference_with(&b);
1386 assert_eq!(a, expected);
1387
1388 let mut a = BitSet::from_bytes(&[0b10100010]);
1389 let b = BitSet::new();
1390 let c = a.clone();
1391 a.symmetric_difference_with(&b);
1392 assert_eq!(a, c);
1393
1394 let mut a = BitSet::from_bytes(&[0b11100010]);
1396 let mut b = BitSet::from_bytes(&[0b01101010]);
1397 let c = a.clone();
1398 a.symmetric_difference_with(&b);
1399 b.symmetric_difference_with(&c);
1400 assert_eq!(a.len(), 2);
1401 assert_eq!(b.len(), 2);
1402 }
1403
1404 #[test]
1405 fn test_bit_set_eq() {
1406 let a = BitSet::from_bytes(&[0b10100010]);
1407 let b = BitSet::from_bytes(&[0b00000000]);
1408 let c = BitSet::new();
1409
1410 assert!(a == a);
1411 assert!(a != b);
1412 assert!(a != c);
1413 assert!(b == b);
1414 assert!(b == c);
1415 assert!(c == c);
1416 }
1417
1418 #[test]
1419 fn test_bit_set_cmp() {
1420 let a = BitSet::from_bytes(&[0b10100010]);
1421 let b = BitSet::from_bytes(&[0b00000000]);
1422 let c = BitSet::new();
1423
1424 assert_eq!(a.cmp(&b), Greater);
1425 assert_eq!(a.cmp(&c), Greater);
1426 assert_eq!(b.cmp(&a), Less);
1427 assert_eq!(b.cmp(&c), Equal);
1428 assert_eq!(c.cmp(&a), Less);
1429 assert_eq!(c.cmp(&b), Equal);
1430 }
1431
1432 #[test]
1433 fn test_bit_set_shrink_to_fit_new() {
1434 let mut a = BitSet::new();
1438 assert_eq!(a.len(), 0);
1439 assert_eq!(a.capacity(), 0);
1440 a.shrink_to_fit();
1441 assert_eq!(a.len(), 0);
1442 assert_eq!(a.capacity(), 0);
1443 assert!(!a.contains(1));
1444 a.insert(3);
1445 assert!(a.contains(3));
1446 assert_eq!(a.len(), 1);
1447 assert!(a.capacity() > 0);
1448 a.shrink_to_fit();
1449 assert!(a.contains(3));
1450 assert_eq!(a.len(), 1);
1451 assert!(a.capacity() > 0);
1452 }
1453
1454 #[test]
1455 fn test_bit_set_shrink_to_fit() {
1456 let mut a = BitSet::new();
1457 assert_eq!(a.len(), 0);
1458 assert_eq!(a.capacity(), 0);
1459 a.insert(259);
1460 a.insert(98);
1461 a.insert(3);
1462 assert_eq!(a.len(), 3);
1463 assert!(a.capacity() > 0);
1464 assert!(!a.contains(1));
1465 assert!(a.contains(259));
1466 assert!(a.contains(98));
1467 assert!(a.contains(3));
1468
1469 a.shrink_to_fit();
1470 assert!(!a.contains(1));
1471 assert!(a.contains(259));
1472 assert!(a.contains(98));
1473 assert!(a.contains(3));
1474 assert_eq!(a.len(), 3);
1475 assert!(a.capacity() > 0);
1476
1477 let old_cap = a.capacity();
1478 assert!(a.remove(259));
1479 a.shrink_to_fit();
1480 assert!(a.capacity() < old_cap, "{} {}", a.capacity(), old_cap);
1481 assert!(!a.contains(1));
1482 assert!(!a.contains(259));
1483 assert!(a.contains(98));
1484 assert!(a.contains(3));
1485 assert_eq!(a.len(), 2);
1486
1487 let old_cap2 = a.capacity();
1488 a.clear();
1489 assert_eq!(a.capacity(), old_cap2);
1490 assert_eq!(a.len(), 0);
1491 assert!(!a.contains(1));
1492 assert!(!a.contains(259));
1493 assert!(!a.contains(98));
1494 assert!(!a.contains(3));
1495
1496 a.insert(512);
1497 assert!(a.capacity() > 0);
1498 assert_eq!(a.len(), 1);
1499 assert!(a.contains(512));
1500 assert!(!a.contains(1));
1501 assert!(!a.contains(259));
1502 assert!(!a.contains(98));
1503 assert!(!a.contains(3));
1504
1505 a.remove(512);
1506 a.shrink_to_fit();
1507 assert_eq!(a.capacity(), 0);
1508 assert_eq!(a.len(), 0);
1509 assert!(!a.contains(512));
1510 assert!(!a.contains(1));
1511 assert!(!a.contains(259));
1512 assert!(!a.contains(98));
1513 assert!(!a.contains(3));
1514 assert!(!a.contains(0));
1515 }
1516
1517 #[test]
1518 fn test_bit_vec_remove() {
1519 let mut a = BitSet::new();
1520
1521 assert!(a.insert(1));
1522 assert!(a.remove(1));
1523
1524 assert!(a.insert(100));
1525 assert!(a.remove(100));
1526
1527 assert!(a.insert(1000));
1528 assert!(a.remove(1000));
1529 a.shrink_to_fit();
1530 }
1531
1532 #[test]
1533 fn test_bit_vec_clone() {
1534 let mut a = BitSet::new();
1535
1536 assert!(a.insert(1));
1537 assert!(a.insert(100));
1538 assert!(a.insert(1000));
1539
1540 let mut b = a.clone();
1541
1542 assert!(a == b);
1543
1544 assert!(b.remove(1));
1545 assert!(a.contains(1));
1546
1547 assert!(a.remove(1000));
1548 assert!(b.contains(1000));
1549 }
1550
1551 }
1614
1615#[cfg(feature = "bench")]
1616mod bench {
1617 use super::BitSet;
1618 use bit_vec::BitVec;
1619 use rand::{rngs::ThreadRng, thread_rng, RngCore};
1620
1621 use test::{black_box, Bencher};
1622
1623 const BENCH_BITS: usize = 1 << 14;
1624 const BITS: usize = 32;
1625
1626 fn rng() -> ThreadRng {
1627 thread_rng()
1628 }
1629
1630 #[bench]
1631 fn bench_bit_vecset_small(b: &mut Bencher) {
1632 let mut r = rng();
1633 let mut bit_vec = BitSet::new();
1634 b.iter(|| {
1635 for _ in 0..100 {
1636 bit_vec.insert((r.next_u32() as usize) % BITS);
1637 }
1638 black_box(&bit_vec);
1639 });
1640 }
1641
1642 #[bench]
1643 fn bench_bit_vecset_big(b: &mut Bencher) {
1644 let mut r = rng();
1645 let mut bit_vec = BitSet::new();
1646 b.iter(|| {
1647 for _ in 0..100 {
1648 bit_vec.insert((r.next_u32() as usize) % BENCH_BITS);
1649 }
1650 black_box(&bit_vec);
1651 });
1652 }
1653
1654 #[bench]
1655 fn bench_bit_vecset_iter(b: &mut Bencher) {
1656 let bit_vec = BitSet::from_bit_vec(BitVec::from_fn(BENCH_BITS, |idx| idx % 3 == 0));
1657 b.iter(|| {
1658 let mut sum = 0;
1659 for idx in &bit_vec {
1660 sum += idx as usize;
1661 }
1662 sum
1663 })
1664 }
1665}