1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use std
::cmp
::Ordering
::{Equal, Greater, Less}
;
12 use std
::collections
::{BitSet, BitVec}
;
15 fn test_bit_set_show() {
16 let mut s
= BitSet
::new();
21 assert_eq
!("{1, 2, 10, 50}", format
!("{:?}", s
));
25 fn test_bit_set_from_usizes() {
26 let usizes
= vec
![0, 2, 2, 3];
27 let a
: BitSet
= usizes
.into_iter().collect();
28 let mut b
= BitSet
::new();
36 fn test_bit_set_iterator() {
37 let usizes
= vec
![0, 2, 2, 3];
38 let bit_vec
: BitSet
= usizes
.into_iter().collect();
40 let idxs
: Vec
<_
> = bit_vec
.iter().collect();
41 assert_eq
!(idxs
, [0, 2, 3]);
43 let long
: BitSet
= (0..10000).filter(|&n
| n
% 2 == 0).collect();
44 let real
: Vec
<_
> = (0..10000).step_by(2).collect();
46 let idxs
: Vec
<_
> = long
.iter().collect();
47 assert_eq
!(idxs
, real
);
51 fn test_bit_set_frombit_vec_init() {
52 let bools
= [true, false];
53 let lengths
= [10, 64, 100];
56 let bitset
= BitSet
::from_bit_vec(BitVec
::from_elem(l
, b
));
57 assert_eq
!(bitset
.contains(&1), b
);
58 assert_eq
!(bitset
.contains(&(l
-1)), b
);
59 assert
!(!bitset
.contains(&l
));
65 fn test_bit_vec_masking() {
66 let b
= BitVec
::from_elem(140, true);
67 let mut bs
= BitSet
::from_bit_vec(b
);
68 assert
!(bs
.contains(&139));
69 assert
!(!bs
.contains(&140));
70 assert
!(bs
.insert(150));
71 assert
!(!bs
.contains(&140));
72 assert
!(!bs
.contains(&149));
73 assert
!(bs
.contains(&150));
74 assert
!(!bs
.contains(&151));
78 fn test_bit_set_basic() {
79 let mut b
= BitSet
::new();
81 assert
!(!b
.insert(3));
82 assert
!(b
.contains(&3));
84 assert
!(!b
.insert(4));
85 assert
!(b
.contains(&3));
86 assert
!(b
.insert(400));
87 assert
!(!b
.insert(400));
88 assert
!(b
.contains(&400));
89 assert_eq
!(b
.len(), 3);
93 fn test_bit_set_intersection() {
94 let mut a
= BitSet
::new();
95 let mut b
= BitSet
::new();
97 assert
!(a
.insert(11));
100 assert
!(a
.insert(77));
101 assert
!(a
.insert(103));
102 assert
!(a
.insert(5));
104 assert
!(b
.insert(2));
105 assert
!(b
.insert(11));
106 assert
!(b
.insert(77));
107 assert
!(b
.insert(5));
108 assert
!(b
.insert(3));
110 let expected
= [3, 5, 11, 77];
111 let actual
: Vec
<_
> = a
.intersection(&b
).collect();
112 assert_eq
!(actual
, expected
);
116 fn test_bit_set_difference() {
117 let mut a
= BitSet
::new();
118 let mut b
= BitSet
::new();
120 assert
!(a
.insert(1));
121 assert
!(a
.insert(3));
122 assert
!(a
.insert(5));
123 assert
!(a
.insert(200));
124 assert
!(a
.insert(500));
126 assert
!(b
.insert(3));
127 assert
!(b
.insert(200));
129 let expected
= [1, 5, 500];
130 let actual
: Vec
<_
> = a
.difference(&b
).collect();
131 assert_eq
!(actual
, expected
);
135 fn test_bit_set_symmetric_difference() {
136 let mut a
= BitSet
::new();
137 let mut b
= BitSet
::new();
139 assert
!(a
.insert(1));
140 assert
!(a
.insert(3));
141 assert
!(a
.insert(5));
142 assert
!(a
.insert(9));
143 assert
!(a
.insert(11));
145 assert
!(b
.insert(3));
146 assert
!(b
.insert(9));
147 assert
!(b
.insert(14));
148 assert
!(b
.insert(220));
150 let expected
= [1, 5, 11, 14, 220];
151 let actual
: Vec
<_
> = a
.symmetric_difference(&b
).collect();
152 assert_eq
!(actual
, expected
);
156 fn test_bit_set_union() {
157 let mut a
= BitSet
::new();
158 let mut b
= BitSet
::new();
159 assert
!(a
.insert(1));
160 assert
!(a
.insert(3));
161 assert
!(a
.insert(5));
162 assert
!(a
.insert(9));
163 assert
!(a
.insert(11));
164 assert
!(a
.insert(160));
165 assert
!(a
.insert(19));
166 assert
!(a
.insert(24));
167 assert
!(a
.insert(200));
169 assert
!(b
.insert(1));
170 assert
!(b
.insert(5));
171 assert
!(b
.insert(9));
172 assert
!(b
.insert(13));
173 assert
!(b
.insert(19));
175 let expected
= [1, 3, 5, 9, 11, 13, 19, 24, 160, 200];
176 let actual
: Vec
<_
> = a
.union(&b
).collect();
177 assert_eq
!(actual
, expected
);
181 fn test_bit_set_subset() {
182 let mut set1
= BitSet
::new();
183 let mut set2
= BitSet
::new();
185 assert
!(set1
.is_subset(&set2
)); // {} {}
187 assert
!(set1
.is_subset(&set2
)); // {} { 1 }
189 assert
!(set1
.is_subset(&set2
)); // {} { 1, 2 }
191 assert
!(set1
.is_subset(&set2
)); // { 2 } { 1, 2 }
193 assert
!(!set1
.is_subset(&set2
)); // { 2, 3 } { 1, 2 }
195 assert
!(set1
.is_subset(&set2
)); // { 2, 3 } { 1, 2, 3 }
197 assert
!(set1
.is_subset(&set2
)); // { 2, 3 } { 1, 2, 3, 4 }
199 assert
!(set1
.is_subset(&set2
)); // { 2, 3 } { 2, 3, 4 }
201 assert
!(!set1
.is_subset(&set2
)); // { 2, 3 } { 2, 4 }
203 assert
!(set1
.is_subset(&set2
)); // { 2 } { 2, 4 }
207 fn test_bit_set_is_disjoint() {
208 let a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
209 let b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01000000]));
210 let c
= BitSet
::new();
211 let d
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00110000]));
213 assert
!(!a
.is_disjoint(&d
));
214 assert
!(!d
.is_disjoint(&a
));
216 assert
!(a
.is_disjoint(&b
));
217 assert
!(a
.is_disjoint(&c
));
218 assert
!(b
.is_disjoint(&a
));
219 assert
!(b
.is_disjoint(&c
));
220 assert
!(c
.is_disjoint(&a
));
221 assert
!(c
.is_disjoint(&b
));
225 fn test_bit_set_union_with() {
226 //a should grow to include larger elements
227 let mut a
= BitSet
::new();
229 let mut b
= BitSet
::new();
231 let expected
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10000100]));
233 assert_eq
!(a
, expected
);
236 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
237 let mut b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01100010]));
241 assert_eq
!(a
.len(), 4);
242 assert_eq
!(b
.len(), 4);
246 fn test_bit_set_intersect_with() {
247 // Explicitly 0'ed bits
248 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
249 let mut b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00000000]));
251 a
.intersect_with(&b
);
252 b
.intersect_with(&c
);
253 assert
!(a
.is_empty());
254 assert
!(b
.is_empty());
256 // Uninitialized bits should behave like 0's
257 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
258 let mut b
= BitSet
::new();
260 a
.intersect_with(&b
);
261 b
.intersect_with(&c
);
262 assert
!(a
.is_empty());
263 assert
!(b
.is_empty());
266 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
267 let mut b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01100010]));
269 a
.intersect_with(&b
);
270 b
.intersect_with(&c
);
271 assert_eq
!(a
.len(), 2);
272 assert_eq
!(b
.len(), 2);
276 fn test_bit_set_difference_with() {
277 // Explicitly 0'ed bits
278 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00000000]));
279 let b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
280 a
.difference_with(&b
);
281 assert
!(a
.is_empty());
283 // Uninitialized bits should behave like 0's
284 let mut a
= BitSet
::new();
285 let b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b11111111]));
286 a
.difference_with(&b
);
287 assert
!(a
.is_empty());
290 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
291 let mut b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01100010]));
293 a
.difference_with(&b
);
294 b
.difference_with(&c
);
295 assert_eq
!(a
.len(), 1);
296 assert_eq
!(b
.len(), 1);
300 fn test_bit_set_symmetric_difference_with() {
301 //a should grow to include larger elements
302 let mut a
= BitSet
::new();
305 let mut b
= BitSet
::new();
308 let expected
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10000100]));
309 a
.symmetric_difference_with(&b
);
310 assert_eq
!(a
, expected
);
312 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
313 let b
= BitSet
::new();
315 a
.symmetric_difference_with(&b
);
319 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b11100010]));
320 let mut b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01101010]));
322 a
.symmetric_difference_with(&b
);
323 b
.symmetric_difference_with(&c
);
324 assert_eq
!(a
.len(), 2);
325 assert_eq
!(b
.len(), 2);
329 fn test_bit_set_eq() {
330 let a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
331 let b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00000000]));
332 let c
= BitSet
::new();
343 fn test_bit_set_cmp() {
344 let a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100010]));
345 let b
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00000000]));
346 let c
= BitSet
::new();
348 assert_eq
!(a
.cmp(&b
), Greater
);
349 assert_eq
!(a
.cmp(&c
), Greater
);
350 assert_eq
!(b
.cmp(&a
), Less
);
351 assert_eq
!(b
.cmp(&c
), Equal
);
352 assert_eq
!(c
.cmp(&a
), Less
);
353 assert_eq
!(c
.cmp(&b
), Equal
);
357 fn test_bit_vec_remove() {
358 let mut a
= BitSet
::new();
360 assert
!(a
.insert(1));
361 assert
!(a
.remove(&1));
363 assert
!(a
.insert(100));
364 assert
!(a
.remove(&100));
366 assert
!(a
.insert(1000));
367 assert
!(a
.remove(&1000));
372 fn test_bit_vec_clone() {
373 let mut a
= BitSet
::new();
375 assert
!(a
.insert(1));
376 assert
!(a
.insert(100));
377 assert
!(a
.insert(1000));
379 let mut b
= a
.clone();
383 assert
!(b
.remove(&1));
384 assert
!(a
.contains(&1));
386 assert
!(a
.remove(&1000));
387 assert
!(b
.contains(&1000));
391 fn test_bit_set_append() {
392 let mut a
= BitSet
::new();
396 let mut b
= BitSet
::new();
403 assert_eq
!(a
.len(), 4);
404 assert_eq
!(b
.len(), 0);
405 assert
!(b
.capacity() >= 6);
407 assert_eq
!(a
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b01110010])));
411 fn test_bit_set_split_off() {
413 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
414 0b00110011, 0b01101011, 0b10101101]));
416 let b
= a
.split_off(0);
418 assert_eq
!(a
.len(), 0);
419 assert_eq
!(b
.len(), 21);
421 assert_eq
!(b
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
422 0b00110011, 0b01101011, 0b10101101])));
424 // Split behind last element
425 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
426 0b00110011, 0b01101011, 0b10101101]));
428 let b
= a
.split_off(50);
430 assert_eq
!(a
.len(), 21);
431 assert_eq
!(b
.len(), 0);
433 assert_eq
!(a
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
434 0b00110011, 0b01101011, 0b10101101])));
436 // Split at arbitrary element
437 let mut a
= BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
438 0b00110011, 0b01101011, 0b10101101]));
440 let b
= a
.split_off(34);
442 assert_eq
!(a
.len(), 12);
443 assert_eq
!(b
.len(), 9);
445 assert_eq
!(a
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
446 0b00110011, 0b01000000])));
447 assert_eq
!(b
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0, 0, 0, 0,
448 0b00101011, 0b10101101])));
452 fn test_bit_set_extend_ref() {
453 let mut a
= BitSet
::new();
456 a
.extend(&[5, 7, 10]);
458 assert_eq
!(a
.len(), 4);
459 assert_eq
!(a
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00010101,0b00100000])));
461 let mut b
= BitSet
::new();
467 assert_eq
!(a
.len(), 6);
468 assert_eq
!(a
, BitSet
::from_bit_vec(BitVec
::from_bytes(&[0b00010101,0b00110001])));
472 use std
::collections
::{BitSet, BitVec}
;
473 use std
::__rand
::{Rng, thread_rng, ThreadRng}
;
476 use test
::{Bencher, black_box}
;
478 const BENCH_BITS
: usize = 1 << 14;
480 fn rng() -> ThreadRng
{
485 fn bench_bit_vecset_small(b
: &mut Bencher
) {
487 let mut bit_vec
= BitSet
::new();
490 bit_vec
.insert((r
.next_u32() as usize) % u32::BITS
);
497 fn bench_bit_vecset_big(b
: &mut Bencher
) {
499 let mut bit_vec
= BitSet
::new();
502 bit_vec
.insert((r
.next_u32() as usize) % BENCH_BITS
);
509 fn bench_bit_vecset_iter(b
: &mut Bencher
) {
510 let bit_vec
= BitSet
::from_bit_vec(BitVec
::from_fn(BENCH_BITS
,
511 |idx
| {idx % 3 == 0}
));
514 for idx
in &bit_vec
{