1#![doc(html_root_url = "https://docs.rs/bit-vec/0.6.3")]
84
85#![no_std]
86
87#[cfg(any(test, feature = "std"))]
88#[macro_use]
89extern crate std;
90#[cfg(feature="std")]
91use std::vec::Vec;
92
93#[cfg(feature="serde")]
94extern crate serde;
95#[cfg(feature="serde")]
96use serde::{Serialize, Deserialize};
97
98#[cfg(not(feature="std"))]
99#[macro_use]
100extern crate alloc;
101#[cfg(not(feature="std"))]
102use alloc::vec::Vec;
103
104use core::cmp::Ordering;
105use core::cmp;
106use core::fmt;
107use core::hash;
108use core::mem;
109use core::iter::FromIterator;
110use core::slice;
111use core::{u8, usize};
112use core::iter::repeat;
113use core::ops::*;
114
115type MutBlocks<'a, B> = slice::IterMut<'a, B>;
116
117pub trait BitBlock:
119 Copy +
120 Add<Self, Output=Self> +
121 Sub<Self, Output=Self> +
122 Shl<usize, Output=Self> +
123 Shr<usize, Output=Self> +
124 Not<Output=Self> +
125 BitAnd<Self, Output=Self> +
126 BitOr<Self, Output=Self> +
127 BitXor<Self, Output=Self> +
128 Rem<Self, Output=Self> +
129 Eq +
130 Ord +
131 hash::Hash
132{
133 fn bits() -> usize;
135 #[inline]
137 fn bytes() -> usize { Self::bits() / 8 }
138 fn from_byte(byte: u8) -> Self;
140 fn count_ones(self) -> usize;
142 fn zero() -> Self;
144 fn one() -> Self;
146}
147
148macro_rules! bit_block_impl {
149 ($(($t: ident, $size: expr)),*) => ($(
150 impl BitBlock for $t {
151 #[inline]
152 fn bits() -> usize { $size }
153 #[inline]
154 fn from_byte(byte: u8) -> Self { $t::from(byte) }
155 #[inline]
156 fn count_ones(self) -> usize { self.count_ones() as usize }
157 #[inline]
158 fn one() -> Self { 1 }
159 #[inline]
160 fn zero() -> Self { 0 }
161 }
162 )*)
163}
164
165bit_block_impl!{
166 (u8, 8),
167 (u16, 16),
168 (u32, 32),
169 (u64, 64),
170 (usize, core::mem::size_of::<usize>() * 8)
171}
172
173fn reverse_bits(byte: u8) -> u8 {
174 let mut result = 0;
175 for i in 0..u8::bits() {
176 result |= ((byte >> i) & 1) << (u8::bits() - 1 - i);
177 }
178 result
179}
180
181static TRUE: bool = true;
182static FALSE: bool = false;
183
184#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
212pub struct BitVec<B=u32> {
213 storage: Vec<B>,
215 nbits: usize
217}
218
219impl<B: BitBlock> Index<usize> for BitVec<B> {
221 type Output = bool;
222
223 #[inline]
224 fn index(&self, i: usize) -> &bool {
225 if self.get(i).expect("index out of bounds") {
226 &TRUE
227 } else {
228 &FALSE
229 }
230 }
231}
232
233fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
235 if bits % B::bits() == 0 {
244 bits / B::bits()
245 } else {
246 bits / B::bits() + 1
247 }
248}
249
250fn mask_for_bits<B: BitBlock>(bits: usize) -> B {
252 (!B::zero()) >> ((B::bits() - bits % B::bits()) % B::bits())
254}
255
256type B = u32;
257
258impl BitVec<u32> {
259
260 #[inline]
269 pub fn new() -> Self {
270 Default::default()
271 }
272
273 #[inline]
288 pub fn from_elem(nbits: usize, bit: bool) -> Self {
289 let nblocks = blocks_for_bits::<B>(nbits);
290 let mut bit_vec = BitVec {
291 storage: vec![if bit { !B::zero() } else { B::zero() }; nblocks],
292 nbits,
293 };
294 bit_vec.fix_last_block();
295 bit_vec
296 }
297
298 #[inline]
306 pub fn with_capacity(nbits: usize) -> Self {
307 BitVec {
308 storage: Vec::with_capacity(blocks_for_bits::<B>(nbits)),
309 nbits: 0,
310 }
311 }
312
313 pub fn from_bytes(bytes: &[u8]) -> Self {
329 let len = bytes.len().checked_mul(u8::bits()).expect("capacity overflow");
330 let mut bit_vec = BitVec::with_capacity(len);
331 let complete_words = bytes.len() / B::bytes();
332 let extra_bytes = bytes.len() % B::bytes();
333
334 bit_vec.nbits = len;
335
336 for i in 0..complete_words {
337 let mut accumulator = B::zero();
338 for idx in 0..B::bytes() {
339 accumulator |=
340 B::from_byte(reverse_bits(bytes[i * B::bytes() + idx])) << (idx * 8)
341 }
342 bit_vec.storage.push(accumulator);
343 }
344
345 if extra_bytes > 0 {
346 let mut last_word = B::zero();
347 for (i, &byte) in bytes[complete_words * B::bytes()..].iter().enumerate() {
348 last_word |=
349 B::from_byte(reverse_bits(byte)) << (i * 8);
350 }
351 bit_vec.storage.push(last_word);
352 }
353
354 bit_vec
355 }
356
357 #[inline]
369 pub fn from_fn<F>(len: usize, mut f: F) -> Self
370 where F: FnMut(usize) -> bool
371 {
372 let mut bit_vec = BitVec::from_elem(len, false);
373 for i in 0..len {
374 bit_vec.set(i, f(i));
375 }
376 bit_vec
377 }
378}
379
380impl<B: BitBlock> BitVec<B> {
381 #[inline]
385 fn process<F>(&mut self, other: &BitVec<B>, mut op: F) -> bool
386 where F: FnMut(B, B) -> B {
387 assert_eq!(self.len(), other.len());
388 debug_assert_eq!(self.storage.len(), other.storage.len());
389 let mut changed_bits = B::zero();
390 for (a, b) in self.blocks_mut().zip(other.blocks()) {
391 let w = op(*a, b);
392 changed_bits = changed_bits | (*a ^ w);
393 *a = w;
394 }
395 changed_bits != B::zero()
396 }
397
398 #[inline]
400 fn blocks_mut(&mut self) -> MutBlocks<B> {
401 self.storage.iter_mut()
403 }
404
405 #[inline]
407 pub fn blocks(&self) -> Blocks<B> {
408 Blocks{iter: self.storage.iter()}
410 }
411
412 #[inline]
416 pub fn storage(&self) -> &[B] {
417 &self.storage
418 }
419
420 #[inline]
424 pub unsafe fn storage_mut(&mut self) -> &mut Vec<B> {
425 &mut self.storage
426 }
427
428 #[inline]
430 fn last_block_with_mask(&self) -> Option<(B, B)> {
431 let extra_bits = self.len() % B::bits();
432 if extra_bits > 0 {
433 let mask = (B::one() << extra_bits) - B::one();
434 let storage_len = self.storage.len();
435 Some((self.storage[storage_len - 1], mask))
436 } else {
437 None
438 }
439 }
440
441 #[inline]
443 fn last_block_mut_with_mask(&mut self) -> Option<(&mut B, B)> {
444 let extra_bits = self.len() % B::bits();
445 if extra_bits > 0 {
446 let mask = (B::one() << extra_bits) - B::one();
447 let storage_len = self.storage.len();
448 Some((&mut self.storage[storage_len - 1], mask))
449 } else {
450 None
451 }
452 }
453
454 fn fix_last_block(&mut self) {
457 if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
458 *last_block = *last_block & used_bits;
459 }
460 }
461
462 fn fix_last_block_with_ones(&mut self) {
465 if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
466 *last_block = *last_block | !used_bits;
467 }
468 }
469
470 fn is_last_block_fixed(&self) -> bool {
472 if let Some((last_block, used_bits)) = self.last_block_with_mask() {
473 last_block & !used_bits == B::zero()
474 } else {
475 true
476 }
477 }
478
479 #[inline]
487 fn ensure_invariant(&self) {
488 if cfg!(test) {
489 debug_assert!(self.is_last_block_fixed());
490 }
491 }
492
493 #[inline]
509 pub fn get(&self, i: usize) -> Option<bool> {
510 self.ensure_invariant();
511 if i >= self.nbits {
512 return None;
513 }
514 let w = i / B::bits();
515 let b = i % B::bits();
516 self.storage.get(w).map(|&block|
517 (block & (B::one() << b)) != B::zero()
518 )
519 }
520
521 #[inline]
537 pub fn set(&mut self, i: usize, x: bool) {
538 self.ensure_invariant();
539 assert!(i < self.nbits, "index out of bounds: {:?} >= {:?}", i, self.nbits);
540 let w = i / B::bits();
541 let b = i % B::bits();
542 let flag = B::one() << b;
543 let val = if x { self.storage[w] | flag }
544 else { self.storage[w] & !flag };
545 self.storage[w] = val;
546 }
547
548 #[inline]
563 pub fn set_all(&mut self) {
564 self.ensure_invariant();
565 for w in &mut self.storage { *w = !B::zero(); }
566 self.fix_last_block();
567 }
568
569 #[inline]
584 pub fn negate(&mut self) {
585 self.ensure_invariant();
586 for w in &mut self.storage { *w = !*w; }
587 self.fix_last_block();
588 }
589
590 #[deprecated(
616 since = "0.7.0",
617 note = "Please use the 'or' function instead"
618 )]
619 #[inline]
620 pub fn union(&mut self, other: &Self) -> bool {
621 self.or(other)
622 }
623
624 #[deprecated(
650 since = "0.7.0",
651 note = "Please use the 'and' function instead"
652 )]
653 #[inline]
654 pub fn intersect(&mut self, other: &Self) -> bool {
655 self.and(other)
656 }
657
658 #[inline]
683 pub fn or(&mut self, other: &Self) -> bool {
684 self.ensure_invariant();
685 debug_assert!(other.is_last_block_fixed());
686 self.process(other, |w1, w2| (w1 | w2))
687 }
688
689 #[inline]
714 pub fn and(&mut self, other: &Self) -> bool {
715 self.ensure_invariant();
716 debug_assert!(other.is_last_block_fixed());
717 self.process(other, |w1, w2| (w1 & w2))
718 }
719
720 #[inline]
753 pub fn difference(&mut self, other: &Self) -> bool {
754 self.ensure_invariant();
755 debug_assert!(other.is_last_block_fixed());
756 self.process(other, |w1, w2| (w1 & !w2))
757 }
758
759 #[inline]
784 pub fn xor(&mut self, other: &Self) -> bool {
785 self.ensure_invariant();
786 debug_assert!(other.is_last_block_fixed());
787 self.process(other, |w1, w2| (w1 ^ w2))
788 }
789
790 #[inline]
815 pub fn nand(&mut self, other: &Self) -> bool {
816 self.ensure_invariant();
817 debug_assert!(other.is_last_block_fixed());
818 self.fix_last_block_with_ones();
819 let result = self.process(other, |w1, w2| !(w1 & w2));
820 self.fix_last_block();
821 result
822 }
823
824 #[inline]
849 pub fn nor(&mut self, other: &Self) -> bool {
850 self.ensure_invariant();
851 debug_assert!(other.is_last_block_fixed());
852 self.fix_last_block_with_ones();
853 let result = self.process(other, |w1, w2| !(w1 | w2));
854 self.fix_last_block();
855 result
856 }
857
858 #[inline]
883 pub fn xnor(&mut self, other: &Self) -> bool {
884 self.ensure_invariant();
885 debug_assert!(other.is_last_block_fixed());
886 self.fix_last_block_with_ones();
887 let result = self.process(other, |w1, w2| !(w1 ^ w2));
888 self.fix_last_block();
889 result
890 }
891
892 #[inline]
906 pub fn all(&self) -> bool {
907 self.ensure_invariant();
908 let mut last_word = !B::zero();
909 self.blocks().all(|elem| {
911 let tmp = last_word;
912 last_word = elem;
913 tmp == !B::zero()
914 }) && (last_word == mask_for_bits(self.nbits))
916 }
917
918 #[inline]
929 pub fn iter(&self) -> Iter<B> {
930 self.ensure_invariant();
931 Iter { bit_vec: self, range: 0..self.nbits }
932 }
933
934 pub fn append(&mut self, other: &mut Self) {
952 self.ensure_invariant();
953 debug_assert!(other.is_last_block_fixed());
954
955 let b = self.len() % B::bits();
956 let o = other.len() % B::bits();
957 let will_overflow = (b + o > B::bits()) || (o == 0 && b != 0);
958
959 self.nbits += other.len();
960 other.nbits = 0;
961
962 if b == 0 {
963 self.storage.append(&mut other.storage);
964 } else {
965 self.storage.reserve(other.storage.len());
966
967 for block in other.storage.drain(..) {
968 {
969 let last = self.storage.last_mut().unwrap();
970 *last = *last | (block << b);
971 }
972 self.storage.push(block >> (B::bits() - b));
973 }
974
975 if !will_overflow {
977 self.storage.pop();
978 }
979 }
980 }
981
982 pub fn split_off(&mut self, at: usize) -> Self {
1007 self.ensure_invariant();
1008 assert!(at <= self.len(), "`at` out of bounds");
1009
1010 let mut other = BitVec::<B>::default();
1011
1012 if at == 0 {
1013 mem::swap(self, &mut other);
1014 return other;
1015 } else if at == self.len() {
1016 return other;
1017 }
1018
1019 let w = at / B::bits();
1020 let b = at % B::bits();
1021 other.nbits = self.nbits - at;
1022 self.nbits = at;
1023 if b == 0 {
1024 other.storage = self.storage.split_off(w);
1026 } else {
1027 other.storage.reserve(self.storage.len() - w);
1028
1029 {
1030 let mut iter = self.storage[w..].iter();
1031 let mut last = *iter.next().unwrap();
1032 for &cur in iter {
1033 other.storage.push((last >> b) | (cur << (B::bits() - b)));
1034 last = cur;
1035 }
1036 other.storage.push(last >> b);
1037 }
1038
1039 self.storage.truncate(w + 1);
1040 self.fix_last_block();
1041 }
1042
1043 other
1044 }
1045
1046 #[inline]
1060 pub fn none(&self) -> bool {
1061 self.blocks().all(|w| w == B::zero())
1062 }
1063
1064 #[inline]
1078 pub fn any(&self) -> bool {
1079 !self.none()
1080 }
1081
1082 pub fn to_bytes(&self) -> Vec<u8> {
1104 self.ensure_invariant();
1105 fn bit<B: BitBlock>(bit_vec: &BitVec<B>, byte: usize, bit: usize) -> u8 {
1107 let offset = byte * 8 + bit;
1108 if offset >= bit_vec.nbits {
1109 0
1110 } else {
1111 (bit_vec[offset] as u8) << (7 - bit)
1112 }
1113 }
1114
1115 let len = self.nbits / 8 +
1116 if self.nbits % 8 == 0 { 0 } else { 1 };
1117 (0..len).map(|i|
1118 bit(self, i, 0) |
1119 bit(self, i, 1) |
1120 bit(self, i, 2) |
1121 bit(self, i, 3) |
1122 bit(self, i, 4) |
1123 bit(self, i, 5) |
1124 bit(self, i, 6) |
1125 bit(self, i, 7)
1126 ).collect()
1127 }
1128
1129 #[inline]
1147 pub fn eq_vec(&self, v: &[bool]) -> bool {
1148 assert_eq!(self.nbits, v.len());
1149 self.iter().zip(v.iter().cloned()).all(|(b1, b2)| b1 == b2)
1150 }
1151
1152 #[inline]
1167 pub fn truncate(&mut self, len: usize) {
1168 self.ensure_invariant();
1169 if len < self.len() {
1170 self.nbits = len;
1171 self.storage.truncate(blocks_for_bits::<B>(len));
1173 self.fix_last_block();
1174 }
1175 }
1176
1177 #[inline]
1195 pub fn reserve(&mut self, additional: usize) {
1196 let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
1197 let storage_len = self.storage.len();
1198 if desired_cap > self.capacity() {
1199 self.storage.reserve(blocks_for_bits::<B>(desired_cap) - storage_len);
1200 }
1201 }
1202
1203 #[inline]
1225 pub fn reserve_exact(&mut self, additional: usize) {
1226 let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
1227 let storage_len = self.storage.len();
1228 if desired_cap > self.capacity() {
1229 self.storage.reserve_exact(blocks_for_bits::<B>(desired_cap) - storage_len);
1230 }
1231 }
1232
1233 #[inline]
1246 pub fn capacity(&self) -> usize {
1247 self.storage.capacity().checked_mul(B::bits()).unwrap_or(usize::MAX)
1248 }
1249
1250 pub fn grow(&mut self, n: usize, value: bool) {
1267 self.ensure_invariant();
1268
1269 let new_nbits = self.nbits.checked_add(n).expect("capacity overflow");
1274 let new_nblocks = blocks_for_bits::<B>(new_nbits);
1275 let full_value = if value { !B::zero() } else { B::zero() };
1276
1277 let num_cur_blocks = blocks_for_bits::<B>(self.nbits);
1279 if self.nbits % B::bits() > 0 {
1280 let mask = mask_for_bits::<B>(self.nbits);
1281 if value {
1282 let block = &mut self.storage[num_cur_blocks - 1];
1283 *block = *block | !mask;
1284 } else {
1285 }
1287 }
1288
1289 let stop_idx = cmp::min(self.storage.len(), new_nblocks);
1291 for idx in num_cur_blocks..stop_idx {
1292 self.storage[idx] = full_value;
1293 }
1294
1295 if new_nblocks > self.storage.len() {
1297 let to_add = new_nblocks - self.storage.len();
1298 self.storage.extend(repeat(full_value).take(to_add));
1299 }
1300
1301 self.nbits = new_nbits;
1303
1304 self.fix_last_block();
1305 }
1306
1307 #[inline]
1320 pub fn pop(&mut self) -> Option<bool> {
1321 self.ensure_invariant();
1322
1323 if self.is_empty() {
1324 None
1325 } else {
1326 let i = self.nbits - 1;
1327 let ret = self[i];
1328 self.set(i, false);
1330 self.nbits = i;
1331 if self.nbits % B::bits() == 0 {
1332 self.storage.pop();
1334 }
1335 Some(ret)
1336 }
1337 }
1338
1339 #[inline]
1352 pub fn push(&mut self, elem: bool) {
1353 if self.nbits % B::bits() == 0 {
1354 self.storage.push(B::zero());
1355 }
1356 let insert_pos = self.nbits;
1357 self.nbits = self.nbits.checked_add(1).expect("Capacity overflow");
1358 self.set(insert_pos, elem);
1359 }
1360
1361 #[inline]
1363 pub fn len(&self) -> usize { self.nbits }
1364
1365 #[inline]
1369 pub unsafe fn set_len(&mut self, len: usize) {
1370 self.nbits = len;
1371 }
1372
1373 #[inline]
1375 pub fn is_empty(&self) -> bool { self.len() == 0 }
1376
1377 #[inline]
1379 pub fn clear(&mut self) {
1380 self.ensure_invariant();
1381 for w in &mut self.storage { *w = B::zero(); }
1382 }
1383
1384 pub fn shrink_to_fit(&mut self) {
1391 self.storage.shrink_to_fit();
1392 }
1393}
1394
1395impl<B: BitBlock> Default for BitVec<B> {
1396 #[inline]
1397 fn default() -> Self { BitVec { storage: Vec::new(), nbits: 0 } }
1398}
1399
1400impl<B: BitBlock> FromIterator<bool> for BitVec<B> {
1401 #[inline]
1402 fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> Self {
1403 let mut ret: Self = Default::default();
1404 ret.extend(iter);
1405 ret
1406 }
1407}
1408
1409impl<B: BitBlock> Extend<bool> for BitVec<B> {
1410 #[inline]
1411 fn extend<I: IntoIterator<Item=bool>>(&mut self, iterable: I) {
1412 self.ensure_invariant();
1413 let iterator = iterable.into_iter();
1414 let (min, _) = iterator.size_hint();
1415 self.reserve(min);
1416 for element in iterator {
1417 self.push(element)
1418 }
1419 }
1420}
1421
1422impl<B: BitBlock> Clone for BitVec<B> {
1423 #[inline]
1424 fn clone(&self) -> Self {
1425 self.ensure_invariant();
1426 BitVec { storage: self.storage.clone(), nbits: self.nbits }
1427 }
1428
1429 #[inline]
1430 fn clone_from(&mut self, source: &Self) {
1431 debug_assert!(source.is_last_block_fixed());
1432 self.nbits = source.nbits;
1433 self.storage.clone_from(&source.storage);
1434 }
1435}
1436
1437impl<B: BitBlock> PartialOrd for BitVec<B> {
1438 #[inline]
1439 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1440 Some(self.cmp(other))
1441 }
1442}
1443
1444impl<B: BitBlock> Ord for BitVec<B> {
1445 #[inline]
1446 fn cmp(&self, other: &Self) -> Ordering {
1447 self.ensure_invariant();
1448 debug_assert!(other.is_last_block_fixed());
1449 let mut a = self.iter();
1450 let mut b = other.iter();
1451 loop {
1452 match (a.next(), b.next()) {
1453 (Some(x), Some(y)) => match x.cmp(&y) {
1454 Ordering::Equal => {}
1455 otherwise => return otherwise,
1456 },
1457 (None, None) => return Ordering::Equal,
1458 (None, _) => return Ordering::Less,
1459 (_, None) => return Ordering::Greater,
1460 }
1461 }
1462 }
1463}
1464
1465impl<B: BitBlock> fmt::Debug for BitVec<B> {
1466 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
1467 self.ensure_invariant();
1468 for bit in self {
1469 write!(fmt, "{}", if bit { 1 } else { 0 })?;
1470 }
1471 Ok(())
1472 }
1473}
1474
1475impl<B: BitBlock> hash::Hash for BitVec<B> {
1476 #[inline]
1477 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1478 self.ensure_invariant();
1479 self.nbits.hash(state);
1480 for elem in self.blocks() {
1481 elem.hash(state);
1482 }
1483 }
1484}
1485
1486impl<B: BitBlock> cmp::PartialEq for BitVec<B> {
1487 #[inline]
1488 fn eq(&self, other: &Self) -> bool {
1489 if self.nbits != other.nbits {
1490 self.ensure_invariant();
1491 other.ensure_invariant();
1492 return false;
1493 }
1494 self.blocks().zip(other.blocks()).all(|(w1, w2)| w1 == w2)
1495 }
1496}
1497
1498impl<B: BitBlock> cmp::Eq for BitVec<B> {}
1499
1500#[derive(Clone)]
1502pub struct Iter<'a, B: 'a = u32> {
1503 bit_vec: &'a BitVec<B>,
1504 range: Range<usize>,
1505}
1506
1507impl<'a, B: BitBlock> Iterator for Iter<'a, B> {
1508 type Item = bool;
1509
1510 #[inline]
1511 fn next(&mut self) -> Option<bool> {
1512 self.range.next().map(|i| self.bit_vec.get(i).unwrap())
1515 }
1516
1517 fn size_hint(&self) -> (usize, Option<usize>) {
1518 self.range.size_hint()
1519 }
1520}
1521
1522impl<'a, B: BitBlock> DoubleEndedIterator for Iter<'a, B> {
1523 #[inline]
1524 fn next_back(&mut self) -> Option<bool> {
1525 self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
1526 }
1527}
1528
1529impl<'a, B: BitBlock> ExactSizeIterator for Iter<'a, B> {}
1530
1531impl<'a, B: BitBlock> IntoIterator for &'a BitVec<B> {
1532 type Item = bool;
1533 type IntoIter = Iter<'a, B>;
1534
1535 #[inline]
1536 fn into_iter(self) -> Iter<'a, B> {
1537 self.iter()
1538 }
1539}
1540
1541pub struct IntoIter<B=u32> {
1542 bit_vec: BitVec<B>,
1543 range: Range<usize>,
1544}
1545
1546impl<B: BitBlock> Iterator for IntoIter<B> {
1547 type Item = bool;
1548
1549 #[inline]
1550 fn next(&mut self) -> Option<bool> {
1551 self.range.next().map(|i| self.bit_vec.get(i).unwrap())
1552 }
1553}
1554
1555impl<B: BitBlock> DoubleEndedIterator for IntoIter<B> {
1556 #[inline]
1557 fn next_back(&mut self) -> Option<bool> {
1558 self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
1559 }
1560}
1561
1562impl<B: BitBlock> ExactSizeIterator for IntoIter<B> {}
1563
1564impl<B: BitBlock> IntoIterator for BitVec<B> {
1565 type Item = bool;
1566 type IntoIter = IntoIter<B>;
1567
1568 #[inline]
1569 fn into_iter(self) -> IntoIter<B> {
1570 let nbits = self.nbits;
1571 IntoIter { bit_vec: self, range: 0..nbits }
1572 }
1573}
1574
1575#[derive(Clone)]
1577pub struct Blocks<'a, B: 'a> {
1578 iter: slice::Iter<'a, B>,
1579}
1580
1581impl<'a, B: BitBlock> Iterator for Blocks<'a, B> {
1582 type Item = B;
1583
1584 #[inline]
1585 fn next(&mut self) -> Option<B> {
1586 self.iter.next().cloned()
1587 }
1588
1589 #[inline]
1590 fn size_hint(&self) -> (usize, Option<usize>) {
1591 self.iter.size_hint()
1592 }
1593}
1594
1595impl<'a, B: BitBlock> DoubleEndedIterator for Blocks<'a, B> {
1596 #[inline]
1597 fn next_back(&mut self) -> Option<B> {
1598 self.iter.next_back().cloned()
1599 }
1600}
1601
1602impl<'a, B: BitBlock> ExactSizeIterator for Blocks<'a, B> {}
1603
1604#[cfg(test)]
1605mod tests {
1606 use super::{BitVec, Iter, Vec};
1607
1608 const U32_BITS: usize = 32;
1610
1611 #[test]
1612 fn test_to_str() {
1613 let zerolen = BitVec::new();
1614 assert_eq!(format!("{:?}", zerolen), "");
1615
1616 let eightbits = BitVec::from_elem(8, false);
1617 assert_eq!(format!("{:?}", eightbits), "00000000")
1618 }
1619
1620 #[test]
1621 fn test_0_elements() {
1622 let act = BitVec::new();
1623 let exp = Vec::new();
1624 assert!(act.eq_vec(&exp));
1625 assert!(act.none() && act.all());
1626 }
1627
1628 #[test]
1629 fn test_1_element() {
1630 let mut act = BitVec::from_elem(1, false);
1631 assert!(act.eq_vec(&[false]));
1632 assert!(act.none() && !act.all());
1633 act = BitVec::from_elem(1, true);
1634 assert!(act.eq_vec(&[true]));
1635 assert!(!act.none() && act.all());
1636 }
1637
1638 #[test]
1639 fn test_2_elements() {
1640 let mut b = BitVec::from_elem(2, false);
1641 b.set(0, true);
1642 b.set(1, false);
1643 assert_eq!(format!("{:?}", b), "10");
1644 assert!(!b.none() && !b.all());
1645 }
1646
1647 #[test]
1648 fn test_10_elements() {
1649 let mut act;
1650 act = BitVec::from_elem(10, false);
1653 assert!((act.eq_vec(
1654 &[false, false, false, false, false, false, false, false, false, false])));
1655 assert!(act.none() && !act.all());
1656 act = BitVec::from_elem(10, true);
1659 assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
1660 assert!(!act.none() && act.all());
1661 act = BitVec::from_elem(10, false);
1664 act.set(0, true);
1665 act.set(1, true);
1666 act.set(2, true);
1667 act.set(3, true);
1668 act.set(4, true);
1669 assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
1670 assert!(!act.none() && !act.all());
1671 act = BitVec::from_elem(10, false);
1674 act.set(5, true);
1675 act.set(6, true);
1676 act.set(7, true);
1677 act.set(8, true);
1678 act.set(9, true);
1679 assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
1680 assert!(!act.none() && !act.all());
1681 act = BitVec::from_elem(10, false);
1684 act.set(0, true);
1685 act.set(3, true);
1686 act.set(6, true);
1687 act.set(9, true);
1688 assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
1689 assert!(!act.none() && !act.all());
1690 }
1691
1692 #[test]
1693 fn test_31_elements() {
1694 let mut act;
1695 act = BitVec::from_elem(31, false);
1698 assert!(act.eq_vec(
1699 &[false, false, false, false, false, false, false, false, false, false, false,
1700 false, false, false, false, false, false, false, false, false, false, false,
1701 false, false, false, false, false, false, false, false, false]));
1702 assert!(act.none() && !act.all());
1703 act = BitVec::from_elem(31, true);
1706 assert!(act.eq_vec(
1707 &[true, true, true, true, true, true, true, true, true, true, true, true, true,
1708 true, true, true, true, true, true, true, true, true, true, true, true, true,
1709 true, true, true, true, true]));
1710 assert!(!act.none() && act.all());
1711 act = BitVec::from_elem(31, false);
1714 act.set(0, true);
1715 act.set(1, true);
1716 act.set(2, true);
1717 act.set(3, true);
1718 act.set(4, true);
1719 act.set(5, true);
1720 act.set(6, true);
1721 act.set(7, true);
1722 assert!(act.eq_vec(
1723 &[true, true, true, true, true, true, true, true, false, false, false, false, false,
1724 false, false, false, false, false, false, false, false, false, false, false,
1725 false, false, false, false, false, false, false]));
1726 assert!(!act.none() && !act.all());
1727 act = BitVec::from_elem(31, false);
1730 act.set(16, true);
1731 act.set(17, true);
1732 act.set(18, true);
1733 act.set(19, true);
1734 act.set(20, true);
1735 act.set(21, true);
1736 act.set(22, true);
1737 act.set(23, true);
1738 assert!(act.eq_vec(
1739 &[false, false, false, false, false, false, false, false, false, false, false,
1740 false, false, false, false, false, true, true, true, true, true, true, true, true,
1741 false, false, false, false, false, false, false]));
1742 assert!(!act.none() && !act.all());
1743 act = BitVec::from_elem(31, false);
1746 act.set(24, true);
1747 act.set(25, true);
1748 act.set(26, true);
1749 act.set(27, true);
1750 act.set(28, true);
1751 act.set(29, true);
1752 act.set(30, true);
1753 assert!(act.eq_vec(
1754 &[false, false, false, false, false, false, false, false, false, false, false,
1755 false, false, false, false, false, false, false, false, false, false, false,
1756 false, false, true, true, true, true, true, true, true]));
1757 assert!(!act.none() && !act.all());
1758 act = BitVec::from_elem(31, false);
1761 act.set(3, true);
1762 act.set(17, true);
1763 act.set(30, true);
1764 assert!(act.eq_vec(
1765 &[false, false, false, true, false, false, false, false, false, false, false, false,
1766 false, false, false, false, false, true, false, false, false, false, false, false,
1767 false, false, false, false, false, false, true]));
1768 assert!(!act.none() && !act.all());
1769 }
1770
1771 #[test]
1772 fn test_32_elements() {
1773 let mut act;
1774 act = BitVec::from_elem(32, false);
1777 assert!(act.eq_vec(
1778 &[false, false, false, false, false, false, false, false, false, false, false,
1779 false, false, false, false, false, false, false, false, false, false, false,
1780 false, false, false, false, false, false, false, false, false, false]));
1781 assert!(act.none() && !act.all());
1782 act = BitVec::from_elem(32, true);
1785 assert!(act.eq_vec(
1786 &[true, true, true, true, true, true, true, true, true, true, true, true, true,
1787 true, true, true, true, true, true, true, true, true, true, true, true, true,
1788 true, true, true, true, true, true]));
1789 assert!(!act.none() && act.all());
1790 act = BitVec::from_elem(32, false);
1793 act.set(0, true);
1794 act.set(1, true);
1795 act.set(2, true);
1796 act.set(3, true);
1797 act.set(4, true);
1798 act.set(5, true);
1799 act.set(6, true);
1800 act.set(7, true);
1801 assert!(act.eq_vec(
1802 &[true, true, true, true, true, true, true, true, false, false, false, false, false,
1803 false, false, false, false, false, false, false, false, false, false, false,
1804 false, false, false, false, false, false, false, false]));
1805 assert!(!act.none() && !act.all());
1806 act = BitVec::from_elem(32, false);
1809 act.set(16, true);
1810 act.set(17, true);
1811 act.set(18, true);
1812 act.set(19, true);
1813 act.set(20, true);
1814 act.set(21, true);
1815 act.set(22, true);
1816 act.set(23, true);
1817 assert!(act.eq_vec(
1818 &[false, false, false, false, false, false, false, false, false, false, false,
1819 false, false, false, false, false, true, true, true, true, true, true, true, true,
1820 false, false, false, false, false, false, false, false]));
1821 assert!(!act.none() && !act.all());
1822 act = BitVec::from_elem(32, false);
1825 act.set(24, true);
1826 act.set(25, true);
1827 act.set(26, true);
1828 act.set(27, true);
1829 act.set(28, true);
1830 act.set(29, true);
1831 act.set(30, true);
1832 act.set(31, true);
1833 assert!(act.eq_vec(
1834 &[false, false, false, false, false, false, false, false, false, false, false,
1835 false, false, false, false, false, false, false, false, false, false, false,
1836 false, false, true, true, true, true, true, true, true, true]));
1837 assert!(!act.none() && !act.all());
1838 act = BitVec::from_elem(32, false);
1841 act.set(3, true);
1842 act.set(17, true);
1843 act.set(30, true);
1844 act.set(31, true);
1845 assert!(act.eq_vec(
1846 &[false, false, false, true, false, false, false, false, false, false, false, false,
1847 false, false, false, false, false, true, false, false, false, false, false, false,
1848 false, false, false, false, false, false, true, true]));
1849 assert!(!act.none() && !act.all());
1850 }
1851
1852 #[test]
1853 fn test_33_elements() {
1854 let mut act;
1855 act = BitVec::from_elem(33, false);
1858 assert!(act.eq_vec(
1859 &[false, false, false, false, false, false, false, false, false, false, false,
1860 false, false, false, false, false, false, false, false, false, false, false,
1861 false, false, false, false, false, false, false, false, false, false, false]));
1862 assert!(act.none() && !act.all());
1863 act = BitVec::from_elem(33, true);
1866 assert!(act.eq_vec(
1867 &[true, true, true, true, true, true, true, true, true, true, true, true, true,
1868 true, true, true, true, true, true, true, true, true, true, true, true, true,
1869 true, true, true, true, true, true, true]));
1870 assert!(!act.none() && act.all());
1871 act = BitVec::from_elem(33, false);
1874 act.set(0, true);
1875 act.set(1, true);
1876 act.set(2, true);
1877 act.set(3, true);
1878 act.set(4, true);
1879 act.set(5, true);
1880 act.set(6, true);
1881 act.set(7, true);
1882 assert!(act.eq_vec(
1883 &[true, true, true, true, true, true, true, true, false, false, false, false, false,
1884 false, false, false, false, false, false, false, false, false, false, false,
1885 false, false, false, false, false, false, false, false, false]));
1886 assert!(!act.none() && !act.all());
1887 act = BitVec::from_elem(33, false);
1890 act.set(16, true);
1891 act.set(17, true);
1892 act.set(18, true);
1893 act.set(19, true);
1894 act.set(20, true);
1895 act.set(21, true);
1896 act.set(22, true);
1897 act.set(23, true);
1898 assert!(act.eq_vec(
1899 &[false, false, false, false, false, false, false, false, false, false, false,
1900 false, false, false, false, false, true, true, true, true, true, true, true, true,
1901 false, false, false, false, false, false, false, false, false]));
1902 assert!(!act.none() && !act.all());
1903 act = BitVec::from_elem(33, false);
1906 act.set(24, true);
1907 act.set(25, true);
1908 act.set(26, true);
1909 act.set(27, true);
1910 act.set(28, true);
1911 act.set(29, true);
1912 act.set(30, true);
1913 act.set(31, true);
1914 assert!(act.eq_vec(
1915 &[false, false, false, false, false, false, false, false, false, false, false,
1916 false, false, false, false, false, false, false, false, false, false, false,
1917 false, false, true, true, true, true, true, true, true, true, false]));
1918 assert!(!act.none() && !act.all());
1919 act = BitVec::from_elem(33, false);
1922 act.set(3, true);
1923 act.set(17, true);
1924 act.set(30, true);
1925 act.set(31, true);
1926 act.set(32, true);
1927 assert!(act.eq_vec(
1928 &[false, false, false, true, false, false, false, false, false, false, false, false,
1929 false, false, false, false, false, true, false, false, false, false, false, false,
1930 false, false, false, false, false, false, true, true, true]));
1931 assert!(!act.none() && !act.all());
1932 }
1933
1934 #[test]
1935 fn test_equal_differing_sizes() {
1936 let v0 = BitVec::from_elem(10, false);
1937 let v1 = BitVec::from_elem(11, false);
1938 assert_ne!(v0, v1);
1939 }
1940
1941 #[test]
1942 fn test_equal_greatly_differing_sizes() {
1943 let v0 = BitVec::from_elem(10, false);
1944 let v1 = BitVec::from_elem(110, false);
1945 assert_ne!(v0, v1);
1946 }
1947
1948 #[test]
1949 fn test_equal_sneaky_small() {
1950 let mut a = BitVec::from_elem(1, false);
1951 a.set(0, true);
1952
1953 let mut b = BitVec::from_elem(1, true);
1954 b.set(0, true);
1955
1956 assert_eq!(a, b);
1957 }
1958
1959 #[test]
1960 fn test_equal_sneaky_big() {
1961 let mut a = BitVec::from_elem(100, false);
1962 for i in 0..100 {
1963 a.set(i, true);
1964 }
1965
1966 let mut b = BitVec::from_elem(100, true);
1967 for i in 0..100 {
1968 b.set(i, true);
1969 }
1970
1971 assert_eq!(a, b);
1972 }
1973
1974 #[test]
1975 fn test_from_bytes() {
1976 let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
1977 let str = concat!("10110110", "00000000", "11111111");
1978 assert_eq!(format!("{:?}", bit_vec), str);
1979 }
1980
1981 #[test]
1982 fn test_to_bytes() {
1983 let mut bv = BitVec::from_elem(3, true);
1984 bv.set(1, false);
1985 assert_eq!(bv.to_bytes(), [0b10100000]);
1986
1987 let mut bv = BitVec::from_elem(9, false);
1988 bv.set(2, true);
1989 bv.set(8, true);
1990 assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
1991 }
1992
1993 #[test]
1994 fn test_from_bools() {
1995 let bools = vec![true, false, true, true];
1996 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
1997 assert_eq!(format!("{:?}", bit_vec), "1011");
1998 }
1999
2000 #[test]
2001 fn test_to_bools() {
2002 let bools = vec![false, false, true, false, false, true, true, false];
2003 assert_eq!(BitVec::from_bytes(&[0b00100110]).iter().collect::<Vec<bool>>(), bools);
2004 }
2005
2006 #[test]
2007 fn test_bit_vec_iterator() {
2008 let bools = vec![true, false, true, true];
2009 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2010
2011 assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
2012
2013 let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
2014 let bit_vec: BitVec = long.iter().map(|n| *n).collect();
2015 assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
2016 }
2017
2018 #[test]
2019 fn test_small_difference() {
2020 let mut b1 = BitVec::from_elem(3, false);
2021 let mut b2 = BitVec::from_elem(3, false);
2022 b1.set(0, true);
2023 b1.set(1, true);
2024 b2.set(1, true);
2025 b2.set(2, true);
2026 assert!(b1.difference(&b2));
2027 assert!(b1[0]);
2028 assert!(!b1[1]);
2029 assert!(!b1[2]);
2030 }
2031
2032 #[test]
2033 fn test_big_difference() {
2034 let mut b1 = BitVec::from_elem(100, false);
2035 let mut b2 = BitVec::from_elem(100, false);
2036 b1.set(0, true);
2037 b1.set(40, true);
2038 b2.set(40, true);
2039 b2.set(80, true);
2040 assert!(b1.difference(&b2));
2041 assert!(b1[0]);
2042 assert!(!b1[40]);
2043 assert!(!b1[80]);
2044 }
2045
2046 #[test]
2047 fn test_small_xor() {
2048 let mut a = BitVec::from_bytes(&[0b0011]);
2049 let b = BitVec::from_bytes(&[0b0101]);
2050 let c = BitVec::from_bytes(&[0b0110]);
2051 assert!(a.xor(&b));
2052 assert_eq!(a,c);
2053 }
2054
2055 #[test]
2056 fn test_small_xnor() {
2057 let mut a = BitVec::from_bytes(&[0b0011]);
2058 let b = BitVec::from_bytes(&[0b1111_0101]);
2059 let c = BitVec::from_bytes(&[0b1001]);
2060 assert!(a.xnor(&b));
2061 assert_eq!(a,c);
2062 }
2063
2064 #[test]
2065 fn test_small_nand() {
2066 let mut a = BitVec::from_bytes(&[0b1111_0011]);
2067 let b = BitVec::from_bytes(&[0b1111_0101]);
2068 let c = BitVec::from_bytes(&[0b1110]);
2069 assert!(a.nand(&b));
2070 assert_eq!(a,c);
2071 }
2072
2073 #[test]
2074 fn test_small_nor() {
2075 let mut a = BitVec::from_bytes(&[0b0011]);
2076 let b = BitVec::from_bytes(&[0b1111_0101]);
2077 let c = BitVec::from_bytes(&[0b1000]);
2078 assert!(a.nor(&b));
2079 assert_eq!(a,c);
2080 }
2081
2082 #[test]
2083 fn test_big_xor() {
2084 let mut a = BitVec::from_bytes(&[ 0, 0, 0b00010100, 0,
2086 0, 0, 0, 0b00110100,
2087 0, 0, 0]);
2088 let b = BitVec::from_bytes(&[ 0, 0, 0b00010100, 0,
2090 0, 0, 0, 0,
2091 0, 0, 0b00110100]);
2092 let c = BitVec::from_bytes(&[ 0, 0, 0, 0,
2094 0, 0, 0, 0b00110100,
2095 0, 0, 0b00110100]);
2096 assert!(a.xor(&b));
2097 assert_eq!(a,c);
2098 }
2099
2100 #[test]
2101 fn test_big_xnor() {
2102 let mut a = BitVec::from_bytes(&[ 0, 0, 0b00010100, 0,
2104 0, 0, 0, 0b00110100,
2105 0, 0, 0]);
2106 let b = BitVec::from_bytes(&[ 0, 0, 0b00010100, 0,
2108 0, 0, 0, 0,
2109 0, 0, 0b00110100]);
2110 let c = BitVec::from_bytes(&[ !0, !0, !0, !0,
2112 !0, !0, !0, !0b00110100,
2113 !0, !0, !0b00110100]);
2114 assert!(a.xnor(&b));
2115 assert_eq!(a,c);
2116 }
2117
2118 #[test]
2119 fn test_small_clear() {
2120 let mut b = BitVec::from_elem(14, true);
2121 assert!(!b.none() && b.all());
2122 b.clear();
2123 assert!(b.none() && !b.all());
2124 }
2125
2126 #[test]
2127 fn test_big_clear() {
2128 let mut b = BitVec::from_elem(140, true);
2129 assert!(!b.none() && b.all());
2130 b.clear();
2131 assert!(b.none() && !b.all());
2132 }
2133
2134 #[test]
2135 fn test_bit_vec_lt() {
2136 let mut a = BitVec::from_elem(5, false);
2137 let mut b = BitVec::from_elem(5, false);
2138
2139 assert!(!(a < b) && !(b < a));
2140 b.set(2, true);
2141 assert!(a < b);
2142 a.set(3, true);
2143 assert!(a < b);
2144 a.set(2, true);
2145 assert!(!(a < b) && b < a);
2146 b.set(0, true);
2147 assert!(a < b);
2148 }
2149
2150 #[test]
2151 fn test_ord() {
2152 let mut a = BitVec::from_elem(5, false);
2153 let mut b = BitVec::from_elem(5, false);
2154
2155 assert!(a <= b && a >= b);
2156 a.set(1, true);
2157 assert!(a > b && a >= b);
2158 assert!(b < a && b <= a);
2159 b.set(1, true);
2160 b.set(2, true);
2161 assert!(b > a && b >= a);
2162 assert!(a < b && a <= b);
2163 }
2164
2165 #[test]
2166 fn test_small_bit_vec_tests() {
2167 let v = BitVec::from_bytes(&[0]);
2168 assert!(!v.all());
2169 assert!(!v.any());
2170 assert!(v.none());
2171
2172 let v = BitVec::from_bytes(&[0b00010100]);
2173 assert!(!v.all());
2174 assert!(v.any());
2175 assert!(!v.none());
2176
2177 let v = BitVec::from_bytes(&[0xFF]);
2178 assert!(v.all());
2179 assert!(v.any());
2180 assert!(!v.none());
2181 }
2182
2183 #[test]
2184 fn test_big_bit_vec_tests() {
2185 let v = BitVec::from_bytes(&[ 0, 0, 0, 0,
2187 0, 0, 0, 0,
2188 0, 0, 0]);
2189 assert!(!v.all());
2190 assert!(!v.any());
2191 assert!(v.none());
2192
2193 let v = BitVec::from_bytes(&[ 0, 0, 0b00010100, 0,
2195 0, 0, 0, 0b00110100,
2196 0, 0, 0]);
2197 assert!(!v.all());
2198 assert!(v.any());
2199 assert!(!v.none());
2200
2201 let v = BitVec::from_bytes(&[ 0xFF, 0xFF, 0xFF, 0xFF,
2203 0xFF, 0xFF, 0xFF, 0xFF,
2204 0xFF, 0xFF, 0xFF]);
2205 assert!(v.all());
2206 assert!(v.any());
2207 assert!(!v.none());
2208 }
2209
2210 #[test]
2211 fn test_bit_vec_push_pop() {
2212 let mut s = BitVec::from_elem(5 * U32_BITS - 2, false);
2213 assert_eq!(s.len(), 5 * U32_BITS - 2);
2214 assert_eq!(s[5 * U32_BITS - 3], false);
2215 s.push(true);
2216 s.push(true);
2217 assert_eq!(s[5 * U32_BITS - 2], true);
2218 assert_eq!(s[5 * U32_BITS - 1], true);
2219 s.push(false);
2221 assert_eq!(s[5 * U32_BITS], false);
2222 s.push(false);
2223 assert_eq!(s[5 * U32_BITS + 1], false);
2224 assert_eq!(s.len(), 5 * U32_BITS + 2);
2225 assert_eq!(s.pop(), Some(false));
2227 assert_eq!(s.pop(), Some(false));
2228 assert_eq!(s.pop(), Some(true));
2229 assert_eq!(s.pop(), Some(true));
2230 assert_eq!(s.len(), 5 * U32_BITS - 2);
2231 }
2232
2233 #[test]
2234 fn test_bit_vec_truncate() {
2235 let mut s = BitVec::from_elem(5 * U32_BITS, true);
2236
2237 assert_eq!(s, BitVec::from_elem(5 * U32_BITS, true));
2238 assert_eq!(s.len(), 5 * U32_BITS);
2239 s.truncate(4 * U32_BITS);
2240 assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2241 assert_eq!(s.len(), 4 * U32_BITS);
2242 s.truncate(5 * U32_BITS);
2244 assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2245 assert_eq!(s.len(), 4 * U32_BITS);
2246 s.truncate(3 * U32_BITS - 10);
2247 assert_eq!(s, BitVec::from_elem(3 * U32_BITS - 10, true));
2248 assert_eq!(s.len(), 3 * U32_BITS - 10);
2249 s.truncate(0);
2250 assert_eq!(s, BitVec::from_elem(0, true));
2251 assert_eq!(s.len(), 0);
2252 }
2253
2254 #[test]
2255 fn test_bit_vec_reserve() {
2256 let mut s = BitVec::from_elem(5 * U32_BITS, true);
2257 assert!(s.capacity() >= 5 * U32_BITS);
2259 s.reserve(2 * U32_BITS);
2260 assert!(s.capacity() >= 7 * U32_BITS);
2261 s.reserve(7 * U32_BITS);
2262 assert!(s.capacity() >= 12 * U32_BITS);
2263 s.reserve_exact(7 * U32_BITS);
2264 assert!(s.capacity() >= 12 * U32_BITS);
2265 s.reserve(7 * U32_BITS + 1);
2266 assert!(s.capacity() >= 12 * U32_BITS + 1);
2267 assert_eq!(s.len(), 5 * U32_BITS);
2269 s.push(true);
2270 s.push(false);
2271 s.push(true);
2272 assert_eq!(s[5 * U32_BITS - 1], true);
2273 assert_eq!(s[5 * U32_BITS - 0], true);
2274 assert_eq!(s[5 * U32_BITS + 1], false);
2275 assert_eq!(s[5 * U32_BITS + 2], true);
2276 }
2277
2278 #[test]
2279 fn test_bit_vec_grow() {
2280 let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
2281 bit_vec.grow(32, true);
2282 assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
2283 0xFF, 0xFF, 0xFF, 0xFF]));
2284 bit_vec.grow(64, false);
2285 assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
2286 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0]));
2287 bit_vec.grow(16, true);
2288 assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
2289 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF]));
2290 }
2291
2292 #[test]
2293 fn test_bit_vec_extend() {
2294 let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
2295 let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
2296 bit_vec.extend(ext.iter());
2297 assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111,
2298 0b01001001, 0b10010010, 0b10111101]));
2299 }
2300
2301 #[test]
2302 fn test_bit_vec_append() {
2303 let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011]);
2305 let mut b = BitVec::new();
2306 b.push(false);
2307 b.push(true);
2308 b.push(true);
2309
2310 a.append(&mut b);
2311
2312 assert_eq!(a.len(), 35);
2313 assert_eq!(b.len(), 0);
2314 assert!(b.capacity() >= 3);
2315
2316 assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
2317 false, false, false, true, false, false, true, false,
2318 true, false, false, true, false, false, true, false,
2319 false, false, true, true, false, false, true, true,
2320 false, true, true]));
2321
2322 let mut a = BitVec::new();
2324 a.push(true);
2325 a.push(false);
2326
2327 let mut b = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2328
2329 a.append(&mut b);
2330
2331 assert_eq!(a.len(), 42);
2332 assert_eq!(b.len(), 0);
2333 assert!(b.capacity() >= 40);
2334
2335 assert!(a.eq_vec(&[true, false, true, false, true, false, false, false,
2336 false, false, false, false, false, true, false, false,
2337 true, false, true, false, false, true, false, false,
2338 true, false, false, false, true, true, false, false,
2339 true, true, true, false, false, true, false, true,
2340 false, true]));
2341
2342 let mut a = BitVec::new();
2344 let mut b = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2345
2346 a.append(&mut b);
2347
2348 assert_eq!(a.len(), 40);
2349 assert_eq!(b.len(), 0);
2350 assert!(b.capacity() >= 40);
2351
2352 assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
2353 false, false, false, true, false, false, true, false,
2354 true, false, false, true, false, false, true, false,
2355 false, false, true, true, false, false, true, true,
2356 true, false, false, true, false, true, false, true]));
2357
2358 let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2360 let mut b = BitVec::new();
2361
2362 a.append(&mut b);
2363
2364 assert_eq!(a.len(), 40);
2365 assert_eq!(b.len(), 0);
2366
2367 assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
2368 false, false, false, true, false, false, true, false,
2369 true, false, false, true, false, false, true, false,
2370 false, false, true, true, false, false, true, true,
2371 true, false, false, true, false, true, false, true]));
2372 }
2373
2374 #[test]
2375 fn test_bit_vec_split_off() {
2376 let mut a = BitVec::new();
2378 a.push(true);
2379 a.push(false);
2380 a.push(false);
2381 a.push(true);
2382
2383 let b = a.split_off(0);
2384
2385 assert_eq!(a.len(), 0);
2386 assert_eq!(b.len(), 4);
2387
2388 assert!(b.eq_vec(&[true, false, false, true]));
2389
2390 a.truncate(0);
2392 a.push(true);
2393 a.push(false);
2394 a.push(false);
2395 a.push(true);
2396
2397 let b = a.split_off(4);
2398
2399 assert_eq!(a.len(), 4);
2400 assert_eq!(b.len(), 0);
2401
2402 assert!(a.eq_vec(&[true, false, false, true]));
2403
2404 let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b11110011]);
2406
2407 let b = a.split_off(32);
2408
2409 assert_eq!(a.len(), 32);
2410 assert_eq!(b.len(), 8);
2411
2412 assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
2413 false, false, false, true, false, false, true, false,
2414 true, false, false, true, false, false, true, false,
2415 false, false, true, true, false, false, true, true]));
2416 assert!(b.eq_vec(&[true, true, true, true, false, false, true, true]));
2417
2418 let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011,
2420 0b01101011, 0b10101101]);
2421
2422 let b = a.split_off(13);
2423
2424 assert_eq!(a.len(), 13);
2425 assert_eq!(b.len(), 35);
2426
2427 assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
2428 false, false, false, true, false]));
2429 assert!(b.eq_vec(&[false, true, false, true, false, false, true, false,
2430 false, true, false, false, false, true, true, false,
2431 false, true, true, false, true, true, false, true,
2432 false, true, true, true, false, true, false, true,
2433 true, false, true]));
2434 }
2435
2436 #[test]
2437 fn test_into_iter() {
2438 let bools = vec![true, false, true, true];
2439 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2440 let mut iter = bit_vec.into_iter();
2441 assert_eq!(Some(true), iter.next());
2442 assert_eq!(Some(false), iter.next());
2443 assert_eq!(Some(true), iter.next());
2444 assert_eq!(Some(true), iter.next());
2445 assert_eq!(None, iter.next());
2446 assert_eq!(None, iter.next());
2447
2448 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2449 let mut iter = bit_vec.into_iter();
2450 assert_eq!(Some(true), iter.next_back());
2451 assert_eq!(Some(true), iter.next_back());
2452 assert_eq!(Some(false), iter.next_back());
2453 assert_eq!(Some(true), iter.next_back());
2454 assert_eq!(None, iter.next_back());
2455 assert_eq!(None, iter.next_back());
2456
2457 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2458 let mut iter = bit_vec.into_iter();
2459 assert_eq!(Some(true), iter.next_back());
2460 assert_eq!(Some(true), iter.next());
2461 assert_eq!(Some(false), iter.next());
2462 assert_eq!(Some(true), iter.next_back());
2463 assert_eq!(None, iter.next());
2464 assert_eq!(None, iter.next_back());
2465 }
2466
2467 #[test]
2468 fn iter() {
2469 let b = BitVec::with_capacity(10);
2470 let _a: Iter = b.iter();
2471 }
2472
2473 #[cfg(feature="serde")]
2474 #[test]
2475 fn test_serialization() {
2476 let bit_vec: BitVec = BitVec::new();
2477 let serialized = serde_json::to_string(&bit_vec).unwrap();
2478 let unserialized: BitVec = serde_json::from_str(&serialized).unwrap();
2479 assert_eq!(bit_vec, unserialized);
2480
2481 let bools = vec![true, false, true, true];
2482 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2483 let serialized = serde_json::to_string(&bit_vec).unwrap();
2484 let unserialized = serde_json::from_str(&serialized).unwrap();
2485 assert_eq!(bit_vec, unserialized);
2486 }
2487
2488 #[test]
2489 fn test_bit_vec_unaligned_small_append() {
2490 let mut a = BitVec::from_elem(8, false);
2491 a.set(7, true);
2492
2493 let mut b = BitVec::from_elem(16, false);
2494 b.set(14, true);
2495
2496 let mut c = BitVec::from_elem(8, false);
2497 c.set(6, true);
2498 c.set(7, true);
2499
2500 a.append(&mut b);
2501 a.append(&mut c);
2502
2503 assert_eq!(&[01, 00, 02, 03][..], &*a.to_bytes());
2504 }
2505
2506 #[test]
2507 fn test_bit_vec_unaligned_large_append() {
2508 let mut a = BitVec::from_elem(48, false);
2509 a.set(47, true);
2510
2511 let mut b = BitVec::from_elem(48, false);
2512 b.set(46, true);
2513
2514 let mut c = BitVec::from_elem(48, false);
2515 c.set(46, true);
2516 c.set(47, true);
2517
2518 a.append(&mut b);
2519 a.append(&mut c);
2520
2521 assert_eq!(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2522 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
2523 0x00, 0x00, 0x00, 0x00, 0x00, 0x03][..], &*a.to_bytes());
2524 }
2525
2526 #[test]
2527 fn test_bit_vec_append_aligned_to_unaligned() {
2528 let mut a = BitVec::from_elem(2, true);
2529 let mut b = BitVec::from_elem(32, false);
2530 let mut c = BitVec::from_elem(8, true);
2531 a.append(&mut b);
2532 a.append(&mut c);
2533 assert_eq!(&[0xc0, 0x00, 0x00, 0x00, 0x3f, 0xc0][..], &*a.to_bytes());
2534 }
2535}