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}