1#![doc(html_root_url = "https://docs.rs/bit-vec/0.8.0")]
86#![no_std]
87
88#[cfg(any(test, feature = "std"))]
89#[macro_use]
90extern crate std;
91#[cfg(feature = "std")]
92use std::rc::Rc;
93#[cfg(feature = "std")]
94use std::string::String;
95#[cfg(feature = "std")]
96use std::vec::Vec;
97
98#[cfg(feature = "serde")]
99extern crate serde;
100#[cfg(feature = "serde")]
101use serde::{Deserialize, Serialize};
102#[cfg(feature = "borsh")]
103extern crate borsh;
104#[cfg(feature = "miniserde")]
105extern crate miniserde;
106#[cfg(feature = "nanoserde")]
107extern crate nanoserde;
108#[cfg(feature = "nanoserde")]
109use nanoserde::{DeBin, DeJson, DeRon, SerBin, SerJson, SerRon};
110
111#[cfg(not(feature = "std"))]
112#[macro_use]
113extern crate alloc;
114#[cfg(not(feature = "std"))]
115use alloc::rc::Rc;
116#[cfg(not(feature = "std"))]
117use alloc::string::String;
118#[cfg(not(feature = "std"))]
119use alloc::vec::Vec;
120
121use core::cell::RefCell;
122use core::cmp;
123use core::cmp::Ordering;
124use core::fmt::{self, Write};
125use core::hash;
126use core::iter::repeat;
127use core::iter::FromIterator;
128use core::mem;
129use core::ops::*;
130use core::slice;
131
132type MutBlocks<'a, B> = slice::IterMut<'a, B>;
133
134pub trait BitBlock:
136 Copy
137 + Add<Self, Output = Self>
138 + Sub<Self, Output = Self>
139 + Shl<usize, Output = Self>
140 + Shr<usize, Output = Self>
141 + Not<Output = Self>
142 + BitAnd<Self, Output = Self>
143 + BitOr<Self, Output = Self>
144 + BitXor<Self, Output = Self>
145 + Rem<Self, Output = Self>
146 + Eq
147 + Ord
148 + hash::Hash
149{
150 fn bits() -> usize;
152 #[inline]
154 fn bytes() -> usize {
155 Self::bits() / 8
156 }
157 fn from_byte(byte: u8) -> Self;
159 fn count_ones(self) -> usize;
161 fn count_zeros(self) -> usize {
163 Self::bits() - self.count_ones()
164 }
165 fn zero() -> Self;
167 fn one() -> Self;
169}
170
171macro_rules! bit_block_impl {
172 ($(($t: ident, $size: expr)),*) => ($(
173 impl BitBlock for $t {
174 #[inline]
175 fn bits() -> usize { $size }
176 #[inline]
177 fn from_byte(byte: u8) -> Self { $t::from(byte) }
178 #[inline]
179 fn count_ones(self) -> usize { self.count_ones() as usize }
180 #[inline]
181 fn count_zeros(self) -> usize { self.count_zeros() as usize }
182 #[inline]
183 fn one() -> Self { 1 }
184 #[inline]
185 fn zero() -> Self { 0 }
186 }
187 )*)
188}
189
190bit_block_impl! {
191 (u8, 8),
192 (u16, 16),
193 (u32, 32),
194 (u64, 64),
195 (usize, core::mem::size_of::<usize>() * 8)
196}
197
198fn reverse_bits(byte: u8) -> u8 {
199 let mut result = 0;
200 for i in 0..u8::bits() {
201 result |= ((byte >> i) & 1) << (u8::bits() - 1 - i);
202 }
203 result
204}
205
206static TRUE: bool = true;
207static FALSE: bool = false;
208
209#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
237#[cfg_attr(
238 feature = "borsh",
239 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
240)]
241#[cfg_attr(
242 feature = "miniserde",
243 derive(miniserde::Deserialize, miniserde::Serialize)
244)]
245#[cfg_attr(
246 feature = "nanoserde",
247 derive(DeBin, DeJson, DeRon, SerBin, SerJson, SerRon)
248)]
249pub struct BitVec<B = u32> {
250 storage: Vec<B>,
252 nbits: usize,
254}
255
256impl<B: BitBlock> Index<usize> for BitVec<B> {
258 type Output = bool;
259
260 #[inline]
261 fn index(&self, i: usize) -> &bool {
262 if self.get(i).expect("index out of bounds") {
263 &TRUE
264 } else {
265 &FALSE
266 }
267 }
268}
269
270fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
272 if bits % B::bits() == 0 {
281 bits / B::bits()
282 } else {
283 bits / B::bits() + 1
284 }
285}
286
287fn mask_for_bits<B: BitBlock>(bits: usize) -> B {
289 (!B::zero()) >> ((B::bits() - bits % B::bits()) % B::bits())
291}
292
293type B = u32;
294
295impl BitVec<u32> {
296 #[inline]
305 pub fn new() -> Self {
306 Default::default()
307 }
308
309 #[inline]
324 pub fn from_elem(nbits: usize, bit: bool) -> Self {
325 let nblocks = blocks_for_bits::<B>(nbits);
326 let mut bit_vec = BitVec {
327 storage: vec![if bit { !B::zero() } else { B::zero() }; nblocks],
328 nbits,
329 };
330 bit_vec.fix_last_block();
331 bit_vec
332 }
333
334 #[inline]
342 pub fn with_capacity(nbits: usize) -> Self {
343 BitVec {
344 storage: Vec::with_capacity(blocks_for_bits::<B>(nbits)),
345 nbits: 0,
346 }
347 }
348
349 pub fn from_bytes(bytes: &[u8]) -> Self {
365 let len = bytes
366 .len()
367 .checked_mul(u8::bits())
368 .expect("capacity overflow");
369 let mut bit_vec = BitVec::with_capacity(len);
370 let complete_words = bytes.len() / B::bytes();
371 let extra_bytes = bytes.len() % B::bytes();
372
373 bit_vec.nbits = len;
374
375 for i in 0..complete_words {
376 let mut accumulator = B::zero();
377 for idx in 0..B::bytes() {
378 accumulator |= B::from_byte(reverse_bits(bytes[i * B::bytes() + idx])) << (idx * 8)
379 }
380 bit_vec.storage.push(accumulator);
381 }
382
383 if extra_bytes > 0 {
384 let mut last_word = B::zero();
385 for (i, &byte) in bytes[complete_words * B::bytes()..].iter().enumerate() {
386 last_word |= B::from_byte(reverse_bits(byte)) << (i * 8);
387 }
388 bit_vec.storage.push(last_word);
389 }
390
391 bit_vec
392 }
393
394 #[inline]
406 pub fn from_fn<F>(len: usize, mut f: F) -> Self
407 where
408 F: FnMut(usize) -> bool,
409 {
410 let mut bit_vec = BitVec::from_elem(len, false);
411 for i in 0..len {
412 bit_vec.set(i, f(i));
413 }
414 bit_vec
415 }
416}
417
418impl<B: BitBlock> BitVec<B> {
419 #[inline]
423 fn process<F>(&mut self, other: &BitVec<B>, mut op: F) -> bool
424 where
425 F: FnMut(B, B) -> B,
426 {
427 assert_eq!(self.len(), other.len());
428 debug_assert_eq!(self.storage.len(), other.storage.len());
429 let mut changed_bits = B::zero();
430 for (a, b) in self.blocks_mut().zip(other.blocks()) {
431 let w = op(*a, b);
432 changed_bits = changed_bits | (*a ^ w);
433 *a = w;
434 }
435 changed_bits != B::zero()
436 }
437
438 #[inline]
440 fn blocks_mut(&mut self) -> MutBlocks<B> {
441 self.storage.iter_mut()
443 }
444
445 #[inline]
447 pub fn blocks(&self) -> Blocks<B> {
448 Blocks {
450 iter: self.storage.iter(),
451 }
452 }
453
454 #[inline]
458 pub fn storage(&self) -> &[B] {
459 &self.storage
460 }
461
462 #[inline]
468 pub unsafe fn storage_mut(&mut self) -> &mut Vec<B> {
469 &mut self.storage
470 }
471
472 #[inline]
474 fn last_block_with_mask(&self) -> Option<(B, B)> {
475 let extra_bits = self.len() % B::bits();
476 if extra_bits > 0 {
477 let mask = (B::one() << extra_bits) - B::one();
478 let storage_len = self.storage.len();
479 Some((self.storage[storage_len - 1], mask))
480 } else {
481 None
482 }
483 }
484
485 #[inline]
487 fn last_block_mut_with_mask(&mut self) -> Option<(&mut B, B)> {
488 let extra_bits = self.len() % B::bits();
489 if extra_bits > 0 {
490 let mask = (B::one() << extra_bits) - B::one();
491 let storage_len = self.storage.len();
492 Some((&mut self.storage[storage_len - 1], mask))
493 } else {
494 None
495 }
496 }
497
498 fn fix_last_block(&mut self) {
501 if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
502 *last_block = *last_block & used_bits;
503 }
504 }
505
506 fn fix_last_block_with_ones(&mut self) {
509 if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
510 *last_block = *last_block | !used_bits;
511 }
512 }
513
514 fn is_last_block_fixed(&self) -> bool {
516 if let Some((last_block, used_bits)) = self.last_block_with_mask() {
517 last_block & !used_bits == B::zero()
518 } else {
519 true
520 }
521 }
522
523 #[inline]
531 fn ensure_invariant(&self) {
532 if cfg!(test) {
533 debug_assert!(self.is_last_block_fixed());
534 }
535 }
536
537 #[inline]
553 pub fn get(&self, i: usize) -> Option<bool> {
554 self.ensure_invariant();
555 if i >= self.nbits {
556 return None;
557 }
558 let w = i / B::bits();
559 let b = i % B::bits();
560 self.storage
561 .get(w)
562 .map(|&block| (block & (B::one() << b)) != B::zero())
563 }
564
565 #[inline]
586 pub unsafe fn get_unchecked(&self, i: usize) -> bool {
587 self.ensure_invariant();
588 let w = i / B::bits();
589 let b = i % B::bits();
590 let block = *self.storage.get_unchecked(w);
591 block & (B::one() << b) != B::zero()
592 }
593
594 #[inline]
608 pub fn get_mut(&mut self, index: usize) -> Option<MutBorrowedBit<B>> {
609 self.get(index).map(move |value| MutBorrowedBit {
610 vec: Rc::new(RefCell::new(self)),
611 index,
612 #[cfg(debug_assertions)]
613 old_value: value,
614 new_value: value,
615 })
616 }
617
618 #[inline]
638 pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> MutBorrowedBit<B> {
639 let value = self.get_unchecked(index);
640 MutBorrowedBit {
641 #[cfg(debug_assertions)]
642 old_value: value,
643 new_value: value,
644 vec: Rc::new(RefCell::new(self)),
645 index,
646 }
647 }
648
649 #[inline]
665 pub fn set(&mut self, i: usize, x: bool) {
666 self.ensure_invariant();
667 assert!(
668 i < self.nbits,
669 "index out of bounds: {:?} >= {:?}",
670 i,
671 self.nbits
672 );
673 let w = i / B::bits();
674 let b = i % B::bits();
675 let flag = B::one() << b;
676 let val = if x {
677 self.storage[w] | flag
678 } else {
679 self.storage[w] & !flag
680 };
681 self.storage[w] = val;
682 }
683
684 #[inline]
699 pub fn set_all(&mut self) {
700 self.ensure_invariant();
701 for w in &mut self.storage {
702 *w = !B::zero();
703 }
704 self.fix_last_block();
705 }
706
707 #[inline]
722 pub fn negate(&mut self) {
723 self.ensure_invariant();
724 for w in &mut self.storage {
725 *w = !*w;
726 }
727 self.fix_last_block();
728 }
729
730 #[deprecated(since = "0.7.0", note = "Please use the 'or' function instead")]
756 #[inline]
757 pub fn union(&mut self, other: &Self) -> bool {
758 self.or(other)
759 }
760
761 #[deprecated(since = "0.7.0", note = "Please use the 'and' function instead")]
787 #[inline]
788 pub fn intersect(&mut self, other: &Self) -> bool {
789 self.and(other)
790 }
791
792 #[inline]
817 pub fn or(&mut self, other: &Self) -> bool {
818 self.ensure_invariant();
819 debug_assert!(other.is_last_block_fixed());
820 self.process(other, |w1, w2| (w1 | w2))
821 }
822
823 #[inline]
848 pub fn and(&mut self, other: &Self) -> bool {
849 self.ensure_invariant();
850 debug_assert!(other.is_last_block_fixed());
851 self.process(other, |w1, w2| (w1 & w2))
852 }
853
854 #[inline]
887 pub fn difference(&mut self, other: &Self) -> bool {
888 self.ensure_invariant();
889 debug_assert!(other.is_last_block_fixed());
890 self.process(other, |w1, w2| (w1 & !w2))
891 }
892
893 #[inline]
918 pub fn xor(&mut self, other: &Self) -> bool {
919 self.ensure_invariant();
920 debug_assert!(other.is_last_block_fixed());
921 self.process(other, |w1, w2| (w1 ^ w2))
922 }
923
924 #[inline]
949 pub fn nand(&mut self, other: &Self) -> bool {
950 self.ensure_invariant();
951 debug_assert!(other.is_last_block_fixed());
952 self.fix_last_block_with_ones();
953 let result = self.process(other, |w1, w2| !(w1 & w2));
954 self.fix_last_block();
955 result
956 }
957
958 #[inline]
983 pub fn nor(&mut self, other: &Self) -> bool {
984 self.ensure_invariant();
985 debug_assert!(other.is_last_block_fixed());
986 self.fix_last_block_with_ones();
987 let result = self.process(other, |w1, w2| !(w1 | w2));
988 self.fix_last_block();
989 result
990 }
991
992 #[inline]
1017 pub fn xnor(&mut self, other: &Self) -> bool {
1018 self.ensure_invariant();
1019 debug_assert!(other.is_last_block_fixed());
1020 self.fix_last_block_with_ones();
1021 let result = self.process(other, |w1, w2| !(w1 ^ w2));
1022 self.fix_last_block();
1023 result
1024 }
1025
1026 #[inline]
1040 pub fn all(&self) -> bool {
1041 self.ensure_invariant();
1042 let mut last_word = !B::zero();
1043 self.blocks().all(|elem| {
1045 let tmp = last_word;
1046 last_word = elem;
1047 tmp == !B::zero()
1048 }) && (last_word == mask_for_bits(self.nbits))
1050 }
1051
1052 #[inline]
1069 pub fn count_ones(&self) -> u64 {
1070 self.ensure_invariant();
1071 self.blocks().map(|elem| elem.count_ones() as u64).sum()
1073 }
1074
1075 #[inline]
1092 pub fn count_zeros(&self) -> u64 {
1093 self.ensure_invariant();
1094 let extra_zeros = (B::bits() - (self.len() % B::bits())) % B::bits();
1096 self.blocks()
1097 .map(|elem| elem.count_zeros() as u64)
1098 .sum::<u64>()
1099 - extra_zeros as u64
1100 }
1101
1102 #[inline]
1113 pub fn iter(&self) -> Iter<B> {
1114 self.ensure_invariant();
1115 Iter {
1116 bit_vec: self,
1117 range: 0..self.nbits,
1118 }
1119 }
1120
1121 #[inline]
1137 pub fn iter_mut(&mut self) -> IterMut<B> {
1138 self.ensure_invariant();
1139 let nbits = self.nbits;
1140 IterMut {
1141 vec: Rc::new(RefCell::new(self)),
1142 range: 0..nbits,
1143 }
1144 }
1145
1146 pub fn append(&mut self, other: &mut Self) {
1164 self.ensure_invariant();
1165 debug_assert!(other.is_last_block_fixed());
1166
1167 let b = self.len() % B::bits();
1168 let o = other.len() % B::bits();
1169 let will_overflow = (b + o > B::bits()) || (o == 0 && b != 0);
1170
1171 self.nbits += other.len();
1172 other.nbits = 0;
1173
1174 if b == 0 {
1175 self.storage.append(&mut other.storage);
1176 } else {
1177 self.storage.reserve(other.storage.len());
1178
1179 for block in other.storage.drain(..) {
1180 {
1181 let last = self.storage.last_mut().unwrap();
1182 *last = *last | (block << b);
1183 }
1184 self.storage.push(block >> (B::bits() - b));
1185 }
1186
1187 if !will_overflow {
1189 self.storage.pop();
1190 }
1191 }
1192 }
1193
1194 pub fn split_off(&mut self, at: usize) -> Self {
1219 self.ensure_invariant();
1220 assert!(at <= self.len(), "`at` out of bounds");
1221
1222 let mut other = BitVec::<B>::default();
1223
1224 if at == 0 {
1225 mem::swap(self, &mut other);
1226 return other;
1227 } else if at == self.len() {
1228 return other;
1229 }
1230
1231 let w = at / B::bits();
1232 let b = at % B::bits();
1233 other.nbits = self.nbits - at;
1234 self.nbits = at;
1235 if b == 0 {
1236 other.storage = self.storage.split_off(w);
1238 } else {
1239 other.storage.reserve(self.storage.len() - w);
1240
1241 {
1242 let mut iter = self.storage[w..].iter();
1243 let mut last = *iter.next().unwrap();
1244 for &cur in iter {
1245 other.storage.push((last >> b) | (cur << (B::bits() - b)));
1246 last = cur;
1247 }
1248 other.storage.push(last >> b);
1249 }
1250
1251 self.storage.truncate(w + 1);
1252 self.fix_last_block();
1253 }
1254
1255 other
1256 }
1257
1258 #[inline]
1272 pub fn none(&self) -> bool {
1273 self.blocks().all(|w| w == B::zero())
1274 }
1275
1276 #[inline]
1290 pub fn any(&self) -> bool {
1291 !self.none()
1292 }
1293
1294 pub fn to_bytes(&self) -> Vec<u8> {
1316 self.ensure_invariant();
1317 fn bit<B: BitBlock>(bit_vec: &BitVec<B>, byte: usize, bit: usize) -> u8 {
1319 let offset = byte * 8 + bit;
1320 if offset >= bit_vec.nbits {
1321 0
1322 } else {
1323 (bit_vec[offset] as u8) << (7 - bit)
1324 }
1325 }
1326
1327 let len = self.nbits / 8 + if self.nbits % 8 == 0 { 0 } else { 1 };
1328 (0..len)
1329 .map(|i| {
1330 bit(self, i, 0)
1331 | bit(self, i, 1)
1332 | bit(self, i, 2)
1333 | bit(self, i, 3)
1334 | bit(self, i, 4)
1335 | bit(self, i, 5)
1336 | bit(self, i, 6)
1337 | bit(self, i, 7)
1338 })
1339 .collect()
1340 }
1341
1342 #[inline]
1360 pub fn eq_vec(&self, v: &[bool]) -> bool {
1361 assert_eq!(self.nbits, v.len());
1362 self.iter().zip(v.iter().cloned()).all(|(b1, b2)| b1 == b2)
1363 }
1364
1365 #[inline]
1380 pub fn truncate(&mut self, len: usize) {
1381 self.ensure_invariant();
1382 if len < self.len() {
1383 self.nbits = len;
1384 self.storage.truncate(blocks_for_bits::<B>(len));
1386 self.fix_last_block();
1387 }
1388 }
1389
1390 #[inline]
1408 pub fn reserve(&mut self, additional: usize) {
1409 let desired_cap = self
1410 .len()
1411 .checked_add(additional)
1412 .expect("capacity overflow");
1413 let storage_len = self.storage.len();
1414 if desired_cap > self.capacity() {
1415 self.storage
1416 .reserve(blocks_for_bits::<B>(desired_cap) - storage_len);
1417 }
1418 }
1419
1420 #[inline]
1442 pub fn reserve_exact(&mut self, additional: usize) {
1443 let desired_cap = self
1444 .len()
1445 .checked_add(additional)
1446 .expect("capacity overflow");
1447 let storage_len = self.storage.len();
1448 if desired_cap > self.capacity() {
1449 self.storage
1450 .reserve_exact(blocks_for_bits::<B>(desired_cap) - storage_len);
1451 }
1452 }
1453
1454 #[inline]
1467 pub fn capacity(&self) -> usize {
1468 self.storage.capacity().saturating_mul(B::bits())
1469 }
1470
1471 pub fn grow(&mut self, n: usize, value: bool) {
1488 self.ensure_invariant();
1489
1490 let new_nbits = self.nbits.checked_add(n).expect("capacity overflow");
1495 let new_nblocks = blocks_for_bits::<B>(new_nbits);
1496 let full_value = if value { !B::zero() } else { B::zero() };
1497
1498 let num_cur_blocks = blocks_for_bits::<B>(self.nbits);
1500 if self.nbits % B::bits() > 0 {
1501 let mask = mask_for_bits::<B>(self.nbits);
1502 if value {
1503 let block = &mut self.storage[num_cur_blocks - 1];
1504 *block = *block | !mask;
1505 } else {
1506 }
1508 }
1509
1510 let stop_idx = cmp::min(self.storage.len(), new_nblocks);
1512 for idx in num_cur_blocks..stop_idx {
1513 self.storage[idx] = full_value;
1514 }
1515
1516 if new_nblocks > self.storage.len() {
1518 let to_add = new_nblocks - self.storage.len();
1519 self.storage.extend(repeat(full_value).take(to_add));
1520 }
1521
1522 self.nbits = new_nbits;
1524
1525 self.fix_last_block();
1526 }
1527
1528 #[inline]
1541 pub fn pop(&mut self) -> Option<bool> {
1542 self.ensure_invariant();
1543
1544 if self.is_empty() {
1545 None
1546 } else {
1547 let i = self.nbits - 1;
1548 let ret = self[i];
1549 self.set(i, false);
1551 self.nbits = i;
1552 if self.nbits % B::bits() == 0 {
1553 self.storage.pop();
1555 }
1556 Some(ret)
1557 }
1558 }
1559
1560 #[inline]
1573 pub fn push(&mut self, elem: bool) {
1574 if self.nbits % B::bits() == 0 {
1575 self.storage.push(B::zero());
1576 }
1577 let insert_pos = self.nbits;
1578 self.nbits = self.nbits.checked_add(1).expect("Capacity overflow");
1579 self.set(insert_pos, elem);
1580 }
1581
1582 #[inline]
1584 pub fn len(&self) -> usize {
1585 self.nbits
1586 }
1587
1588 #[inline]
1594 pub unsafe fn set_len(&mut self, len: usize) {
1595 self.nbits = len;
1596 }
1597
1598 #[inline]
1600 pub fn is_empty(&self) -> bool {
1601 self.len() == 0
1602 }
1603
1604 #[inline]
1606 pub fn clear(&mut self) {
1607 self.ensure_invariant();
1608 for w in &mut self.storage {
1609 *w = B::zero();
1610 }
1611 }
1612
1613 pub fn shrink_to_fit(&mut self) {
1620 self.storage.shrink_to_fit();
1621 }
1622
1623 pub fn insert(&mut self, at: usize, bit: bool) {
1648 assert!(
1649 at <= self.nbits,
1650 "insertion index (is {at}) should be <= nbits (is {nbits})",
1651 nbits = self.nbits
1652 );
1653
1654 let last_block_bits = self.nbits % B::bits();
1655 let block_at = at / B::bits(); let bit_at = at % B::bits(); if last_block_bits == 0 {
1659 self.storage.push(B::zero());
1660 }
1661
1662 self.nbits += 1;
1663
1664 let mut carry = self.storage[block_at] >> (B::bits() - 1);
1665 let lsbits_mask = (B::one() << bit_at) - B::one();
1666 let set_bit = if bit { B::one() } else { B::zero() } << bit_at;
1667 self.storage[block_at] = (self.storage[block_at] & lsbits_mask)
1668 | ((self.storage[block_at] & !lsbits_mask) << 1)
1669 | set_bit;
1670
1671 for block_ref in &mut self.storage[block_at + 1..] {
1672 let curr_carry = *block_ref >> (B::bits() - 1);
1673 *block_ref = *block_ref << 1 | carry;
1674 carry = curr_carry;
1675 }
1676 }
1677}
1678
1679impl<B: BitBlock> Default for BitVec<B> {
1680 #[inline]
1681 fn default() -> Self {
1682 BitVec {
1683 storage: Vec::new(),
1684 nbits: 0,
1685 }
1686 }
1687}
1688
1689impl<B: BitBlock> FromIterator<bool> for BitVec<B> {
1690 #[inline]
1691 fn from_iter<I: IntoIterator<Item = bool>>(iter: I) -> Self {
1692 let mut ret: Self = Default::default();
1693 ret.extend(iter);
1694 ret
1695 }
1696}
1697
1698impl<B: BitBlock> Extend<bool> for BitVec<B> {
1699 #[inline]
1700 fn extend<I: IntoIterator<Item = bool>>(&mut self, iterable: I) {
1701 self.ensure_invariant();
1702 let iterator = iterable.into_iter();
1703 let (min, _) = iterator.size_hint();
1704 self.reserve(min);
1705 for element in iterator {
1706 self.push(element)
1707 }
1708 }
1709}
1710
1711impl<B: BitBlock> Clone for BitVec<B> {
1712 #[inline]
1713 fn clone(&self) -> Self {
1714 self.ensure_invariant();
1715 BitVec {
1716 storage: self.storage.clone(),
1717 nbits: self.nbits,
1718 }
1719 }
1720
1721 #[inline]
1722 fn clone_from(&mut self, source: &Self) {
1723 debug_assert!(source.is_last_block_fixed());
1724 self.nbits = source.nbits;
1725 self.storage.clone_from(&source.storage);
1726 }
1727}
1728
1729impl<B: BitBlock> PartialOrd for BitVec<B> {
1730 #[inline]
1731 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1732 Some(self.cmp(other))
1733 }
1734}
1735
1736impl<B: BitBlock> Ord for BitVec<B> {
1737 #[inline]
1738 fn cmp(&self, other: &Self) -> Ordering {
1739 self.ensure_invariant();
1740 debug_assert!(other.is_last_block_fixed());
1741 let mut a = self.iter();
1742 let mut b = other.iter();
1743 loop {
1744 match (a.next(), b.next()) {
1745 (Some(x), Some(y)) => match x.cmp(&y) {
1746 Ordering::Equal => {}
1747 otherwise => return otherwise,
1748 },
1749 (None, None) => return Ordering::Equal,
1750 (None, _) => return Ordering::Less,
1751 (_, None) => return Ordering::Greater,
1752 }
1753 }
1754 }
1755}
1756
1757impl<B: BitBlock> fmt::Display for BitVec<B> {
1758 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
1759 self.ensure_invariant();
1760 for bit in self {
1761 fmt.write_char(if bit { '1' } else { '0' })?;
1762 }
1763 Ok(())
1764 }
1765}
1766
1767impl<B: BitBlock> fmt::Debug for BitVec<B> {
1768 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
1769 self.ensure_invariant();
1770 let mut storage = String::with_capacity(self.len() + self.len() / B::bits());
1771 for (i, bit) in self.iter().enumerate() {
1772 if i != 0 && i % B::bits() == 0 {
1773 storage.push(' ');
1774 }
1775 storage.push(if bit { '1' } else { '0' });
1776 }
1777 fmt.debug_struct("BitVec")
1778 .field("storage", &storage)
1779 .field("nbits", &self.nbits)
1780 .finish()
1781 }
1782}
1783
1784impl<B: BitBlock> hash::Hash for BitVec<B> {
1785 #[inline]
1786 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1787 self.ensure_invariant();
1788 self.nbits.hash(state);
1789 for elem in self.blocks() {
1790 elem.hash(state);
1791 }
1792 }
1793}
1794
1795impl<B: BitBlock> cmp::PartialEq for BitVec<B> {
1796 #[inline]
1797 fn eq(&self, other: &Self) -> bool {
1798 if self.nbits != other.nbits {
1799 self.ensure_invariant();
1800 other.ensure_invariant();
1801 return false;
1802 }
1803 self.blocks().zip(other.blocks()).all(|(w1, w2)| w1 == w2)
1804 }
1805}
1806
1807impl<B: BitBlock> cmp::Eq for BitVec<B> {}
1808
1809#[derive(Clone)]
1811pub struct Iter<'a, B: 'a = u32> {
1812 bit_vec: &'a BitVec<B>,
1813 range: Range<usize>,
1814}
1815
1816#[derive(Debug)]
1817pub struct MutBorrowedBit<'a, B: 'a + BitBlock> {
1818 vec: Rc<RefCell<&'a mut BitVec<B>>>,
1819 index: usize,
1820 #[cfg(debug_assertions)]
1821 old_value: bool,
1822 new_value: bool,
1823}
1824
1825pub struct IterMut<'a, B: 'a + BitBlock = u32> {
1827 vec: Rc<RefCell<&'a mut BitVec<B>>>,
1828 range: Range<usize>,
1829}
1830
1831impl<'a, B: 'a + BitBlock> IterMut<'a, B> {
1832 fn get(&mut self, index: Option<usize>) -> Option<MutBorrowedBit<'a, B>> {
1833 let index = index?;
1834 let value = (*self.vec).borrow().get(index)?;
1835 Some(MutBorrowedBit {
1836 vec: self.vec.clone(),
1837 index,
1838 #[cfg(debug_assertions)]
1839 old_value: value,
1840 new_value: value,
1841 })
1842 }
1843}
1844
1845impl<'a, B: BitBlock> Deref for MutBorrowedBit<'a, B> {
1846 type Target = bool;
1847
1848 fn deref(&self) -> &Self::Target {
1849 &self.new_value
1850 }
1851}
1852
1853impl<'a, B: BitBlock> DerefMut for MutBorrowedBit<'a, B> {
1854 fn deref_mut(&mut self) -> &mut Self::Target {
1855 &mut self.new_value
1856 }
1857}
1858
1859impl<'a, B: BitBlock> Drop for MutBorrowedBit<'a, B> {
1860 fn drop(&mut self) {
1861 let mut vec = (*self.vec).borrow_mut();
1862 #[cfg(debug_assertions)]
1863 debug_assert_eq!(
1864 Some(self.old_value),
1865 vec.get(self.index),
1866 "Mutably-borrowed bit was modified externally!"
1867 );
1868 vec.set(self.index, self.new_value);
1869 }
1870}
1871
1872impl<'a, B: BitBlock> Iterator for Iter<'a, B> {
1873 type Item = bool;
1874
1875 #[inline]
1876 fn next(&mut self) -> Option<bool> {
1877 self.range.next().map(|i| self.bit_vec.get(i).unwrap())
1880 }
1881
1882 fn size_hint(&self) -> (usize, Option<usize>) {
1883 self.range.size_hint()
1884 }
1885}
1886
1887impl<'a, B: BitBlock> Iterator for IterMut<'a, B> {
1888 type Item = MutBorrowedBit<'a, B>;
1889
1890 #[inline]
1891 fn next(&mut self) -> Option<Self::Item> {
1892 let index = self.range.next();
1893 self.get(index)
1894 }
1895
1896 fn size_hint(&self) -> (usize, Option<usize>) {
1897 self.range.size_hint()
1898 }
1899}
1900
1901impl<'a, B: BitBlock> DoubleEndedIterator for Iter<'a, B> {
1902 #[inline]
1903 fn next_back(&mut self) -> Option<bool> {
1904 self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
1905 }
1906}
1907
1908impl<'a, B: BitBlock> DoubleEndedIterator for IterMut<'a, B> {
1909 #[inline]
1910 fn next_back(&mut self) -> Option<Self::Item> {
1911 let index = self.range.next_back();
1912 self.get(index)
1913 }
1914}
1915
1916impl<'a, B: BitBlock> ExactSizeIterator for Iter<'a, B> {}
1917
1918impl<'a, B: BitBlock> ExactSizeIterator for IterMut<'a, B> {}
1919
1920impl<'a, B: BitBlock> IntoIterator for &'a BitVec<B> {
1921 type Item = bool;
1922 type IntoIter = Iter<'a, B>;
1923
1924 #[inline]
1925 fn into_iter(self) -> Iter<'a, B> {
1926 self.iter()
1927 }
1928}
1929
1930pub struct IntoIter<B = u32> {
1931 bit_vec: BitVec<B>,
1932 range: Range<usize>,
1933}
1934
1935impl<B: BitBlock> Iterator for IntoIter<B> {
1936 type Item = bool;
1937
1938 #[inline]
1939 fn next(&mut self) -> Option<bool> {
1940 self.range.next().map(|i| self.bit_vec.get(i).unwrap())
1941 }
1942}
1943
1944impl<B: BitBlock> DoubleEndedIterator for IntoIter<B> {
1945 #[inline]
1946 fn next_back(&mut self) -> Option<bool> {
1947 self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
1948 }
1949}
1950
1951impl<B: BitBlock> ExactSizeIterator for IntoIter<B> {}
1952
1953impl<B: BitBlock> IntoIterator for BitVec<B> {
1954 type Item = bool;
1955 type IntoIter = IntoIter<B>;
1956
1957 #[inline]
1958 fn into_iter(self) -> IntoIter<B> {
1959 let nbits = self.nbits;
1960 IntoIter {
1961 bit_vec: self,
1962 range: 0..nbits,
1963 }
1964 }
1965}
1966
1967#[derive(Clone)]
1969pub struct Blocks<'a, B: 'a> {
1970 iter: slice::Iter<'a, B>,
1971}
1972
1973impl<'a, B: BitBlock> Iterator for Blocks<'a, B> {
1974 type Item = B;
1975
1976 #[inline]
1977 fn next(&mut self) -> Option<B> {
1978 self.iter.next().cloned()
1979 }
1980
1981 #[inline]
1982 fn size_hint(&self) -> (usize, Option<usize>) {
1983 self.iter.size_hint()
1984 }
1985}
1986
1987impl<'a, B: BitBlock> DoubleEndedIterator for Blocks<'a, B> {
1988 #[inline]
1989 fn next_back(&mut self) -> Option<B> {
1990 self.iter.next_back().cloned()
1991 }
1992}
1993
1994impl<'a, B: BitBlock> ExactSizeIterator for Blocks<'a, B> {}
1995
1996#[cfg(test)]
1997mod tests {
1998 use super::{BitVec, Iter, Vec};
1999
2000 const U32_BITS: usize = 32;
2002
2003 #[test]
2004 fn test_display_output() {
2005 assert_eq!(format!("{}", BitVec::new()), "");
2006 assert_eq!(format!("{}", BitVec::from_elem(1, true)), "1");
2007 assert_eq!(format!("{}", BitVec::from_elem(8, false)), "00000000")
2008 }
2009
2010 #[test]
2011 fn test_debug_output() {
2012 assert_eq!(
2013 format!("{:?}", BitVec::new()),
2014 "BitVec { storage: \"\", nbits: 0 }"
2015 );
2016 assert_eq!(
2017 format!("{:?}", BitVec::from_elem(1, true)),
2018 "BitVec { storage: \"1\", nbits: 1 }"
2019 );
2020 assert_eq!(
2021 format!("{:?}", BitVec::from_elem(8, false)),
2022 "BitVec { storage: \"00000000\", nbits: 8 }"
2023 );
2024 assert_eq!(
2025 format!("{:?}", BitVec::from_elem(33, true)),
2026 "BitVec { storage: \"11111111111111111111111111111111 1\", nbits: 33 }"
2027 );
2028 assert_eq!(
2029 format!(
2030 "{:?}",
2031 BitVec::from_bytes(&[0b111, 0b000, 0b1110, 0b0001, 0b11111111, 0b00000000])
2032 ),
2033 "BitVec { storage: \"00000111000000000000111000000001 1111111100000000\", nbits: 48 }"
2034 )
2035 }
2036
2037 #[test]
2038 fn test_0_elements() {
2039 let act = BitVec::new();
2040 let exp = Vec::new();
2041 assert!(act.eq_vec(&exp));
2042 assert!(act.none() && act.all());
2043 }
2044
2045 #[test]
2046 fn test_1_element() {
2047 let mut act = BitVec::from_elem(1, false);
2048 assert!(act.eq_vec(&[false]));
2049 assert!(act.none() && !act.all());
2050 act = BitVec::from_elem(1, true);
2051 assert!(act.eq_vec(&[true]));
2052 assert!(!act.none() && act.all());
2053 }
2054
2055 #[test]
2056 fn test_2_elements() {
2057 let mut b = BitVec::from_elem(2, false);
2058 b.set(0, true);
2059 b.set(1, false);
2060 assert_eq!(format!("{}", b), "10");
2061 assert!(!b.none() && !b.all());
2062 }
2063
2064 #[test]
2065 fn test_10_elements() {
2066 let mut act = BitVec::from_elem(10, false);
2069 assert!(
2070 (act.eq_vec(&[false, false, false, false, false, false, false, false, false, false]))
2071 );
2072 assert!(act.none() && !act.all());
2073 act = BitVec::from_elem(10, true);
2076 assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
2077 assert!(!act.none() && act.all());
2078 act = BitVec::from_elem(10, false);
2081 act.set(0, true);
2082 act.set(1, true);
2083 act.set(2, true);
2084 act.set(3, true);
2085 act.set(4, true);
2086 assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
2087 assert!(!act.none() && !act.all());
2088 act = BitVec::from_elem(10, false);
2091 act.set(5, true);
2092 act.set(6, true);
2093 act.set(7, true);
2094 act.set(8, true);
2095 act.set(9, true);
2096 assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
2097 assert!(!act.none() && !act.all());
2098 act = BitVec::from_elem(10, false);
2101 act.set(0, true);
2102 act.set(3, true);
2103 act.set(6, true);
2104 act.set(9, true);
2105 assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
2106 assert!(!act.none() && !act.all());
2107 }
2108
2109 #[test]
2110 fn test_31_elements() {
2111 let mut act = BitVec::from_elem(31, false);
2114 assert!(act.eq_vec(&[
2115 false, false, false, false, false, false, false, false, false, false, false, false,
2116 false, false, false, false, false, false, false, false, false, false, false, false,
2117 false, false, false, false, false, false, false
2118 ]));
2119 assert!(act.none() && !act.all());
2120 act = BitVec::from_elem(31, true);
2123 assert!(act.eq_vec(&[
2124 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2125 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2126 true, true, true
2127 ]));
2128 assert!(!act.none() && act.all());
2129 act = BitVec::from_elem(31, false);
2132 act.set(0, true);
2133 act.set(1, true);
2134 act.set(2, true);
2135 act.set(3, true);
2136 act.set(4, true);
2137 act.set(5, true);
2138 act.set(6, true);
2139 act.set(7, true);
2140 assert!(act.eq_vec(&[
2141 true, true, true, true, true, true, true, true, false, false, false, false, false,
2142 false, false, false, false, false, false, false, false, false, false, false, false,
2143 false, false, false, false, false, false
2144 ]));
2145 assert!(!act.none() && !act.all());
2146 act = BitVec::from_elem(31, false);
2149 act.set(16, true);
2150 act.set(17, true);
2151 act.set(18, true);
2152 act.set(19, true);
2153 act.set(20, true);
2154 act.set(21, true);
2155 act.set(22, true);
2156 act.set(23, true);
2157 assert!(act.eq_vec(&[
2158 false, false, false, false, false, false, false, false, false, false, false, false,
2159 false, false, false, false, true, true, true, true, true, true, true, true, false,
2160 false, false, false, false, false, false
2161 ]));
2162 assert!(!act.none() && !act.all());
2163 act = BitVec::from_elem(31, false);
2166 act.set(24, true);
2167 act.set(25, true);
2168 act.set(26, true);
2169 act.set(27, true);
2170 act.set(28, true);
2171 act.set(29, true);
2172 act.set(30, true);
2173 assert!(act.eq_vec(&[
2174 false, false, false, false, false, false, false, false, false, false, false, false,
2175 false, false, false, false, false, false, false, false, false, false, false, false,
2176 true, true, true, true, true, true, true
2177 ]));
2178 assert!(!act.none() && !act.all());
2179 act = BitVec::from_elem(31, false);
2182 act.set(3, true);
2183 act.set(17, true);
2184 act.set(30, true);
2185 assert!(act.eq_vec(&[
2186 false, false, false, true, false, false, false, false, false, false, false, false,
2187 false, false, false, false, false, true, false, false, false, false, false, false,
2188 false, false, false, false, false, false, true
2189 ]));
2190 assert!(!act.none() && !act.all());
2191 }
2192
2193 #[test]
2194 fn test_32_elements() {
2195 let mut act = BitVec::from_elem(32, false);
2198 assert!(act.eq_vec(&[
2199 false, false, false, false, false, false, false, false, false, false, false, false,
2200 false, false, false, false, false, false, false, false, false, false, false, false,
2201 false, false, false, false, false, false, false, false
2202 ]));
2203 assert!(act.none() && !act.all());
2204 act = BitVec::from_elem(32, true);
2207 assert!(act.eq_vec(&[
2208 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2209 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2210 true, true, true, true
2211 ]));
2212 assert!(!act.none() && act.all());
2213 act = BitVec::from_elem(32, false);
2216 act.set(0, true);
2217 act.set(1, true);
2218 act.set(2, true);
2219 act.set(3, true);
2220 act.set(4, true);
2221 act.set(5, true);
2222 act.set(6, true);
2223 act.set(7, true);
2224 assert!(act.eq_vec(&[
2225 true, true, true, true, true, true, true, true, false, false, false, false, false,
2226 false, false, false, false, false, false, false, false, false, false, false, false,
2227 false, false, false, false, false, false, false
2228 ]));
2229 assert!(!act.none() && !act.all());
2230 act = BitVec::from_elem(32, false);
2233 act.set(16, true);
2234 act.set(17, true);
2235 act.set(18, true);
2236 act.set(19, true);
2237 act.set(20, true);
2238 act.set(21, true);
2239 act.set(22, true);
2240 act.set(23, true);
2241 assert!(act.eq_vec(&[
2242 false, false, false, false, false, false, false, false, false, false, false, false,
2243 false, false, false, false, true, true, true, true, true, true, true, true, false,
2244 false, false, false, false, false, false, false
2245 ]));
2246 assert!(!act.none() && !act.all());
2247 act = BitVec::from_elem(32, false);
2250 act.set(24, true);
2251 act.set(25, true);
2252 act.set(26, true);
2253 act.set(27, true);
2254 act.set(28, true);
2255 act.set(29, true);
2256 act.set(30, true);
2257 act.set(31, true);
2258 assert!(act.eq_vec(&[
2259 false, false, false, false, false, false, false, false, false, false, false, false,
2260 false, false, false, false, false, false, false, false, false, false, false, false,
2261 true, true, true, true, true, true, true, true
2262 ]));
2263 assert!(!act.none() && !act.all());
2264 act = BitVec::from_elem(32, false);
2267 act.set(3, true);
2268 act.set(17, true);
2269 act.set(30, true);
2270 act.set(31, true);
2271 assert!(act.eq_vec(&[
2272 false, false, false, true, false, false, false, false, false, false, false, false,
2273 false, false, false, false, false, true, false, false, false, false, false, false,
2274 false, false, false, false, false, false, true, true
2275 ]));
2276 assert!(!act.none() && !act.all());
2277 }
2278
2279 #[test]
2280 fn test_33_elements() {
2281 let mut act = BitVec::from_elem(33, false);
2284 assert!(act.eq_vec(&[
2285 false, false, false, false, false, false, false, false, false, false, false, false,
2286 false, false, false, false, false, false, false, false, false, false, false, false,
2287 false, false, false, false, false, false, false, false, false
2288 ]));
2289 assert!(act.none() && !act.all());
2290 act = BitVec::from_elem(33, true);
2293 assert!(act.eq_vec(&[
2294 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2295 true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2296 true, true, true, true, true
2297 ]));
2298 assert!(!act.none() && act.all());
2299 act = BitVec::from_elem(33, false);
2302 act.set(0, true);
2303 act.set(1, true);
2304 act.set(2, true);
2305 act.set(3, true);
2306 act.set(4, true);
2307 act.set(5, true);
2308 act.set(6, true);
2309 act.set(7, true);
2310 assert!(act.eq_vec(&[
2311 true, true, true, true, true, true, true, true, false, false, false, false, false,
2312 false, false, false, false, false, false, false, false, false, false, false, false,
2313 false, false, false, false, false, false, false, false
2314 ]));
2315 assert!(!act.none() && !act.all());
2316 act = BitVec::from_elem(33, false);
2319 act.set(16, true);
2320 act.set(17, true);
2321 act.set(18, true);
2322 act.set(19, true);
2323 act.set(20, true);
2324 act.set(21, true);
2325 act.set(22, true);
2326 act.set(23, true);
2327 assert!(act.eq_vec(&[
2328 false, false, false, false, false, false, false, false, false, false, false, false,
2329 false, false, false, false, true, true, true, true, true, true, true, true, false,
2330 false, false, false, false, false, false, false, false
2331 ]));
2332 assert!(!act.none() && !act.all());
2333 act = BitVec::from_elem(33, false);
2336 act.set(24, true);
2337 act.set(25, true);
2338 act.set(26, true);
2339 act.set(27, true);
2340 act.set(28, true);
2341 act.set(29, true);
2342 act.set(30, true);
2343 act.set(31, true);
2344 assert!(act.eq_vec(&[
2345 false, false, false, false, false, false, false, false, false, false, false, false,
2346 false, false, false, false, false, false, false, false, false, false, false, false,
2347 true, true, true, true, true, true, true, true, false
2348 ]));
2349 assert!(!act.none() && !act.all());
2350 act = BitVec::from_elem(33, false);
2353 act.set(3, true);
2354 act.set(17, true);
2355 act.set(30, true);
2356 act.set(31, true);
2357 act.set(32, true);
2358 assert!(act.eq_vec(&[
2359 false, false, false, true, false, false, false, false, false, false, false, false,
2360 false, false, false, false, false, true, false, false, false, false, false, false,
2361 false, false, false, false, false, false, true, true, true
2362 ]));
2363 assert!(!act.none() && !act.all());
2364 }
2365
2366 #[test]
2367 fn test_equal_differing_sizes() {
2368 let v0 = BitVec::from_elem(10, false);
2369 let v1 = BitVec::from_elem(11, false);
2370 assert_ne!(v0, v1);
2371 }
2372
2373 #[test]
2374 fn test_equal_greatly_differing_sizes() {
2375 let v0 = BitVec::from_elem(10, false);
2376 let v1 = BitVec::from_elem(110, false);
2377 assert_ne!(v0, v1);
2378 }
2379
2380 #[test]
2381 fn test_equal_sneaky_small() {
2382 let mut a = BitVec::from_elem(1, false);
2383 a.set(0, true);
2384
2385 let mut b = BitVec::from_elem(1, true);
2386 b.set(0, true);
2387
2388 assert_eq!(a, b);
2389 }
2390
2391 #[test]
2392 fn test_equal_sneaky_big() {
2393 let mut a = BitVec::from_elem(100, false);
2394 for i in 0..100 {
2395 a.set(i, true);
2396 }
2397
2398 let mut b = BitVec::from_elem(100, true);
2399 for i in 0..100 {
2400 b.set(i, true);
2401 }
2402
2403 assert_eq!(a, b);
2404 }
2405
2406 #[test]
2407 fn test_from_bytes() {
2408 let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
2409 let str = concat!("10110110", "00000000", "11111111");
2410 assert_eq!(format!("{}", bit_vec), str);
2411 }
2412
2413 #[test]
2414 fn test_to_bytes() {
2415 let mut bv = BitVec::from_elem(3, true);
2416 bv.set(1, false);
2417 assert_eq!(bv.to_bytes(), [0b10100000]);
2418
2419 let mut bv = BitVec::from_elem(9, false);
2420 bv.set(2, true);
2421 bv.set(8, true);
2422 assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
2423 }
2424
2425 #[test]
2426 fn test_from_bools() {
2427 let bools = [true, false, true, true];
2428 let bit_vec: BitVec = bools.iter().copied().collect();
2429 assert_eq!(format!("{}", bit_vec), "1011");
2430 }
2431
2432 #[test]
2433 fn test_to_bools() {
2434 let bools = vec![false, false, true, false, false, true, true, false];
2435 assert_eq!(
2436 BitVec::from_bytes(&[0b00100110])
2437 .iter()
2438 .collect::<Vec<bool>>(),
2439 bools
2440 );
2441 }
2442
2443 #[test]
2444 fn test_bit_vec_iterator() {
2445 let bools = vec![true, false, true, true];
2446 let bit_vec: BitVec = bools.iter().copied().collect();
2447
2448 assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
2449
2450 let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
2451 let bit_vec: BitVec = long.iter().copied().collect();
2452 assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
2453 }
2454
2455 #[test]
2456 fn test_small_difference() {
2457 let mut b1 = BitVec::from_elem(3, false);
2458 let mut b2 = BitVec::from_elem(3, false);
2459 b1.set(0, true);
2460 b1.set(1, true);
2461 b2.set(1, true);
2462 b2.set(2, true);
2463 assert!(b1.difference(&b2));
2464 assert!(b1[0]);
2465 assert!(!b1[1]);
2466 assert!(!b1[2]);
2467 }
2468
2469 #[test]
2470 fn test_big_difference() {
2471 let mut b1 = BitVec::from_elem(100, false);
2472 let mut b2 = BitVec::from_elem(100, false);
2473 b1.set(0, true);
2474 b1.set(40, true);
2475 b2.set(40, true);
2476 b2.set(80, true);
2477 assert!(b1.difference(&b2));
2478 assert!(b1[0]);
2479 assert!(!b1[40]);
2480 assert!(!b1[80]);
2481 }
2482
2483 #[test]
2484 fn test_small_xor() {
2485 let mut a = BitVec::from_bytes(&[0b0011]);
2486 let b = BitVec::from_bytes(&[0b0101]);
2487 let c = BitVec::from_bytes(&[0b0110]);
2488 assert!(a.xor(&b));
2489 assert_eq!(a, c);
2490 }
2491
2492 #[test]
2493 fn test_small_xnor() {
2494 let mut a = BitVec::from_bytes(&[0b0011]);
2495 let b = BitVec::from_bytes(&[0b1111_0101]);
2496 let c = BitVec::from_bytes(&[0b1001]);
2497 assert!(a.xnor(&b));
2498 assert_eq!(a, c);
2499 }
2500
2501 #[test]
2502 fn test_small_nand() {
2503 let mut a = BitVec::from_bytes(&[0b1111_0011]);
2504 let b = BitVec::from_bytes(&[0b1111_0101]);
2505 let c = BitVec::from_bytes(&[0b1110]);
2506 assert!(a.nand(&b));
2507 assert_eq!(a, c);
2508 }
2509
2510 #[test]
2511 fn test_small_nor() {
2512 let mut a = BitVec::from_bytes(&[0b0011]);
2513 let b = BitVec::from_bytes(&[0b1111_0101]);
2514 let c = BitVec::from_bytes(&[0b1000]);
2515 assert!(a.nor(&b));
2516 assert_eq!(a, c);
2517 }
2518
2519 #[test]
2520 fn test_big_xor() {
2521 let mut a = BitVec::from_bytes(&[
2522 0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2524 ]);
2525 let b = BitVec::from_bytes(&[
2526 0, 0, 0b00010100, 0, 0, 0, 0, 0, 0, 0, 0b00110100,
2528 ]);
2529 let c = BitVec::from_bytes(&[
2530 0, 0, 0, 0, 0, 0, 0, 0b00110100, 0, 0, 0b00110100,
2532 ]);
2533 assert!(a.xor(&b));
2534 assert_eq!(a, c);
2535 }
2536
2537 #[test]
2538 fn test_big_xnor() {
2539 let mut a = BitVec::from_bytes(&[
2540 0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2542 ]);
2543 let b = BitVec::from_bytes(&[
2544 0, 0, 0b00010100, 0, 0, 0, 0, 0, 0, 0, 0b00110100,
2546 ]);
2547 let c = BitVec::from_bytes(&[
2548 !0,
2550 !0,
2551 !0,
2552 !0,
2553 !0,
2554 !0,
2555 !0,
2556 !0b00110100,
2557 !0,
2558 !0,
2559 !0b00110100,
2560 ]);
2561 assert!(a.xnor(&b));
2562 assert_eq!(a, c);
2563 }
2564
2565 #[test]
2566 fn test_small_clear() {
2567 let mut b = BitVec::from_elem(14, true);
2568 assert!(!b.none() && b.all());
2569 b.clear();
2570 assert!(b.none() && !b.all());
2571 }
2572
2573 #[test]
2574 fn test_big_clear() {
2575 let mut b = BitVec::from_elem(140, true);
2576 assert!(!b.none() && b.all());
2577 b.clear();
2578 assert!(b.none() && !b.all());
2579 }
2580
2581 #[test]
2582 fn test_bit_vec_lt() {
2583 let mut a = BitVec::from_elem(5, false);
2584 let mut b = BitVec::from_elem(5, false);
2585
2586 assert!(a >= b && b >= a);
2587 b.set(2, true);
2588 assert!(a < b);
2589 a.set(3, true);
2590 assert!(a < b);
2591 a.set(2, true);
2592 assert!(a >= b && b < a);
2593 b.set(0, true);
2594 assert!(a < b);
2595 }
2596
2597 #[test]
2598 fn test_ord() {
2599 let mut a = BitVec::from_elem(5, false);
2600 let mut b = BitVec::from_elem(5, false);
2601
2602 assert!(a == b);
2603 a.set(1, true);
2604 assert!(a > b && a >= b);
2605 assert!(b < a && b <= a);
2606 b.set(1, true);
2607 b.set(2, true);
2608 assert!(b > a && b >= a);
2609 assert!(a < b && a <= b);
2610 }
2611
2612 #[test]
2613 fn test_small_bit_vec_tests() {
2614 let v = BitVec::from_bytes(&[0]);
2615 assert!(!v.all());
2616 assert!(!v.any());
2617 assert!(v.none());
2618
2619 let v = BitVec::from_bytes(&[0b00010100]);
2620 assert!(!v.all());
2621 assert!(v.any());
2622 assert!(!v.none());
2623
2624 let v = BitVec::from_bytes(&[0xFF]);
2625 assert!(v.all());
2626 assert!(v.any());
2627 assert!(!v.none());
2628 }
2629
2630 #[test]
2631 fn test_big_bit_vec_tests() {
2632 let v = BitVec::from_bytes(&[
2633 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2635 ]);
2636 assert!(!v.all());
2637 assert!(!v.any());
2638 assert!(v.none());
2639
2640 let v = BitVec::from_bytes(&[
2641 0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2643 ]);
2644 assert!(!v.all());
2645 assert!(v.any());
2646 assert!(!v.none());
2647
2648 let v = BitVec::from_bytes(&[
2649 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2651 ]);
2652 assert!(v.all());
2653 assert!(v.any());
2654 assert!(!v.none());
2655 }
2656
2657 #[test]
2658 fn test_bit_vec_push_pop() {
2659 let mut s = BitVec::from_elem(5 * U32_BITS - 2, false);
2660 assert_eq!(s.len(), 5 * U32_BITS - 2);
2661 assert!(!s[5 * U32_BITS - 3]);
2662 s.push(true);
2663 s.push(true);
2664 assert!(s[5 * U32_BITS - 2]);
2665 assert!(s[5 * U32_BITS - 1]);
2666 s.push(false);
2668 assert!(!s[5 * U32_BITS]);
2669 s.push(false);
2670 assert!(!s[5 * U32_BITS + 1]);
2671 assert_eq!(s.len(), 5 * U32_BITS + 2);
2672 assert_eq!(s.pop(), Some(false));
2674 assert_eq!(s.pop(), Some(false));
2675 assert_eq!(s.pop(), Some(true));
2676 assert_eq!(s.pop(), Some(true));
2677 assert_eq!(s.len(), 5 * U32_BITS - 2);
2678 }
2679
2680 #[test]
2681 fn test_bit_vec_truncate() {
2682 let mut s = BitVec::from_elem(5 * U32_BITS, true);
2683
2684 assert_eq!(s, BitVec::from_elem(5 * U32_BITS, true));
2685 assert_eq!(s.len(), 5 * U32_BITS);
2686 s.truncate(4 * U32_BITS);
2687 assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2688 assert_eq!(s.len(), 4 * U32_BITS);
2689 s.truncate(5 * U32_BITS);
2691 assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2692 assert_eq!(s.len(), 4 * U32_BITS);
2693 s.truncate(3 * U32_BITS - 10);
2694 assert_eq!(s, BitVec::from_elem(3 * U32_BITS - 10, true));
2695 assert_eq!(s.len(), 3 * U32_BITS - 10);
2696 s.truncate(0);
2697 assert_eq!(s, BitVec::from_elem(0, true));
2698 assert_eq!(s.len(), 0);
2699 }
2700
2701 #[test]
2702 fn test_bit_vec_reserve() {
2703 let mut s = BitVec::from_elem(5 * U32_BITS, true);
2704 assert!(s.capacity() >= 5 * U32_BITS);
2706 s.reserve(2 * U32_BITS);
2707 assert!(s.capacity() >= 7 * U32_BITS);
2708 s.reserve(7 * U32_BITS);
2709 assert!(s.capacity() >= 12 * U32_BITS);
2710 s.reserve_exact(7 * U32_BITS);
2711 assert!(s.capacity() >= 12 * U32_BITS);
2712 s.reserve(7 * U32_BITS + 1);
2713 assert!(s.capacity() > 12 * U32_BITS);
2714 assert_eq!(s.len(), 5 * U32_BITS);
2716 s.push(true);
2717 s.push(false);
2718 s.push(true);
2719 assert!(s[5 * U32_BITS - 1]);
2720 assert!(s[5 * U32_BITS]);
2721 assert!(!s[5 * U32_BITS + 1]);
2722 assert!(s[5 * U32_BITS + 2]);
2723 }
2724
2725 #[test]
2726 fn test_bit_vec_grow() {
2727 let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
2728 bit_vec.grow(32, true);
2729 assert_eq!(
2730 bit_vec,
2731 BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF])
2732 );
2733 bit_vec.grow(64, false);
2734 assert_eq!(
2735 bit_vec,
2736 BitVec::from_bytes(&[
2737 0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0
2738 ])
2739 );
2740 bit_vec.grow(16, true);
2741 assert_eq!(
2742 bit_vec,
2743 BitVec::from_bytes(&[
2744 0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0,
2745 0xFF, 0xFF
2746 ])
2747 );
2748 }
2749
2750 #[test]
2751 fn test_bit_vec_extend() {
2752 let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
2753 let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
2754 bit_vec.extend(ext.iter());
2755 assert_eq!(
2756 bit_vec,
2757 BitVec::from_bytes(&[
2758 0b10110110, 0b00000000, 0b11111111, 0b01001001, 0b10010010, 0b10111101
2759 ])
2760 );
2761 }
2762
2763 #[test]
2764 fn test_bit_vec_append() {
2765 let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011]);
2767 let mut b = BitVec::new();
2768 b.push(false);
2769 b.push(true);
2770 b.push(true);
2771
2772 a.append(&mut b);
2773
2774 assert_eq!(a.len(), 35);
2775 assert_eq!(b.len(), 0);
2776 assert!(b.capacity() >= 3);
2777
2778 assert!(a.eq_vec(&[
2779 true, false, true, false, false, false, false, false, false, false, false, true, false,
2780 false, true, false, true, false, false, true, false, false, true, false, false, false,
2781 true, true, false, false, true, true, false, true, true
2782 ]));
2783
2784 let mut a = BitVec::new();
2786 a.push(true);
2787 a.push(false);
2788
2789 let mut b =
2790 BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2791
2792 a.append(&mut b);
2793
2794 assert_eq!(a.len(), 42);
2795 assert_eq!(b.len(), 0);
2796 assert!(b.capacity() >= 40);
2797
2798 assert!(a.eq_vec(&[
2799 true, false, true, false, true, false, false, false, false, false, false, false, false,
2800 true, false, false, true, false, true, false, false, true, false, false, true, false,
2801 false, false, true, true, false, false, true, true, true, false, false, true, false,
2802 true, false, true
2803 ]));
2804
2805 let mut a = BitVec::new();
2807 let mut b =
2808 BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2809
2810 a.append(&mut b);
2811
2812 assert_eq!(a.len(), 40);
2813 assert_eq!(b.len(), 0);
2814 assert!(b.capacity() >= 40);
2815
2816 assert!(a.eq_vec(&[
2817 true, false, true, false, false, false, false, false, false, false, false, true, false,
2818 false, true, false, true, false, false, true, false, false, true, false, false, false,
2819 true, true, false, false, true, true, true, false, false, true, false, true, false,
2820 true
2821 ]));
2822
2823 let mut a =
2825 BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
2826 let mut b = BitVec::new();
2827
2828 a.append(&mut b);
2829
2830 assert_eq!(a.len(), 40);
2831 assert_eq!(b.len(), 0);
2832
2833 assert!(a.eq_vec(&[
2834 true, false, true, false, false, false, false, false, false, false, false, true, false,
2835 false, true, false, true, false, false, true, false, false, true, false, false, false,
2836 true, true, false, false, true, true, true, false, false, true, false, true, false,
2837 true
2838 ]));
2839 }
2840
2841 #[test]
2842 fn test_bit_vec_split_off() {
2843 let mut a = BitVec::new();
2845 a.push(true);
2846 a.push(false);
2847 a.push(false);
2848 a.push(true);
2849
2850 let b = a.split_off(0);
2851
2852 assert_eq!(a.len(), 0);
2853 assert_eq!(b.len(), 4);
2854
2855 assert!(b.eq_vec(&[true, false, false, true]));
2856
2857 a.truncate(0);
2859 a.push(true);
2860 a.push(false);
2861 a.push(false);
2862 a.push(true);
2863
2864 let b = a.split_off(4);
2865
2866 assert_eq!(a.len(), 4);
2867 assert_eq!(b.len(), 0);
2868
2869 assert!(a.eq_vec(&[true, false, false, true]));
2870
2871 let mut a =
2873 BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b11110011]);
2874
2875 let b = a.split_off(32);
2876
2877 assert_eq!(a.len(), 32);
2878 assert_eq!(b.len(), 8);
2879
2880 assert!(a.eq_vec(&[
2881 true, false, true, false, false, false, false, false, false, false, false, true, false,
2882 false, true, false, true, false, false, true, false, false, true, false, false, false,
2883 true, true, false, false, true, true
2884 ]));
2885 assert!(b.eq_vec(&[true, true, true, true, false, false, true, true]));
2886
2887 let mut a = BitVec::from_bytes(&[
2889 0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b01101011, 0b10101101,
2890 ]);
2891
2892 let b = a.split_off(13);
2893
2894 assert_eq!(a.len(), 13);
2895 assert_eq!(b.len(), 35);
2896
2897 assert!(a.eq_vec(&[
2898 true, false, true, false, false, false, false, false, false, false, false, true, false
2899 ]));
2900 assert!(b.eq_vec(&[
2901 false, true, false, true, false, false, true, false, false, true, false, false, false,
2902 true, true, false, false, true, true, false, true, true, false, true, false, true,
2903 true, true, false, true, false, true, true, false, true
2904 ]));
2905 }
2906
2907 #[test]
2908 fn test_into_iter() {
2909 let bools = [true, false, true, true];
2910 let bit_vec: BitVec = bools.iter().copied().collect();
2911 let mut iter = bit_vec.into_iter();
2912 assert_eq!(Some(true), iter.next());
2913 assert_eq!(Some(false), iter.next());
2914 assert_eq!(Some(true), iter.next());
2915 assert_eq!(Some(true), iter.next());
2916 assert_eq!(None, iter.next());
2917 assert_eq!(None, iter.next());
2918
2919 let bit_vec: BitVec = bools.iter().copied().collect();
2920 let mut iter = bit_vec.into_iter();
2921 assert_eq!(Some(true), iter.next_back());
2922 assert_eq!(Some(true), iter.next_back());
2923 assert_eq!(Some(false), iter.next_back());
2924 assert_eq!(Some(true), iter.next_back());
2925 assert_eq!(None, iter.next_back());
2926 assert_eq!(None, iter.next_back());
2927
2928 let bit_vec: BitVec = bools.iter().copied().collect();
2929 let mut iter = bit_vec.into_iter();
2930 assert_eq!(Some(true), iter.next_back());
2931 assert_eq!(Some(true), iter.next());
2932 assert_eq!(Some(false), iter.next());
2933 assert_eq!(Some(true), iter.next_back());
2934 assert_eq!(None, iter.next());
2935 assert_eq!(None, iter.next_back());
2936 }
2937
2938 #[test]
2939 fn iter() {
2940 let b = BitVec::with_capacity(10);
2941 let _a: Iter = b.iter();
2942 }
2943
2944 #[cfg(feature = "serde")]
2945 #[test]
2946 fn test_serialization() {
2947 let bit_vec: BitVec = BitVec::new();
2948 let serialized = serde_json::to_string(&bit_vec).unwrap();
2949 let unserialized: BitVec = serde_json::from_str(&serialized).unwrap();
2950 assert_eq!(bit_vec, unserialized);
2951
2952 let bools = vec![true, false, true, true];
2953 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2954 let serialized = serde_json::to_string(&bit_vec).unwrap();
2955 let unserialized = serde_json::from_str(&serialized).unwrap();
2956 assert_eq!(bit_vec, unserialized);
2957 }
2958
2959 #[cfg(feature = "miniserde")]
2960 #[test]
2961 fn test_miniserde_serialization() {
2962 let bit_vec: BitVec = BitVec::new();
2963 let serialized = miniserde::json::to_string(&bit_vec);
2964 let unserialized: BitVec = miniserde::json::from_str(&serialized[..]).unwrap();
2965 assert_eq!(bit_vec, unserialized);
2966
2967 let bools = vec![true, false, true, true];
2968 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2969 let serialized = miniserde::json::to_string(&bit_vec);
2970 let unserialized = miniserde::json::from_str(&serialized[..]).unwrap();
2971 assert_eq!(bit_vec, unserialized);
2972 }
2973
2974 #[cfg(feature = "nanoserde")]
2975 #[test]
2976 fn test_nanoserde_json_serialization() {
2977 use nanoserde::{DeJson, SerJson};
2978
2979 let bit_vec: BitVec = BitVec::new();
2980 let serialized = bit_vec.serialize_json();
2981 let unserialized: BitVec = BitVec::deserialize_json(&serialized[..]).unwrap();
2982 assert_eq!(bit_vec, unserialized);
2983
2984 let bools = vec![true, false, true, true];
2985 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
2986 let serialized = bit_vec.serialize_json();
2987 let unserialized = BitVec::deserialize_json(&serialized[..]).unwrap();
2988 assert_eq!(bit_vec, unserialized);
2989 }
2990
2991 #[cfg(feature = "borsh")]
2992 #[test]
2993 fn test_borsh_serialization() {
2994 let bit_vec: BitVec = BitVec::new();
2995 let serialized = borsh::to_vec(&bit_vec).unwrap();
2996 let unserialized: BitVec = borsh::from_slice(&serialized[..]).unwrap();
2997 assert_eq!(bit_vec, unserialized);
2998
2999 let bools = vec![true, false, true, true];
3000 let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
3001 let serialized = borsh::to_vec(&bit_vec).unwrap();
3002 let unserialized = borsh::from_slice(&serialized[..]).unwrap();
3003 assert_eq!(bit_vec, unserialized);
3004 }
3005
3006 #[test]
3007 fn test_bit_vec_unaligned_small_append() {
3008 let mut a = BitVec::from_elem(8, false);
3009 a.set(7, true);
3010
3011 let mut b = BitVec::from_elem(16, false);
3012 b.set(14, true);
3013
3014 let mut c = BitVec::from_elem(8, false);
3015 c.set(6, true);
3016 c.set(7, true);
3017
3018 a.append(&mut b);
3019 a.append(&mut c);
3020
3021 assert_eq!(&[1, 0, 2, 3][..], &*a.to_bytes());
3022 }
3023
3024 #[test]
3025 fn test_bit_vec_unaligned_large_append() {
3026 let mut a = BitVec::from_elem(48, false);
3027 a.set(47, true);
3028
3029 let mut b = BitVec::from_elem(48, false);
3030 b.set(46, true);
3031
3032 let mut c = BitVec::from_elem(48, false);
3033 c.set(46, true);
3034 c.set(47, true);
3035
3036 a.append(&mut b);
3037 a.append(&mut c);
3038
3039 assert_eq!(
3040 &[
3041 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
3042 0x00, 0x00, 0x00, 0x03
3043 ][..],
3044 &*a.to_bytes()
3045 );
3046 }
3047
3048 #[test]
3049 fn test_bit_vec_append_aligned_to_unaligned() {
3050 let mut a = BitVec::from_elem(2, true);
3051 let mut b = BitVec::from_elem(32, false);
3052 let mut c = BitVec::from_elem(8, true);
3053 a.append(&mut b);
3054 a.append(&mut c);
3055 assert_eq!(&[0xc0, 0x00, 0x00, 0x00, 0x3f, 0xc0][..], &*a.to_bytes());
3056 }
3057
3058 #[test]
3059 fn test_count_ones() {
3060 for i in 0..1000 {
3061 let mut t = BitVec::from_elem(i, true);
3062 let mut f = BitVec::from_elem(i, false);
3063 assert_eq!(i as u64, t.count_ones());
3064 assert_eq!(0_u64, f.count_ones());
3065 if i > 20 {
3066 t.set(10, false);
3067 t.set(i - 10, false);
3068 assert_eq!(i - 2, t.count_ones() as usize);
3069 f.set(10, true);
3070 f.set(i - 10, true);
3071 assert_eq!(2, f.count_ones());
3072 }
3073 }
3074 }
3075
3076 #[test]
3077 fn test_count_zeros() {
3078 for i in 0..1000 {
3079 let mut tbits = BitVec::from_elem(i, true);
3080 let mut fbits = BitVec::from_elem(i, false);
3081 assert_eq!(i as u64, fbits.count_zeros());
3082 assert_eq!(0_u64, tbits.count_zeros());
3083 if i > 20 {
3084 fbits.set(10, true);
3085 fbits.set(i - 10, true);
3086 assert_eq!(i - 2, fbits.count_zeros() as usize);
3087 tbits.set(10, false);
3088 tbits.set(i - 10, false);
3089 assert_eq!(2, tbits.count_zeros());
3090 }
3091 }
3092 }
3093
3094 #[test]
3095 fn test_get_mut() {
3096 let mut a = BitVec::from_elem(3, false);
3097 let mut a_bit_1 = a.get_mut(1).unwrap();
3098 assert!(!*a_bit_1);
3099 *a_bit_1 = true;
3100 drop(a_bit_1);
3101 assert!(a.eq_vec(&[false, true, false]));
3102 }
3103 #[test]
3104 fn test_iter_mut() {
3105 let mut a = BitVec::from_elem(8, false);
3106 a.iter_mut().enumerate().for_each(|(index, mut bit)| {
3107 *bit = index % 2 == 1;
3108 });
3109 assert!(a.eq_vec(&[false, true, false, true, false, true, false, true]));
3110 }
3111
3112 #[test]
3113 fn test_insert_at_zero() {
3114 let mut v = BitVec::new();
3115
3116 v.insert(0, false);
3117 v.insert(0, true);
3118 v.insert(0, false);
3119 v.insert(0, true);
3120 v.insert(0, false);
3121 v.insert(0, true);
3122
3123 assert_eq!(v.len(), 6);
3124 assert_eq!(v.storage().len(), 1);
3125 assert!(v.eq_vec(&[true, false, true, false, true, false]));
3126 }
3127
3128 #[test]
3129 fn test_insert_at_end() {
3130 let mut v = BitVec::new();
3131
3132 v.insert(v.len(), true);
3133 v.insert(v.len(), false);
3134 v.insert(v.len(), true);
3135 v.insert(v.len(), false);
3136 v.insert(v.len(), true);
3137 v.insert(v.len(), false);
3138
3139 assert_eq!(v.storage().len(), 1);
3140 assert_eq!(v.len(), 6);
3141 assert!(v.eq_vec(&[true, false, true, false, true, false]));
3142 }
3143
3144 #[test]
3145 fn test_insert_at_block_boundaries() {
3146 let mut v = BitVec::from_elem(32, false);
3147
3148 assert_eq!(v.storage().len(), 1);
3149
3150 v.insert(31, true);
3151
3152 assert_eq!(v.len(), 33);
3153
3154 assert!(matches!(v.get(31), Some(true)));
3155 assert!(v.eq_vec(&[
3156 false, false, false, false, false, false, false, false, false, false, false, false,
3157 false, false, false, false, false, false, false, false, false, false, false, false,
3158 false, false, false, false, false, false, false, true, false
3159 ]));
3160
3161 assert_eq!(v.storage().len(), 2);
3162 }
3163
3164 #[test]
3165 fn test_insert_at_block_boundaries_1() {
3166 let mut v = BitVec::from_elem(64, false);
3167
3168 assert_eq!(v.storage().len(), 2);
3169
3170 v.insert(63, true);
3171
3172 assert_eq!(v.len(), 65);
3173
3174 assert!(matches!(v.get(63), Some(true)));
3175 assert!(v.eq_vec(&[
3176 false, false, false, false, false, false, false, false, false, false, false, false,
3177 false, false, false, false, false, false, false, false, false, false, false, false,
3178 false, false, false, false, false, false, false, false, false, false, false, false,
3179 false, false, false, false, false, false, false, false, false, false, false, false,
3180 false, false, false, false, false, false, false, false, false, false, false, false,
3181 false, false, false, true, false
3182 ]));
3183
3184 assert_eq!(v.storage().len(), 3);
3185 }
3186}