Skip to main content

bit_vec/
lib.rs

1// Copyright 2012-2023 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11// FIXME(Gankro): BitVec and BitSet are very tightly coupled. Ideally (for
12// maintenance), they should be in separate files/modules, with BitSet only
13// using BitVec's public API. This will be hard for performance though, because
14// `BitVec` will not want to leak its internal representation while its internal
15// representation as `u32`s must be assumed for best performance.
16
17// (1) Be careful, most things can overflow here because the amount of bits in
18//     memory can overflow `usize`.
19// (2) Make sure that the underlying vector has no excess length:
20//     E. g. `nbits == 16`, `storage.len() == 2` would be excess length,
21//     because the last word isn't used at all. This is important because some
22//     methods rely on it (for *CORRECTNESS*).
23// (3) Make sure that the unused bits in the last word are zeroed out, again
24//     other methods rely on it for *CORRECTNESS*.
25// (4) `BitSet` is tightly coupled with `BitVec`, so any changes you make in
26// `BitVec` will need to be reflected in `BitSet`.
27
28//! # Description
29//!
30//! Dynamic collections implemented with compact bit vectors.
31//!
32//! # Examples
33//!
34//! This is a simple example of the [Sieve of Eratosthenes][sieve]
35//! which calculates prime numbers up to a given limit.
36//!
37//! [sieve]: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
38//!
39//! ```
40//! use bit_vec::BitVec;
41//!
42//! let max_prime = 10000;
43//!
44//! // Store the primes as a BitVec
45//! let primes = {
46//!     // Assume all numbers are prime to begin, and then we
47//!     // cross off non-primes progressively
48//!     let mut bv = BitVec::from_elem(max_prime, true);
49//!
50//!     // Neither 0 nor 1 are prime
51//!     bv.set(0, false);
52//!     bv.set(1, false);
53//!
54//!     for i in 2.. 1 + (max_prime as f64).sqrt() as usize {
55//!         // if i is a prime
56//!         if bv[i] {
57//!             // Mark all multiples of i as non-prime (any multiples below i * i
58//!             // will have been marked as non-prime previously)
59//!             for j in i.. {
60//!                 if i * j >= max_prime {
61//!                     break;
62//!                 }
63//!                 bv.set(i * j, false)
64//!             }
65//!         }
66//!     }
67//!     bv
68//! };
69//!
70//! // Simple primality tests below our max bound
71//! let print_primes = 20;
72//! print!("The primes below {} are: ", print_primes);
73//! for x in 0..print_primes {
74//!     if primes.get(x).unwrap_or(false) {
75//!         print!("{} ", x);
76//!     }
77//! }
78//! println!();
79//!
80//! let num_primes = primes.iter().filter(|x| *x).count();
81//! println!("There are {} primes below {}", num_primes, max_prime);
82//! assert_eq!(num_primes, 1_229);
83//! ```
84
85#![doc(html_root_url = "https://docs.rs/bit-vec/0.9.0/bit_vec/")]
86#![no_std]
87#![deny(clippy::shadow_reuse)]
88#![deny(clippy::shadow_same)]
89#![deny(clippy::shadow_unrelated)]
90#![warn(clippy::multiple_inherent_impl)]
91#![warn(clippy::multiple_crate_versions)]
92#![warn(clippy::single_match)]
93#![warn(clippy::missing_safety_doc)]
94
95#[cfg(any(test, feature = "std"))]
96#[macro_use]
97extern crate std;
98#[cfg(feature = "std")]
99use std::rc::Rc;
100#[cfg(feature = "std")]
101use std::string::String;
102#[cfg(feature = "std")]
103use std::vec::Vec;
104
105#[cfg(feature = "serde")]
106extern crate serde;
107#[cfg(feature = "serde")]
108use serde::{Deserialize, Serialize};
109#[cfg(feature = "borsh")]
110extern crate borsh;
111#[cfg(feature = "miniserde")]
112extern crate miniserde;
113#[cfg(feature = "nanoserde")]
114extern crate nanoserde;
115#[cfg(feature = "nanoserde")]
116use nanoserde::{DeBin, DeJson, DeRon, SerBin, SerJson, SerRon};
117
118#[cfg(not(feature = "std"))]
119#[macro_use]
120extern crate alloc;
121#[cfg(not(feature = "std"))]
122use alloc::rc::Rc;
123#[cfg(not(feature = "std"))]
124use alloc::string::String;
125#[cfg(not(feature = "std"))]
126use alloc::vec::Vec;
127
128use core::cell::RefCell;
129use core::cmp;
130use core::cmp::Ordering;
131use core::fmt::{self, Write};
132use core::hash;
133use core::iter::repeat;
134use core::iter::FromIterator;
135use core::mem;
136use core::ops::*;
137use core::slice;
138
139type MutBlocks<'a, B> = slice::IterMut<'a, B>;
140
141/// Abstracts over a pile of bits (basically unsigned primitives)
142pub trait BitBlock:
143    Copy
144    + Add<Self, Output = Self>
145    + Sub<Self, Output = Self>
146    + Shl<usize, Output = Self>
147    + Shr<usize, Output = Self>
148    + Not<Output = Self>
149    + BitAnd<Self, Output = Self>
150    + BitOr<Self, Output = Self>
151    + BitXor<Self, Output = Self>
152    + Rem<Self, Output = Self>
153    + BitOrAssign<Self>
154    + Eq
155    + Ord
156    + hash::Hash
157{
158    /// How many bits it has
159    fn bits() -> usize;
160    /// How many bytes it has
161    #[inline]
162    fn bytes() -> usize {
163        Self::bits() / 8
164    }
165    /// Convert a byte into this type (lowest-order bits set)
166    fn from_byte(byte: u8) -> Self;
167    /// Count the number of 1's in the bitwise repr
168    fn count_ones(self) -> usize;
169    /// Count the number of 0's in the bitwise repr
170    fn count_zeros(self) -> usize {
171        Self::bits() - self.count_ones()
172    }
173    /// Get `0`
174    fn zero() -> Self;
175    /// Get `1`
176    fn one() -> Self;
177}
178
179macro_rules! bit_block_impl {
180    ($(($t: ident, $size: expr)),*) => ($(
181        impl BitBlock for $t {
182            #[inline]
183            fn bits() -> usize { $size }
184            #[inline]
185            fn from_byte(byte: u8) -> Self { $t::from(byte) }
186            #[inline]
187            fn count_ones(self) -> usize { self.count_ones() as usize }
188            #[inline]
189            fn count_zeros(self) -> usize { self.count_zeros() as usize }
190            #[inline]
191            fn one() -> Self { 1 }
192            #[inline]
193            fn zero() -> Self { 0 }
194        }
195    )*)
196}
197
198bit_block_impl! {
199    (u8, 8),
200    (u16, 16),
201    (u32, 32),
202    (u64, 64),
203    (usize, core::mem::size_of::<usize>() * 8)
204}
205
206fn reverse_bits(byte: u8) -> u8 {
207    let mut result = 0;
208    for i in 0..u8::bits() {
209        result |= ((byte >> i) & 1) << (u8::bits() - 1 - i);
210    }
211    result
212}
213
214static TRUE: bool = true;
215static FALSE: bool = false;
216
217#[cfg(feature = "nanoserde")]
218type B = u32;
219
220/// The bitvector type.
221///
222/// # Examples
223///
224/// ```
225/// use bit_vec::BitVec;
226///
227/// let mut bv = BitVec::from_elem(10, false);
228///
229/// // insert all primes less than 10
230/// bv.set(2, true);
231/// bv.set(3, true);
232/// bv.set(5, true);
233/// bv.set(7, true);
234/// println!("{:?}", bv);
235/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
236///
237/// // flip all values in bitvector, producing non-primes less than 10
238/// bv.negate();
239/// println!("{:?}", bv);
240/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
241///
242/// // reset bitvector to empty
243/// bv.fill(false);
244/// println!("{:?}", bv);
245/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
246/// ```
247#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
248#[cfg_attr(
249    feature = "borsh",
250    derive(borsh::BorshDeserialize, borsh::BorshSerialize)
251)]
252#[cfg_attr(
253    feature = "miniserde",
254    derive(miniserde::Deserialize, miniserde::Serialize)
255)]
256#[cfg_attr(
257    feature = "nanoserde",
258    derive(DeBin, DeJson, DeRon, SerBin, SerJson, SerRon)
259)]
260pub struct BitVec<B = u32> {
261    /// Internal representation of the bit vector
262    storage: Vec<B>,
263    /// The number of valid bits in the internal representation
264    nbits: usize,
265}
266
267// FIXME(Gankro): NopeNopeNopeNopeNope (wait for IndexGet to be a thing)
268impl<B: BitBlock> Index<usize> for BitVec<B> {
269    type Output = bool;
270
271    #[inline]
272    fn index(&self, i: usize) -> &bool {
273        if self.get(i).expect("index out of bounds") {
274            &TRUE
275        } else {
276            &FALSE
277        }
278    }
279}
280
281/// Computes how many blocks are needed to store that many bits
282fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
283    // If we want 17 bits, dividing by 32 will produce 0. So we add 1 to make sure we
284    // reserve enough. But if we want exactly a multiple of 32, this will actually allocate
285    // one too many. So we need to check if that's the case. We can do that by computing if
286    // bitwise AND by `32 - 1` is 0. But LLVM should be able to optimize the semantically
287    // superior modulo operator on a power of two to this.
288    //
289    // Note that we can technically avoid this branch with the expression
290    // `(nbits + U32_BITS - 1) / 32::BITS`, but if nbits is almost usize::MAX this will overflow.
291    if bits % B::bits() == 0 {
292        bits / B::bits()
293    } else {
294        bits / B::bits() + 1
295    }
296}
297
298/// Computes the bitmask for the final word of the vector
299fn mask_for_bits<B: BitBlock>(bits: usize) -> B {
300    // Note especially that a perfect multiple of U32_BITS should mask all 1s.
301    (!B::zero()) >> ((B::bits() - bits % B::bits()) % B::bits())
302}
303
304impl BitVec<u32> {
305    /// Creates an empty `BitVec`.
306    ///
307    /// # Examples
308    ///
309    /// ```
310    /// use bit_vec::BitVec;
311    /// let mut bv = BitVec::new();
312    /// ```
313    #[inline]
314    pub fn new() -> Self {
315        Default::default()
316    }
317
318    /// Creates a `BitVec` that holds `nbits` elements, setting each element
319    /// to `bit`.
320    ///
321    /// # Examples
322    ///
323    /// ```
324    /// use bit_vec::BitVec;
325    ///
326    /// let mut bv = BitVec::from_elem(10, false);
327    /// assert_eq!(bv.len(), 10);
328    /// for x in bv.iter() {
329    ///     assert_eq!(x, false);
330    /// }
331    /// ```
332    #[inline]
333    pub fn from_elem(len: usize, bit: bool) -> Self {
334        BitVec::<u32>::from_elem_general(len, bit)
335    }
336
337    /// Constructs a new, empty `BitVec` with the specified capacity.
338    ///
339    /// The bitvector will be able to hold at least `capacity` bits without
340    /// reallocating. If `capacity` is 0, it will not allocate.
341    ///
342    /// It is important to note that this function does not specify the
343    /// *length* of the returned bitvector, but only the *capacity*.
344    #[inline]
345    pub fn with_capacity(capacity: usize) -> Self {
346        BitVec::<u32>::with_capacity_general(capacity)
347    }
348
349    /// Transforms a byte-vector into a `BitVec`. Each byte becomes eight bits,
350    /// with the most significant bits of each byte coming first. Each
351    /// bit becomes `true` if equal to 1 or `false` if equal to 0.
352    ///
353    /// # Examples
354    ///
355    /// ```
356    /// use bit_vec::BitVec;
357    ///
358    /// let bv = BitVec::from_bytes(&[0b10100000, 0b00010010]);
359    /// assert!(bv.eq_vec(&[true, false, true, false,
360    ///                     false, false, false, false,
361    ///                     false, false, false, true,
362    ///                     false, false, true, false]));
363    /// ```
364    pub fn from_bytes(bytes: &[u8]) -> Self {
365        BitVec::<u32>::from_bytes_general(bytes)
366    }
367
368    /// Creates a `BitVec` of the specified length where the value at each index
369    /// is `f(index)`.
370    ///
371    /// # Examples
372    ///
373    /// ```
374    /// use bit_vec::BitVec;
375    ///
376    /// let bv = BitVec::from_fn(5, |i| { i % 2 == 0 });
377    /// assert!(bv.eq_vec(&[true, false, true, false, true]));
378    /// ```
379    #[inline]
380    pub fn from_fn<F>(len: usize, f: F) -> Self
381    where
382        F: FnMut(usize) -> bool,
383    {
384        BitVec::<u32>::from_fn_general(len, f)
385    }
386}
387
388impl<B: BitBlock> BitVec<B> {
389    /// Creates an empty `BitVec`.
390    ///
391    /// # Examples
392    ///
393    /// ```
394    /// use bit_vec::BitVec;
395    /// let mut bv = BitVec::<usize>::new_general();
396    /// ```
397    #[inline]
398    pub fn new_general() -> Self {
399        Default::default()
400    }
401
402    /// Creates a `BitVec` that holds `nbits` elements, setting each element
403    /// to `bit`.
404    ///
405    /// # Examples
406    ///
407    /// ```
408    /// use bit_vec::BitVec;
409    ///
410    /// let mut bv = BitVec::<usize>::from_elem_general(10, false);
411    /// assert_eq!(bv.len(), 10);
412    /// for x in bv.iter() {
413    ///     assert_eq!(x, false);
414    /// }
415    /// ```
416    #[inline]
417    pub fn from_elem_general(len: usize, bit: bool) -> Self {
418        let nblocks = blocks_for_bits::<B>(len);
419        let mut bit_vec = BitVec {
420            storage: vec![if bit { !B::zero() } else { B::zero() }; nblocks],
421            nbits: len,
422        };
423        bit_vec.fix_last_block();
424        bit_vec
425    }
426
427    /// Constructs a new, empty `BitVec` with the specified capacity.
428    ///
429    /// The bitvector will be able to hold at least `capacity` bits without
430    /// reallocating. If `capacity` is 0, it will not allocate.
431    ///
432    /// It is important to note that this function does not specify the
433    /// *length* of the returned bitvector, but only the *capacity*.
434    #[inline]
435    pub fn with_capacity_general(capacity: usize) -> Self {
436        BitVec {
437            storage: Vec::with_capacity(blocks_for_bits::<B>(capacity)),
438            nbits: 0,
439        }
440    }
441
442    /// Transforms a byte-vector into a `BitVec`. Each byte becomes eight bits,
443    /// with the most significant bits of each byte coming first. Each
444    /// bit becomes `true` if equal to 1 or `false` if equal to 0.
445    ///
446    /// # Examples
447    ///
448    /// ```
449    /// use bit_vec::BitVec;
450    ///
451    /// let bv = BitVec::<usize>::from_bytes_general(&[0b10100000, 0b00010010]);
452    /// assert!(bv.eq_vec(&[true, false, true, false,
453    ///                     false, false, false, false,
454    ///                     false, false, false, true,
455    ///                     false, false, true, false]));
456    /// ```
457    pub fn from_bytes_general(bytes: &[u8]) -> Self {
458        let len = bytes
459            .len()
460            .checked_mul(u8::bits())
461            .expect("capacity overflow");
462        let mut bit_vec = BitVec::with_capacity_general(len);
463        let complete_words = bytes.len() / B::bytes();
464        let extra_bytes = bytes.len() % B::bytes();
465
466        bit_vec.nbits = len;
467
468        for i in 0..complete_words {
469            let mut accumulator = B::zero();
470            for idx in 0..B::bytes() {
471                accumulator |= B::from_byte(reverse_bits(bytes[i * B::bytes() + idx])) << (idx * 8)
472            }
473            bit_vec.storage.push(accumulator);
474        }
475
476        if extra_bytes > 0 {
477            let mut last_word = B::zero();
478            for (i, &byte) in bytes[complete_words * B::bytes()..].iter().enumerate() {
479                last_word |= B::from_byte(reverse_bits(byte)) << (i * 8);
480            }
481            bit_vec.storage.push(last_word);
482        }
483
484        bit_vec
485    }
486
487    /// Creates a `BitVec` of the specified length where the value at each index
488    /// is `f(index)`.
489    ///
490    /// # Examples
491    ///
492    /// ```
493    /// use bit_vec::BitVec;
494    ///
495    /// let bv = BitVec::<usize>::from_fn_general(5, |i| { i % 2 == 0 });
496    /// assert!(bv.eq_vec(&[true, false, true, false, true]));
497    /// ```
498    #[inline]
499    pub fn from_fn_general<F>(len: usize, mut f: F) -> Self
500    where
501        F: FnMut(usize) -> bool,
502    {
503        let mut bit_vec = BitVec::from_elem_general(len, false);
504        for i in 0..len {
505            bit_vec.set(i, f(i));
506        }
507        bit_vec
508    }
509
510    /// Applies the given operation to the blocks of self and other, and sets
511    /// self to be the result. This relies on the caller not to corrupt the
512    /// last word.
513    #[inline]
514    fn process<F>(&mut self, other: &BitVec<B>, mut op: F) -> bool
515    where
516        F: FnMut(B, B) -> B,
517    {
518        assert_eq!(self.len(), other.len());
519        debug_assert_eq!(self.storage.len(), other.storage.len());
520        let mut changed_bits = B::zero();
521        for (a, b) in self.blocks_mut().zip(other.blocks()) {
522            let w = op(*a, b);
523            changed_bits = changed_bits | (*a ^ w);
524            *a = w;
525        }
526        changed_bits != B::zero()
527    }
528
529    /// Iterator over mutable refs to the underlying blocks of data.
530    #[inline]
531    fn blocks_mut(&mut self) -> MutBlocks<'_, B> {
532        // (2)
533        self.storage.iter_mut()
534    }
535
536    /// Iterator over the underlying blocks of data
537    #[inline]
538    pub fn blocks(&self) -> Blocks<'_, B> {
539        // (2)
540        Blocks {
541            iter: self.storage.iter(),
542        }
543    }
544
545    /// Exposes the raw block storage of this `BitVec`.
546    ///
547    /// Only really intended for `BitSet`.
548    #[inline]
549    pub fn storage(&self) -> &[B] {
550        &self.storage
551    }
552
553    /// Exposes the raw block storage of this `BitVec`.
554    ///
555    /// # Safety
556    ///
557    /// Can probably cause unsafety. Only really intended for `BitSet`.
558    #[inline]
559    pub unsafe fn storage_mut(&mut self) -> &mut Vec<B> {
560        &mut self.storage
561    }
562
563    /// Helper for procedures involving spare space in the last block.
564    #[inline]
565    fn last_block_with_mask(&self) -> Option<(B, B)> {
566        let extra_bits = self.len() % B::bits();
567        if extra_bits > 0 {
568            let mask = (B::one() << extra_bits) - B::one();
569            let storage_len = self.storage.len();
570            Some((self.storage[storage_len - 1], mask))
571        } else {
572            None
573        }
574    }
575
576    /// Helper for procedures involving spare space in the last block.
577    #[inline]
578    fn last_block_mut_with_mask(&mut self) -> Option<(&mut B, B)> {
579        let extra_bits = self.len() % B::bits();
580        if extra_bits > 0 {
581            let mask = (B::one() << extra_bits) - B::one();
582            let storage_len = self.storage.len();
583            Some((&mut self.storage[storage_len - 1], mask))
584        } else {
585            None
586        }
587    }
588
589    /// An operation might screw up the unused bits in the last block of the
590    /// `BitVec`. As per (3), it's assumed to be all 0s. This method fixes it up.
591    fn fix_last_block(&mut self) {
592        if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
593            *last_block = *last_block & used_bits;
594        }
595    }
596
597    /// Operations such as change detection for xnor, nor and nand are easiest
598    /// to implement when unused bits are all set to 1s.
599    fn fix_last_block_with_ones(&mut self) {
600        if let Some((last_block, used_bits)) = self.last_block_mut_with_mask() {
601            *last_block = *last_block | !used_bits;
602        }
603    }
604
605    /// Check whether last block's invariant is fine.
606    fn is_last_block_fixed(&self) -> bool {
607        if let Some((last_block, used_bits)) = self.last_block_with_mask() {
608            last_block & !used_bits == B::zero()
609        } else {
610            true
611        }
612    }
613
614    /// Ensure the invariant for the last block.
615    ///
616    /// An operation might screw up the unused bits in the last block of the
617    /// `BitVec`.
618    ///
619    /// This method fails in case the last block is not fixed. The check
620    /// is skipped outside testing.
621    #[inline]
622    fn ensure_invariant(&self) {
623        if cfg!(test) {
624            debug_assert!(self.is_last_block_fixed());
625        }
626    }
627
628    /// Retrieves the value at index `i`, or `None` if the index is out of bounds.
629    ///
630    /// # Examples
631    ///
632    /// ```
633    /// use bit_vec::BitVec;
634    ///
635    /// let bv = BitVec::from_bytes(&[0b01100000]);
636    /// assert_eq!(bv.get(0), Some(false));
637    /// assert_eq!(bv.get(1), Some(true));
638    /// assert_eq!(bv.get(100), None);
639    ///
640    /// // Can also use array indexing
641    /// assert_eq!(bv[1], true);
642    /// ```
643    #[inline]
644    pub fn get(&self, i: usize) -> Option<bool> {
645        self.ensure_invariant();
646        if i >= self.nbits {
647            return None;
648        }
649        let w = i / B::bits();
650        let b = i % B::bits();
651        self.storage
652            .get(w)
653            .map(|&block| (block & (B::one() << b)) != B::zero())
654    }
655
656    /// Retrieves the value at index `i`, without doing bounds checking.
657    ///
658    /// For a safe alternative, see `get`.
659    ///
660    /// # Safety
661    ///
662    /// Calling this method with an out-of-bounds index is undefined behavior
663    /// even if the resulting reference is not used.
664    ///
665    /// # Examples
666    ///
667    /// ```
668    /// use bit_vec::BitVec;
669    ///
670    /// let bv = BitVec::from_bytes(&[0b01100000]);
671    /// unsafe {
672    ///     assert_eq!(bv.get_unchecked(0), false);
673    ///     assert_eq!(bv.get_unchecked(1), true);
674    /// }
675    /// ```
676    #[inline]
677    pub unsafe fn get_unchecked(&self, i: usize) -> bool {
678        self.ensure_invariant();
679        let w = i / B::bits();
680        let b = i % B::bits();
681        let block = *self.storage.get_unchecked(w);
682        block & (B::one() << b) != B::zero()
683    }
684
685    /// Retrieves a smart pointer to the value at index `i`, or `None` if the index is out of bounds.
686    ///
687    /// # Examples
688    ///
689    /// ```
690    /// use bit_vec::BitVec;
691    ///
692    /// let mut bv = BitVec::from_bytes(&[0b01100000]);
693    /// *bv.get_mut(0).unwrap() = true;
694    /// *bv.get_mut(1).unwrap() = false;
695    /// assert!(bv.get_mut(100).is_none());
696    /// assert_eq!(bv, BitVec::from_bytes(&[0b10100000]));
697    /// ```
698    #[inline]
699    pub fn get_mut(&mut self, index: usize) -> Option<MutBorrowedBit<'_, B>> {
700        self.get(index).map(move |value| MutBorrowedBit {
701            vec: Rc::new(RefCell::new(self)),
702            index,
703            #[cfg(debug_assertions)]
704            old_value: value,
705            new_value: value,
706        })
707    }
708
709    /// Retrieves a smart pointer to the value at index `i`, without doing bounds checking.
710    ///
711    /// # Safety
712    ///
713    /// Calling this method with out-of-bounds `index` may cause undefined behavior even when
714    /// the result is not used.
715    ///
716    /// # Examples
717    ///
718    /// ```
719    /// use bit_vec::BitVec;
720    ///
721    /// let mut bv = BitVec::from_bytes(&[0b01100000]);
722    /// unsafe {
723    ///     *bv.get_unchecked_mut(0) = true;
724    ///     *bv.get_unchecked_mut(1) = false;
725    /// }
726    /// assert_eq!(bv, BitVec::from_bytes(&[0b10100000]));
727    /// ```
728    #[inline]
729    pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> MutBorrowedBit<'_, B> {
730        let value = self.get_unchecked(index);
731        MutBorrowedBit {
732            #[cfg(debug_assertions)]
733            old_value: value,
734            new_value: value,
735            vec: Rc::new(RefCell::new(self)),
736            index,
737        }
738    }
739
740    /// Sets the value of a bit at an index `i`.
741    ///
742    /// # Panics
743    ///
744    /// Panics if `i` is out of bounds.
745    ///
746    /// # Examples
747    ///
748    /// ```
749    /// use bit_vec::BitVec;
750    ///
751    /// let mut bv = BitVec::from_elem(5, false);
752    /// bv.set(3, true);
753    /// assert_eq!(bv[3], true);
754    /// ```
755    #[inline]
756    pub fn set(&mut self, i: usize, x: bool) {
757        self.ensure_invariant();
758        assert!(
759            i < self.nbits,
760            "index out of bounds: {:?} >= {:?}",
761            i,
762            self.nbits
763        );
764        let w = i / B::bits();
765        let b = i % B::bits();
766        let flag = B::one() << b;
767        let val = if x {
768            self.storage[w] | flag
769        } else {
770            self.storage[w] & !flag
771        };
772        self.storage[w] = val;
773    }
774
775    /// Sets all bits to 1.
776    ///
777    /// # Examples
778    ///
779    /// ```
780    /// use bit_vec::BitVec;
781    ///
782    /// let before = 0b01100000;
783    /// let after  = 0b11111111;
784    ///
785    /// let mut bv = BitVec::from_bytes(&[before]);
786    /// bv.set_all();
787    /// assert_eq!(bv, BitVec::from_bytes(&[after]));
788    /// ```
789    #[inline]
790    #[deprecated(since = "0.9.0", note = "please use `.fill(true)` instead")]
791    pub fn set_all(&mut self) {
792        self.ensure_invariant();
793        for w in &mut self.storage {
794            *w = !B::zero();
795        }
796        self.fix_last_block();
797    }
798
799    /// Flips all bits.
800    ///
801    /// # Examples
802    ///
803    /// ```
804    /// use bit_vec::BitVec;
805    ///
806    /// let before = 0b01100000;
807    /// let after  = 0b10011111;
808    ///
809    /// let mut bv = BitVec::from_bytes(&[before]);
810    /// bv.negate();
811    /// assert_eq!(bv, BitVec::from_bytes(&[after]));
812    /// ```
813    #[inline]
814    pub fn negate(&mut self) {
815        self.ensure_invariant();
816        for w in &mut self.storage {
817            *w = !*w;
818        }
819        self.fix_last_block();
820    }
821
822    /// Calculates the union of two bitvectors. This acts like the bitwise `or`
823    /// function.
824    ///
825    /// Sets `self` to the union of `self` and `other`. Both bitvectors must be
826    /// the same length. Returns `true` if `self` changed.
827    ///
828    /// # Panics
829    ///
830    /// Panics if the bitvectors are of different lengths.
831    ///
832    /// # Examples
833    ///
834    /// ```
835    /// use bit_vec::BitVec;
836    ///
837    /// let a   = 0b01100100;
838    /// let b   = 0b01011010;
839    /// let res = 0b01111110;
840    ///
841    /// let mut a = BitVec::from_bytes(&[a]);
842    /// let b = BitVec::from_bytes(&[b]);
843    ///
844    /// assert!(a.union(&b));
845    /// assert_eq!(a, BitVec::from_bytes(&[res]));
846    /// ```
847    #[deprecated(since = "0.7.0", note = "Please use the 'or' function instead")]
848    #[inline]
849    pub fn union(&mut self, other: &Self) -> bool {
850        self.or(other)
851    }
852
853    /// Calculates the intersection of two bitvectors. This acts like the
854    /// bitwise `and` function.
855    ///
856    /// Sets `self` to the intersection of `self` and `other`. Both bitvectors
857    /// must be the same length. Returns `true` if `self` changed.
858    ///
859    /// # Panics
860    ///
861    /// Panics if the bitvectors are of different lengths.
862    ///
863    /// # Examples
864    ///
865    /// ```
866    /// use bit_vec::BitVec;
867    ///
868    /// let a   = 0b01100100;
869    /// let b   = 0b01011010;
870    /// let res = 0b01000000;
871    ///
872    /// let mut a = BitVec::from_bytes(&[a]);
873    /// let b = BitVec::from_bytes(&[b]);
874    ///
875    /// assert!(a.intersect(&b));
876    /// assert_eq!(a, BitVec::from_bytes(&[res]));
877    /// ```
878    #[deprecated(since = "0.7.0", note = "Please use the 'and' function instead")]
879    #[inline]
880    pub fn intersect(&mut self, other: &Self) -> bool {
881        self.and(other)
882    }
883
884    /// Calculates the bitwise `or` of two bitvectors.
885    ///
886    /// Sets `self` to the union of `self` and `other`. Both bitvectors must be
887    /// the same length. Returns `true` if `self` changed.
888    ///
889    /// # Panics
890    ///
891    /// Panics if the bitvectors are of different lengths.
892    ///
893    /// # Examples
894    ///
895    /// ```
896    /// use bit_vec::BitVec;
897    ///
898    /// let a   = 0b01100100;
899    /// let b   = 0b01011010;
900    /// let res = 0b01111110;
901    ///
902    /// let mut a = BitVec::from_bytes(&[a]);
903    /// let b = BitVec::from_bytes(&[b]);
904    ///
905    /// assert!(a.or(&b));
906    /// assert_eq!(a, BitVec::from_bytes(&[res]));
907    /// ```
908    #[inline]
909    pub fn or(&mut self, other: &Self) -> bool {
910        self.ensure_invariant();
911        debug_assert!(other.is_last_block_fixed());
912        self.process(other, |w1, w2| w1 | w2)
913    }
914
915    /// Calculates the bitwise `and` of two bitvectors.
916    ///
917    /// Sets `self` to the intersection of `self` and `other`. Both bitvectors
918    /// must be the same length. Returns `true` if `self` changed.
919    ///
920    /// # Panics
921    ///
922    /// Panics if the bitvectors are of different lengths.
923    ///
924    /// # Examples
925    ///
926    /// ```
927    /// use bit_vec::BitVec;
928    ///
929    /// let a   = 0b01100100;
930    /// let b   = 0b01011010;
931    /// let res = 0b01000000;
932    ///
933    /// let mut a = BitVec::from_bytes(&[a]);
934    /// let b = BitVec::from_bytes(&[b]);
935    ///
936    /// assert!(a.and(&b));
937    /// assert_eq!(a, BitVec::from_bytes(&[res]));
938    /// ```
939    #[inline]
940    pub fn and(&mut self, other: &Self) -> bool {
941        self.ensure_invariant();
942        debug_assert!(other.is_last_block_fixed());
943        self.process(other, |w1, w2| w1 & w2)
944    }
945
946    /// Calculates the difference between two bitvectors.
947    ///
948    /// Sets each element of `self` to the value of that element minus the
949    /// element of `other` at the same index. Both bitvectors must be the same
950    /// length. Returns `true` if `self` changed.
951    ///
952    /// # Panics
953    ///
954    /// Panics if the bitvectors are of different length.
955    ///
956    /// # Examples
957    ///
958    /// ```
959    /// use bit_vec::BitVec;
960    ///
961    /// let a   = 0b01100100;
962    /// let b   = 0b01011010;
963    /// let a_b = 0b00100100; // a - b
964    /// let b_a = 0b00011010; // b - a
965    ///
966    /// let mut bva = BitVec::from_bytes(&[a]);
967    /// let bvb = BitVec::from_bytes(&[b]);
968    ///
969    /// assert!(bva.difference(&bvb));
970    /// assert_eq!(bva, BitVec::from_bytes(&[a_b]));
971    ///
972    /// let bva = BitVec::from_bytes(&[a]);
973    /// let mut bvb = BitVec::from_bytes(&[b]);
974    ///
975    /// assert!(bvb.difference(&bva));
976    /// assert_eq!(bvb, BitVec::from_bytes(&[b_a]));
977    /// ```
978    #[inline]
979    pub fn difference(&mut self, other: &Self) -> bool {
980        self.ensure_invariant();
981        debug_assert!(other.is_last_block_fixed());
982        self.process(other, |w1, w2| w1 & !w2)
983    }
984
985    /// Calculates the xor of two bitvectors.
986    ///
987    /// Sets `self` to the xor of `self` and `other`. Both bitvectors must be
988    /// the same length. Returns `true` if `self` changed.
989    ///
990    /// # Panics
991    ///
992    /// Panics if the bitvectors are of different length.
993    ///
994    /// # Examples
995    ///
996    /// ```
997    /// use bit_vec::BitVec;
998    ///
999    /// let a   = 0b01100110;
1000    /// let b   = 0b01010100;
1001    /// let res = 0b00110010;
1002    ///
1003    /// let mut a = BitVec::from_bytes(&[a]);
1004    /// let b = BitVec::from_bytes(&[b]);
1005    ///
1006    /// assert!(a.xor(&b));
1007    /// assert_eq!(a, BitVec::from_bytes(&[res]));
1008    /// ```
1009    #[inline]
1010    pub fn xor(&mut self, other: &Self) -> bool {
1011        self.ensure_invariant();
1012        debug_assert!(other.is_last_block_fixed());
1013        self.process(other, |w1, w2| w1 ^ w2)
1014    }
1015
1016    /// Calculates the nand of two bitvectors.
1017    ///
1018    /// Sets `self` to the nand of `self` and `other`. Both bitvectors must be
1019    /// the same length. Returns `true` if `self` changed.
1020    ///
1021    /// # Panics
1022    ///
1023    /// Panics if the bitvectors are of different length.
1024    ///
1025    /// # Examples
1026    ///
1027    /// ```
1028    /// use bit_vec::BitVec;
1029    ///
1030    /// let a   = 0b01100110;
1031    /// let b   = 0b01010100;
1032    /// let res = 0b10111011;
1033    ///
1034    /// let mut a = BitVec::from_bytes(&[a]);
1035    /// let b = BitVec::from_bytes(&[b]);
1036    ///
1037    /// assert!(a.nand(&b));
1038    /// assert_eq!(a, BitVec::from_bytes(&[res]));
1039    /// ```
1040    #[inline]
1041    pub fn nand(&mut self, other: &Self) -> bool {
1042        self.ensure_invariant();
1043        debug_assert!(other.is_last_block_fixed());
1044        self.fix_last_block_with_ones();
1045        let result = self.process(other, |w1, w2| !(w1 & w2));
1046        self.fix_last_block();
1047        result
1048    }
1049
1050    /// Calculates the nor of two bitvectors.
1051    ///
1052    /// Sets `self` to the nor of `self` and `other`. Both bitvectors must be
1053    /// the same length. Returns `true` if `self` changed.
1054    ///
1055    /// # Panics
1056    ///
1057    /// Panics if the bitvectors are of different length.
1058    ///
1059    /// # Examples
1060    ///
1061    /// ```
1062    /// use bit_vec::BitVec;
1063    ///
1064    /// let a   = 0b01100110;
1065    /// let b   = 0b01010100;
1066    /// let res = 0b10001001;
1067    ///
1068    /// let mut a = BitVec::from_bytes(&[a]);
1069    /// let b = BitVec::from_bytes(&[b]);
1070    ///
1071    /// assert!(a.nor(&b));
1072    /// assert_eq!(a, BitVec::from_bytes(&[res]));
1073    /// ```
1074    #[inline]
1075    pub fn nor(&mut self, other: &Self) -> bool {
1076        self.ensure_invariant();
1077        debug_assert!(other.is_last_block_fixed());
1078        self.fix_last_block_with_ones();
1079        let result = self.process(other, |w1, w2| !(w1 | w2));
1080        self.fix_last_block();
1081        result
1082    }
1083
1084    /// Calculates the xnor of two bitvectors.
1085    ///
1086    /// Sets `self` to the xnor of `self` and `other`. Both bitvectors must be
1087    /// the same length. Returns `true` if `self` changed.
1088    ///
1089    /// # Panics
1090    ///
1091    /// Panics if the bitvectors are of different length.
1092    ///
1093    /// # Examples
1094    ///
1095    /// ```
1096    /// use bit_vec::BitVec;
1097    ///
1098    /// let a   = 0b01100110;
1099    /// let b   = 0b01010100;
1100    /// let res = 0b11001101;
1101    ///
1102    /// let mut a = BitVec::from_bytes(&[a]);
1103    /// let b = BitVec::from_bytes(&[b]);
1104    ///
1105    /// assert!(a.xnor(&b));
1106    /// assert_eq!(a, BitVec::from_bytes(&[res]));
1107    /// ```
1108    #[inline]
1109    pub fn xnor(&mut self, other: &Self) -> bool {
1110        self.ensure_invariant();
1111        debug_assert!(other.is_last_block_fixed());
1112        self.fix_last_block_with_ones();
1113        let result = self.process(other, |w1, w2| !(w1 ^ w2));
1114        self.fix_last_block();
1115        result
1116    }
1117
1118    /// Returns `true` if all bits are 1.
1119    ///
1120    /// # Examples
1121    ///
1122    /// ```
1123    /// use bit_vec::BitVec;
1124    ///
1125    /// let mut bv = BitVec::from_elem(5, true);
1126    /// assert_eq!(bv.all(), true);
1127    ///
1128    /// bv.set(1, false);
1129    /// assert_eq!(bv.all(), false);
1130    /// ```
1131    #[inline]
1132    pub fn all(&self) -> bool {
1133        self.ensure_invariant();
1134        let mut last_word = !B::zero();
1135        // Check that every block but the last is all-ones...
1136        self.blocks().all(|elem| {
1137            let tmp = last_word;
1138            last_word = elem;
1139            tmp == !B::zero()
1140            // and then check the last one has enough ones
1141        }) && (last_word == mask_for_bits(self.nbits))
1142    }
1143
1144    /// Returns the number of ones in the binary representation.
1145    ///
1146    /// Also known as the
1147    /// [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight).
1148    ///
1149    /// # Examples
1150    ///
1151    /// ```
1152    /// use bit_vec::BitVec;
1153    ///
1154    /// let mut bv = BitVec::from_elem(100, true);
1155    /// assert_eq!(bv.count_ones(), 100);
1156    ///
1157    /// bv.set(50, false);
1158    /// assert_eq!(bv.count_ones(), 99);
1159    /// ```
1160    #[inline]
1161    pub fn count_ones(&self) -> u64 {
1162        self.ensure_invariant();
1163        // Add the number of ones of each block.
1164        self.blocks().map(|elem| elem.count_ones() as u64).sum()
1165    }
1166
1167    /// Returns the number of zeros in the binary representation.
1168    ///
1169    /// Also known as the opposite of
1170    /// [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight).
1171    ///
1172    /// # Examples
1173    ///
1174    /// ```
1175    /// use bit_vec::BitVec;
1176    ///
1177    /// let mut bv = BitVec::from_elem(100, false);
1178    /// assert_eq!(bv.count_zeros(), 100);
1179    ///
1180    /// bv.set(50, true);
1181    /// assert_eq!(bv.count_zeros(), 99);
1182    /// ```
1183    #[inline]
1184    pub fn count_zeros(&self) -> u64 {
1185        self.ensure_invariant();
1186        // Add the number of zeros of each block.
1187        let extra_zeros = (B::bits() - (self.len() % B::bits())) % B::bits();
1188        self.blocks()
1189            .map(|elem| elem.count_zeros() as u64)
1190            .sum::<u64>()
1191            - extra_zeros as u64
1192    }
1193
1194    /// Returns an iterator over the elements of the vector in order.
1195    ///
1196    /// # Examples
1197    ///
1198    /// ```
1199    /// use bit_vec::BitVec;
1200    ///
1201    /// let bv = BitVec::from_bytes(&[0b01110100, 0b10010010]);
1202    /// assert_eq!(bv.iter().filter(|x| *x).count(), 7);
1203    /// ```
1204    #[inline]
1205    pub fn iter(&self) -> Iter<'_, B> {
1206        self.ensure_invariant();
1207        Iter {
1208            bit_vec: self,
1209            range: 0..self.nbits,
1210        }
1211    }
1212
1213    /// Returns an iterator over mutable smart pointers to the elements of the vector in order.
1214    ///
1215    /// # Examples
1216    ///
1217    /// ```
1218    /// use bit_vec::BitVec;
1219    ///
1220    /// let mut a = BitVec::from_elem(8, false);
1221    /// a.iter_mut().enumerate().for_each(|(index, mut bit)| {
1222    ///     *bit = if index % 2 == 1 { true } else { false };
1223    /// });
1224    /// assert!(a.eq_vec(&[
1225    ///    false, true, false, true, false, true, false, true
1226    /// ]));
1227    /// ```
1228    #[inline]
1229    pub fn iter_mut(&mut self) -> IterMut<'_, B> {
1230        self.ensure_invariant();
1231        let nbits = self.nbits;
1232        IterMut {
1233            vec: Rc::new(RefCell::new(self)),
1234            range: 0..nbits,
1235        }
1236    }
1237
1238    /// Moves all bits from `other` into `Self`, leaving `other` empty.
1239    ///
1240    /// # Examples
1241    ///
1242    /// ```
1243    /// use bit_vec::BitVec;
1244    ///
1245    /// let mut a = BitVec::from_bytes(&[0b10000000]);
1246    /// let mut b = BitVec::from_bytes(&[0b01100001]);
1247    ///
1248    /// a.append(&mut b);
1249    ///
1250    /// assert_eq!(a.len(), 16);
1251    /// assert_eq!(b.len(), 0);
1252    /// assert!(a.eq_vec(&[true, false, false, false, false, false, false, false,
1253    ///                    false, true, true, false, false, false, false, true]));
1254    /// ```
1255    pub fn append(&mut self, other: &mut Self) {
1256        self.ensure_invariant();
1257        debug_assert!(other.is_last_block_fixed());
1258
1259        let b = self.len() % B::bits();
1260        let o = other.len() % B::bits();
1261        let will_overflow = (b + o > B::bits()) || (o == 0 && b != 0);
1262
1263        self.nbits += other.len();
1264        other.nbits = 0;
1265
1266        if b == 0 {
1267            self.storage.append(&mut other.storage);
1268        } else {
1269            self.storage.reserve(other.storage.len());
1270
1271            for block in other.storage.drain(..) {
1272                {
1273                    let last = self.storage.last_mut().unwrap();
1274                    *last = *last | (block << b);
1275                }
1276                self.storage.push(block >> (B::bits() - b));
1277            }
1278
1279            // Remove additional block if the last shift did not overflow
1280            if !will_overflow {
1281                self.storage.pop();
1282            }
1283        }
1284    }
1285
1286    /// Splits the `BitVec` into two at the given bit,
1287    /// retaining the first half in-place and returning the second one.
1288    ///
1289    /// # Panics
1290    ///
1291    /// Panics if `at` is out of bounds.
1292    ///
1293    /// # Examples
1294    ///
1295    /// ```
1296    /// use bit_vec::BitVec;
1297    /// let mut a = BitVec::new();
1298    /// a.push(true);
1299    /// a.push(false);
1300    /// a.push(false);
1301    /// a.push(true);
1302    ///
1303    /// let b = a.split_off(2);
1304    ///
1305    /// assert_eq!(a.len(), 2);
1306    /// assert_eq!(b.len(), 2);
1307    /// assert!(a.eq_vec(&[true, false]));
1308    /// assert!(b.eq_vec(&[false, true]));
1309    /// ```
1310    pub fn split_off(&mut self, at: usize) -> Self {
1311        self.ensure_invariant();
1312        assert!(at <= self.len(), "`at` out of bounds");
1313
1314        let mut other = BitVec::<B>::default();
1315
1316        if at == 0 {
1317            mem::swap(self, &mut other);
1318            return other;
1319        } else if at == self.len() {
1320            return other;
1321        }
1322
1323        let w = at / B::bits();
1324        let b = at % B::bits();
1325        other.nbits = self.nbits - at;
1326        self.nbits = at;
1327        if b == 0 {
1328            // Split at block boundary
1329            other.storage = self.storage.split_off(w);
1330        } else {
1331            other.storage.reserve(self.storage.len() - w);
1332
1333            {
1334                let mut iter = self.storage[w..].iter();
1335                let mut last = *iter.next().unwrap();
1336                for &cur in iter {
1337                    other.storage.push((last >> b) | (cur << (B::bits() - b)));
1338                    last = cur;
1339                }
1340                other.storage.push(last >> b);
1341            }
1342
1343            self.storage.truncate(w + 1);
1344            self.fix_last_block();
1345        }
1346
1347        other
1348    }
1349
1350    /// Returns `true` if all bits are 0.
1351    ///
1352    /// # Examples
1353    ///
1354    /// ```
1355    /// use bit_vec::BitVec;
1356    ///
1357    /// let mut bv = BitVec::from_elem(10, false);
1358    /// assert_eq!(bv.none(), true);
1359    ///
1360    /// bv.set(3, true);
1361    /// assert_eq!(bv.none(), false);
1362    /// ```
1363    #[inline]
1364    pub fn none(&self) -> bool {
1365        self.blocks().all(|w| w == B::zero())
1366    }
1367
1368    /// Returns `true` if any bit is 1.
1369    ///
1370    /// # Examples
1371    ///
1372    /// ```
1373    /// use bit_vec::BitVec;
1374    ///
1375    /// let mut bv = BitVec::from_elem(10, false);
1376    /// assert_eq!(bv.any(), false);
1377    ///
1378    /// bv.set(3, true);
1379    /// assert_eq!(bv.any(), true);
1380    /// ```
1381    #[inline]
1382    pub fn any(&self) -> bool {
1383        !self.none()
1384    }
1385
1386    /// Organises the bits into bytes, such that the first bit in the
1387    /// `BitVec` becomes the high-order bit of the first byte. If the
1388    /// size of the `BitVec` is not a multiple of eight then trailing bits
1389    /// will be filled-in with `false`.
1390    ///
1391    /// # Examples
1392    ///
1393    /// ```
1394    /// use bit_vec::BitVec;
1395    ///
1396    /// let mut bv = BitVec::from_elem(3, true);
1397    /// bv.set(1, false);
1398    ///
1399    /// assert_eq!(bv.to_bytes(), [0b10100000]);
1400    ///
1401    /// let mut bv = BitVec::from_elem(9, false);
1402    /// bv.set(2, true);
1403    /// bv.set(8, true);
1404    ///
1405    /// assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
1406    /// ```
1407    pub fn to_bytes(&self) -> Vec<u8> {
1408        static REVERSE_TABLE: [u8; 256] = {
1409            let mut tbl = [0u8; 256];
1410            let mut i: u8 = 0;
1411            loop {
1412                tbl[i as usize] = i.reverse_bits();
1413                if i == 255 {
1414                    break;
1415                }
1416                i += 1;
1417            }
1418            tbl
1419        };
1420        self.ensure_invariant();
1421
1422        let len = self.nbits / 8 + if self.nbits % 8 == 0 { 0 } else { 1 };
1423        let mut result = Vec::with_capacity(len);
1424
1425        for byte_idx in 0..len {
1426            let mut byte = 0u8;
1427            for bit_idx in 0..8 {
1428                let offset = byte_idx * 8 + bit_idx;
1429                if offset < self.nbits && self[offset] {
1430                    byte |= 1 << bit_idx;
1431                }
1432            }
1433            result.push(REVERSE_TABLE[byte as usize]);
1434        }
1435
1436        result
1437    }
1438
1439    /// Compares a `BitVec` to a slice of `bool`s.
1440    /// Both the `BitVec` and slice must have the same length.
1441    ///
1442    /// # Panics
1443    ///
1444    /// Panics if the `BitVec` and slice are of different length.
1445    ///
1446    /// # Examples
1447    ///
1448    /// ```
1449    /// use bit_vec::BitVec;
1450    ///
1451    /// let bv = BitVec::from_bytes(&[0b10100000]);
1452    ///
1453    /// assert!(bv.eq_vec(&[true, false, true, false,
1454    ///                     false, false, false, false]));
1455    /// ```
1456    #[inline]
1457    pub fn eq_vec(&self, v: &[bool]) -> bool {
1458        assert_eq!(self.nbits, v.len());
1459        self.iter().zip(v.iter().cloned()).all(|(b1, b2)| b1 == b2)
1460    }
1461
1462    /// Shortens a `BitVec`, dropping excess elements.
1463    ///
1464    /// If `len` is greater than the vector's current length, this has no
1465    /// effect.
1466    ///
1467    /// # Examples
1468    ///
1469    /// ```
1470    /// use bit_vec::BitVec;
1471    ///
1472    /// let mut bv = BitVec::from_bytes(&[0b01001011]);
1473    /// bv.truncate(2);
1474    /// assert!(bv.eq_vec(&[false, true]));
1475    /// ```
1476    #[inline]
1477    pub fn truncate(&mut self, len: usize) {
1478        self.ensure_invariant();
1479        if len < self.len() {
1480            self.nbits = len;
1481            // This fixes (2).
1482            self.storage.truncate(blocks_for_bits::<B>(len));
1483            self.fix_last_block();
1484        }
1485    }
1486
1487    /// Reserves capacity for at least `additional` more bits to be inserted in the given
1488    /// `BitVec`. The collection may reserve more space to avoid frequent reallocations.
1489    ///
1490    /// # Panics
1491    ///
1492    /// Panics if the new capacity overflows `usize`.
1493    ///
1494    /// # Examples
1495    ///
1496    /// ```
1497    /// use bit_vec::BitVec;
1498    ///
1499    /// let mut bv = BitVec::from_elem(3, false);
1500    /// bv.reserve(10);
1501    /// assert_eq!(bv.len(), 3);
1502    /// assert!(bv.capacity() >= 13);
1503    /// ```
1504    #[inline]
1505    pub fn reserve(&mut self, additional: usize) {
1506        let desired_cap = self
1507            .len()
1508            .checked_add(additional)
1509            .expect("capacity overflow");
1510        let storage_len = self.storage.len();
1511        if desired_cap > self.capacity() {
1512            self.storage
1513                .reserve(blocks_for_bits::<B>(desired_cap) - storage_len);
1514        }
1515    }
1516
1517    /// Reserves the minimum capacity for exactly `additional` more bits to be inserted in the
1518    /// given `BitVec`. Does nothing if the capacity is already sufficient.
1519    ///
1520    /// Note that the allocator may give the collection more space than it requests. Therefore
1521    /// capacity can not be relied upon to be precisely minimal. Prefer `reserve` if future
1522    /// insertions are expected.
1523    ///
1524    /// # Panics
1525    ///
1526    /// Panics if the new capacity overflows `usize`.
1527    ///
1528    /// # Examples
1529    ///
1530    /// ```
1531    /// use bit_vec::BitVec;
1532    ///
1533    /// let mut bv = BitVec::from_elem(3, false);
1534    /// bv.reserve(10);
1535    /// assert_eq!(bv.len(), 3);
1536    /// assert!(bv.capacity() >= 13);
1537    /// ```
1538    #[inline]
1539    pub fn reserve_exact(&mut self, additional: usize) {
1540        let desired_cap = self
1541            .len()
1542            .checked_add(additional)
1543            .expect("capacity overflow");
1544        let storage_len = self.storage.len();
1545        if desired_cap > self.capacity() {
1546            self.storage
1547                .reserve_exact(blocks_for_bits::<B>(desired_cap) - storage_len);
1548        }
1549    }
1550
1551    /// Returns the capacity in bits for this bit vector. Inserting any
1552    /// element less than this amount will not trigger a resizing.
1553    ///
1554    /// # Examples
1555    ///
1556    /// ```
1557    /// use bit_vec::BitVec;
1558    ///
1559    /// let mut bv = BitVec::new();
1560    /// bv.reserve(10);
1561    /// assert!(bv.capacity() >= 10);
1562    /// ```
1563    #[inline]
1564    pub fn capacity(&self) -> usize {
1565        self.storage.capacity().saturating_mul(B::bits())
1566    }
1567
1568    /// Grows the `BitVec` in-place, adding `n` copies of `value` to the `BitVec`.
1569    ///
1570    /// # Panics
1571    ///
1572    /// Panics if the new len overflows a `usize`.
1573    ///
1574    /// # Examples
1575    ///
1576    /// ```
1577    /// use bit_vec::BitVec;
1578    ///
1579    /// let mut bv = BitVec::from_bytes(&[0b01001011]);
1580    /// bv.grow(2, true);
1581    /// assert_eq!(bv.len(), 10);
1582    /// assert_eq!(bv.to_bytes(), [0b01001011, 0b11000000]);
1583    /// ```
1584    pub fn grow(&mut self, n: usize, value: bool) {
1585        self.ensure_invariant();
1586
1587        // Note: we just bulk set all the bits in the last word in this fn in multiple places
1588        // which is technically wrong if not all of these bits are to be used. However, at the end
1589        // of this fn we call `fix_last_block` at the end of this fn, which should fix this.
1590
1591        let new_nbits = self.nbits.checked_add(n).expect("capacity overflow");
1592        let new_nblocks = blocks_for_bits::<B>(new_nbits);
1593        let full_value = if value { !B::zero() } else { B::zero() };
1594
1595        // Correct the old tail word, setting or clearing formerly unused bits
1596        let num_cur_blocks = blocks_for_bits::<B>(self.nbits);
1597        if self.nbits % B::bits() > 0 {
1598            let mask = mask_for_bits::<B>(self.nbits);
1599            if value {
1600                let block = &mut self.storage[num_cur_blocks - 1];
1601                *block = *block | !mask;
1602            } else {
1603                // Extra bits are already zero by invariant.
1604            }
1605        }
1606
1607        // Fill in words after the old tail word
1608        let stop_idx = cmp::min(self.storage.len(), new_nblocks);
1609        for idx in num_cur_blocks..stop_idx {
1610            self.storage[idx] = full_value;
1611        }
1612
1613        // Allocate new words, if needed
1614        if new_nblocks > self.storage.len() {
1615            let to_add = new_nblocks - self.storage.len();
1616            self.storage.extend(repeat(full_value).take(to_add));
1617        }
1618
1619        // Adjust internal bit count
1620        self.nbits = new_nbits;
1621
1622        self.fix_last_block();
1623    }
1624
1625    /// Removes the last bit from the `BitVec`, and returns it. Returns `None` if the `BitVec` is empty.
1626    ///
1627    /// # Examples
1628    ///
1629    /// ```
1630    /// use bit_vec::BitVec;
1631    ///
1632    /// let mut bv = BitVec::from_bytes(&[0b01001001]);
1633    /// assert_eq!(bv.pop(), Some(true));
1634    /// assert_eq!(bv.pop(), Some(false));
1635    /// assert_eq!(bv.len(), 6);
1636    /// ```
1637    #[inline]
1638    pub fn pop(&mut self) -> Option<bool> {
1639        self.ensure_invariant();
1640
1641        if self.is_empty() {
1642            None
1643        } else {
1644            let i = self.nbits - 1;
1645            let ret = self[i];
1646            // (3)
1647            self.set(i, false);
1648            self.nbits = i;
1649            if self.nbits % B::bits() == 0 {
1650                // (2)
1651                self.storage.pop();
1652            }
1653            Some(ret)
1654        }
1655    }
1656
1657    /// Pushes a `bool` onto the end.
1658    ///
1659    /// # Examples
1660    ///
1661    /// ```
1662    /// use bit_vec::BitVec;
1663    ///
1664    /// let mut bv = BitVec::new();
1665    /// bv.push(true);
1666    /// bv.push(false);
1667    /// assert!(bv.eq_vec(&[true, false]));
1668    /// ```
1669    #[inline]
1670    pub fn push(&mut self, elem: bool) {
1671        if self.nbits % B::bits() == 0 {
1672            self.storage.push(B::zero());
1673        }
1674        let insert_pos = self.nbits;
1675        self.nbits = self.nbits.checked_add(1).expect("Capacity overflow");
1676        self.set(insert_pos, elem);
1677    }
1678
1679    /// Returns the total number of bits in this vector
1680    #[inline]
1681    pub fn len(&self) -> usize {
1682        self.nbits
1683    }
1684
1685    /// Sets the number of bits that this `BitVec` considers initialized.
1686    ///
1687    /// # Safety
1688    ///
1689    /// Almost certainly can cause bad stuff. Only really intended for `BitSet`.
1690    #[inline]
1691    pub unsafe fn set_len(&mut self, len: usize) {
1692        self.nbits = len;
1693    }
1694
1695    /// Returns true if there are no bits in this vector
1696    #[inline]
1697    pub fn is_empty(&self) -> bool {
1698        self.len() == 0
1699    }
1700
1701    /// Clears all bits in this vector.
1702    #[inline]
1703    #[deprecated(since = "0.9.0", note = "please use `.fill(false)` instead")]
1704    pub fn clear(&mut self) {
1705        self.ensure_invariant();
1706        for w in &mut self.storage {
1707            *w = B::zero();
1708        }
1709    }
1710
1711    /// Assigns all bits in this vector to the given boolean value.
1712    ///
1713    /// # Invariants
1714    ///
1715    /// - After a call to `.fill(true)`, the result of [`all`] is `true`.
1716    /// - After a call to `.fill(false)`, the result of [`none`] is `true`.
1717    ///
1718    /// [`all`]: Self::all
1719    /// [`none`]: Self::none
1720    #[inline]
1721    pub fn fill(&mut self, bit: bool) {
1722        self.ensure_invariant();
1723        let block = if bit { !B::zero() } else { B::zero() };
1724        for w in &mut self.storage {
1725            *w = block;
1726        }
1727        if bit {
1728            self.fix_last_block();
1729        }
1730    }
1731
1732    /// Shrinks the capacity of the underlying storage as much as
1733    /// possible.
1734    ///
1735    /// It will drop down as close as possible to the length but the
1736    /// allocator may still inform the underlying storage that there
1737    /// is space for a few more elements/bits.
1738    pub fn shrink_to_fit(&mut self) {
1739        self.storage.shrink_to_fit();
1740    }
1741
1742    /// Inserts a given bit at index `at`, shifting all bits after by one
1743    ///
1744    /// # Panics
1745    /// Panics if `at` is out of bounds for `BitVec`'s length (that is, if `at > BitVec::len()`)
1746    ///
1747    /// # Examples
1748    ///```
1749    /// use bit_vec::BitVec;
1750    ///
1751    /// let mut b = BitVec::new();
1752    ///
1753    /// b.push(true);
1754    /// b.push(true);
1755    /// b.insert(1, false);
1756    ///
1757    /// assert!(b.eq_vec(&[true, false, true]));
1758    ///```
1759    ///
1760    /// # Time complexity
1761    /// Takes O([`len`]) time. All items after the insertion index must be
1762    /// shifted to the right. In the worst case, all elements are shifted when
1763    /// the insertion index is 0.
1764    ///
1765    /// [`len`]: Self::len
1766    pub fn insert(&mut self, at: usize, bit: bool) {
1767        assert!(
1768            at <= self.nbits,
1769            "insertion index (is {at}) should be <= len (is {nbits})",
1770            nbits = self.nbits
1771        );
1772        self.ensure_invariant();
1773
1774        let last_block_bits = self.nbits % B::bits();
1775        let block_at = at / B::bits(); // needed block
1776        let bit_at = at % B::bits(); // index within the block
1777
1778        if last_block_bits == 0 {
1779            self.storage.push(B::zero());
1780        }
1781
1782        self.nbits += 1;
1783
1784        let mut carry = self.storage[block_at] >> (B::bits() - 1);
1785        let lsbits_mask = (B::one() << bit_at) - B::one();
1786        let set_bit = if bit { B::one() } else { B::zero() } << bit_at;
1787        self.storage[block_at] = (self.storage[block_at] & lsbits_mask)
1788            | ((self.storage[block_at] & !lsbits_mask) << 1)
1789            | set_bit;
1790
1791        for block_ref in &mut self.storage[block_at + 1..] {
1792            let curr_carry = *block_ref >> (B::bits() - 1);
1793            *block_ref = *block_ref << 1 | carry;
1794            carry = curr_carry;
1795        }
1796    }
1797
1798    /// Remove a bit at index `at`, shifting all bits after by one.
1799    ///
1800    /// # Panics
1801    /// Panics if `at` is out of bounds for `BitVec`'s length (that is, if `at >= BitVec::len()`)
1802    ///
1803    /// # Examples
1804    ///```
1805    /// use bit_vec::BitVec;
1806    ///
1807    /// let mut b = BitVec::new();
1808    ///
1809    /// b.push(true);
1810    /// b.push(false);
1811    /// b.push(false);
1812    /// b.push(true);
1813    /// assert!(!b.remove(1));
1814    ///
1815    /// assert!(b.eq_vec(&[true, false, true]));
1816    ///```
1817    ///
1818    /// # Time complexity
1819    /// Takes O([`len`]) time. All items after the removal index must be
1820    /// shifted to the left. In the worst case, all elements are shifted when
1821    /// the removal index is 0.
1822    ///
1823    /// [`len`]: Self::len
1824    pub fn remove(&mut self, at: usize) -> bool {
1825        assert!(
1826            at < self.nbits,
1827            "removal index (is {at}) should be < len (is {nbits})",
1828            nbits = self.nbits
1829        );
1830        self.ensure_invariant();
1831
1832        self.nbits -= 1;
1833
1834        let last_block_bits = self.nbits % B::bits();
1835        let block_at = at / B::bits(); // needed block
1836        let bit_at = at % B::bits(); // index within the block
1837
1838        let lsbits_mask = (B::one() << bit_at) - B::one();
1839
1840        let mut carry = B::zero();
1841
1842        for block_ref in self.storage[block_at + 1..].iter_mut().rev() {
1843            let curr_carry = *block_ref & B::one();
1844            *block_ref = *block_ref >> 1 | (carry << (B::bits() - 1));
1845            carry = curr_carry;
1846        }
1847
1848        let result = (self.storage[block_at] >> bit_at) & B::one() == B::one();
1849
1850        self.storage[block_at] = (self.storage[block_at] & lsbits_mask)
1851            | ((self.storage[block_at] & (!lsbits_mask << 1)) >> 1)
1852            | carry << (B::bits() - 1);
1853
1854        if last_block_bits == 0 {
1855            self.storage.pop();
1856        }
1857
1858        result
1859    }
1860
1861    /// Removes all bits in this vector.
1862    ///
1863    /// Note: this method is not named [`clear`] to avoid confusion whenever [`.fill(false)`]
1864    /// is needed.
1865    ///
1866    /// [`clear`]: Self::clear
1867    /// [`.fill(false)`]: Self::fill
1868    pub fn remove_all(&mut self) {
1869        self.storage.clear();
1870        self.nbits = 0;
1871    }
1872
1873    /// Appends an element if there is sufficient spare capacity, otherwise an error is returned
1874    /// with the element.
1875    ///
1876    /// Unlike [`push`] this method will not reallocate when there's insufficient capacity.
1877    /// The caller should use [`reserve`] to ensure that there is enough capacity.
1878    ///
1879    /// [`push`]: Self::push
1880    /// [`reserve`]: Self::reserve
1881    ///
1882    /// # Examples
1883    /// ```
1884    /// use bit_vec::BitVec;
1885    ///
1886    /// let initial_capacity = 64;
1887    /// let mut bitvec = BitVec::with_capacity(64);
1888    ///
1889    /// for _ in 0..initial_capacity - 1 {
1890    ///     bitvec.push(false);
1891    /// }
1892    ///
1893    /// assert_eq!(bitvec.len(), initial_capacity - 1); // there is space for only 1 bit
1894    ///
1895    /// assert_eq!(bitvec.push_within_capacity(true), Ok(())); // Successfully push a bit
1896    /// assert_eq!(bitvec.len(), initial_capacity); // So we can't push within capacity anymore
1897    ///
1898    /// assert_eq!(bitvec.push_within_capacity(true), Err(true));
1899    /// assert_eq!(bitvec.len(), initial_capacity);
1900    /// assert_eq!(bitvec.capacity(), initial_capacity);
1901    /// ```
1902    ///
1903    /// # Time Complexity
1904    /// Takes *O(1)* time.
1905    pub fn push_within_capacity(&mut self, bit: bool) -> Result<(), bool> {
1906        let len = self.len();
1907
1908        if len == self.capacity() {
1909            return Err(bit);
1910        }
1911
1912        let bits = B::bits();
1913
1914        if len % bits == 0 {
1915            self.storage.push(B::zero());
1916        }
1917
1918        let block_at = len / bits;
1919        let bit_at = len % bits;
1920        let flag = if bit { B::one() << bit_at } else { B::zero() };
1921
1922        self.ensure_invariant();
1923
1924        self.nbits += 1;
1925
1926        self.storage[block_at] = self.storage[block_at] | flag; // set the bit
1927
1928        Ok(())
1929    }
1930}
1931
1932impl<B: BitBlock> Default for BitVec<B> {
1933    #[inline]
1934    fn default() -> Self {
1935        BitVec {
1936            storage: Vec::new(),
1937            nbits: 0,
1938        }
1939    }
1940}
1941
1942impl<B: BitBlock> FromIterator<bool> for BitVec<B> {
1943    #[inline]
1944    fn from_iter<I: IntoIterator<Item = bool>>(iter: I) -> Self {
1945        let mut ret: Self = Default::default();
1946        ret.extend(iter);
1947        ret
1948    }
1949}
1950
1951impl<B: BitBlock> Extend<bool> for BitVec<B> {
1952    #[inline]
1953    fn extend<I: IntoIterator<Item = bool>>(&mut self, iterable: I) {
1954        self.ensure_invariant();
1955        let iterator = iterable.into_iter();
1956        let (min, _) = iterator.size_hint();
1957        self.reserve(min);
1958        for element in iterator {
1959            self.push(element)
1960        }
1961    }
1962}
1963
1964impl<B: BitBlock> Clone for BitVec<B> {
1965    #[inline]
1966    fn clone(&self) -> Self {
1967        self.ensure_invariant();
1968        BitVec {
1969            storage: self.storage.clone(),
1970            nbits: self.nbits,
1971        }
1972    }
1973
1974    #[inline]
1975    fn clone_from(&mut self, source: &Self) {
1976        debug_assert!(source.is_last_block_fixed());
1977        self.nbits = source.nbits;
1978        self.storage.clone_from(&source.storage);
1979    }
1980}
1981
1982impl<B: BitBlock> PartialOrd for BitVec<B> {
1983    #[inline]
1984    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1985        Some(self.cmp(other))
1986    }
1987}
1988
1989impl<B: BitBlock> Ord for BitVec<B> {
1990    #[inline]
1991    fn cmp(&self, other: &Self) -> Ordering {
1992        self.ensure_invariant();
1993        debug_assert!(other.is_last_block_fixed());
1994        let mut a = self.iter();
1995        let mut b = other.iter();
1996        loop {
1997            match (a.next(), b.next()) {
1998                (Some(x), Some(y)) => match x.cmp(&y) {
1999                    Ordering::Equal => {}
2000                    otherwise => return otherwise,
2001                },
2002                (None, None) => return Ordering::Equal,
2003                (None, _) => return Ordering::Less,
2004                (_, None) => return Ordering::Greater,
2005            }
2006        }
2007    }
2008}
2009
2010impl<B: BitBlock> fmt::Display for BitVec<B> {
2011    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
2012        self.ensure_invariant();
2013        for bit in self {
2014            fmt.write_char(if bit { '1' } else { '0' })?;
2015        }
2016        Ok(())
2017    }
2018}
2019
2020impl<B: BitBlock> fmt::Debug for BitVec<B> {
2021    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
2022        self.ensure_invariant();
2023        let mut storage = String::with_capacity(self.len() + self.len() / B::bits());
2024        for (i, bit) in self.iter().enumerate() {
2025            if i != 0 && i % B::bits() == 0 {
2026                storage.push(' ');
2027            }
2028            storage.push(if bit { '1' } else { '0' });
2029        }
2030        fmt.debug_struct("BitVec")
2031            .field("storage", &storage)
2032            .field("nbits", &self.nbits)
2033            .finish()
2034    }
2035}
2036
2037impl<B: BitBlock> hash::Hash for BitVec<B> {
2038    #[inline]
2039    fn hash<H: hash::Hasher>(&self, state: &mut H) {
2040        self.ensure_invariant();
2041        self.nbits.hash(state);
2042        for elem in self.blocks() {
2043            elem.hash(state);
2044        }
2045    }
2046}
2047
2048impl<B: BitBlock> cmp::PartialEq for BitVec<B> {
2049    #[inline]
2050    fn eq(&self, other: &Self) -> bool {
2051        if self.nbits != other.nbits {
2052            self.ensure_invariant();
2053            other.ensure_invariant();
2054            return false;
2055        }
2056        self.blocks().zip(other.blocks()).all(|(w1, w2)| w1 == w2)
2057    }
2058}
2059
2060impl<B: BitBlock> cmp::Eq for BitVec<B> {}
2061
2062/// An iterator for `BitVec`.
2063#[derive(Clone)]
2064pub struct Iter<'a, B: 'a = u32> {
2065    bit_vec: &'a BitVec<B>,
2066    range: Range<usize>,
2067}
2068
2069#[derive(Debug)]
2070pub struct MutBorrowedBit<'a, B: 'a + BitBlock> {
2071    vec: Rc<RefCell<&'a mut BitVec<B>>>,
2072    index: usize,
2073    #[cfg(debug_assertions)]
2074    old_value: bool,
2075    new_value: bool,
2076}
2077
2078/// An iterator for mutable references to the bits in a `BitVec`.
2079pub struct IterMut<'a, B: 'a + BitBlock = u32> {
2080    vec: Rc<RefCell<&'a mut BitVec<B>>>,
2081    range: Range<usize>,
2082}
2083
2084impl<'a, B: 'a + BitBlock> IterMut<'a, B> {
2085    fn get(&mut self, index: Option<usize>) -> Option<MutBorrowedBit<'a, B>> {
2086        let value = (*self.vec).borrow().get(index?)?;
2087        Some(MutBorrowedBit {
2088            vec: self.vec.clone(),
2089            index: index?,
2090            #[cfg(debug_assertions)]
2091            old_value: value,
2092            new_value: value,
2093        })
2094    }
2095}
2096
2097impl<B: BitBlock> Deref for MutBorrowedBit<'_, B> {
2098    type Target = bool;
2099
2100    fn deref(&self) -> &Self::Target {
2101        &self.new_value
2102    }
2103}
2104
2105impl<B: BitBlock> DerefMut for MutBorrowedBit<'_, B> {
2106    fn deref_mut(&mut self) -> &mut Self::Target {
2107        &mut self.new_value
2108    }
2109}
2110
2111impl<B: BitBlock> Drop for MutBorrowedBit<'_, B> {
2112    fn drop(&mut self) {
2113        let mut vec = (*self.vec).borrow_mut();
2114        #[cfg(debug_assertions)]
2115        debug_assert_eq!(
2116            Some(self.old_value),
2117            vec.get(self.index),
2118            "Mutably-borrowed bit was modified externally!"
2119        );
2120        vec.set(self.index, self.new_value);
2121    }
2122}
2123
2124impl<B: BitBlock> Iterator for Iter<'_, B> {
2125    type Item = bool;
2126
2127    #[inline]
2128    fn next(&mut self) -> Option<bool> {
2129        // NB: indexing is slow for extern crates when it has to go through &TRUE or &FALSE
2130        // variables.  get is more direct, and unwrap is fine since we're sure of the range.
2131        self.range.next().map(|i| self.bit_vec.get(i).unwrap())
2132    }
2133
2134    fn nth(&mut self, n: usize) -> Option<Self::Item> {
2135        // This override is used by the compiler to optimize Iterator::skip.
2136        // Without this, the default implementation of Iterator::nth is used, which walks over
2137        // the whole iterator up to n.
2138        self.range.nth(n).and_then(|i| self.bit_vec.get(i))
2139    }
2140
2141    fn size_hint(&self) -> (usize, Option<usize>) {
2142        self.range.size_hint()
2143    }
2144}
2145
2146impl<'a, B: BitBlock> Iterator for IterMut<'a, B> {
2147    type Item = MutBorrowedBit<'a, B>;
2148
2149    #[inline]
2150    fn next(&mut self) -> Option<Self::Item> {
2151        let index = self.range.next();
2152        self.get(index)
2153    }
2154
2155    fn size_hint(&self) -> (usize, Option<usize>) {
2156        self.range.size_hint()
2157    }
2158}
2159
2160impl<B: BitBlock> DoubleEndedIterator for Iter<'_, B> {
2161    #[inline]
2162    fn next_back(&mut self) -> Option<bool> {
2163        self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
2164    }
2165}
2166
2167impl<B: BitBlock> DoubleEndedIterator for IterMut<'_, B> {
2168    #[inline]
2169    fn next_back(&mut self) -> Option<Self::Item> {
2170        let index = self.range.next_back();
2171        self.get(index)
2172    }
2173}
2174
2175impl<B: BitBlock> ExactSizeIterator for Iter<'_, B> {}
2176
2177impl<B: BitBlock> ExactSizeIterator for IterMut<'_, B> {}
2178
2179impl<'a, B: BitBlock> IntoIterator for &'a BitVec<B> {
2180    type Item = bool;
2181    type IntoIter = Iter<'a, B>;
2182
2183    #[inline]
2184    fn into_iter(self) -> Iter<'a, B> {
2185        self.iter()
2186    }
2187}
2188
2189pub struct IntoIter<B = u32> {
2190    bit_vec: BitVec<B>,
2191    range: Range<usize>,
2192}
2193
2194impl<B: BitBlock> Iterator for IntoIter<B> {
2195    type Item = bool;
2196
2197    #[inline]
2198    fn next(&mut self) -> Option<bool> {
2199        self.range.next().map(|i| self.bit_vec.get(i).unwrap())
2200    }
2201}
2202
2203impl<B: BitBlock> DoubleEndedIterator for IntoIter<B> {
2204    #[inline]
2205    fn next_back(&mut self) -> Option<bool> {
2206        self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
2207    }
2208}
2209
2210impl<B: BitBlock> ExactSizeIterator for IntoIter<B> {}
2211
2212impl<B: BitBlock> IntoIterator for BitVec<B> {
2213    type Item = bool;
2214    type IntoIter = IntoIter<B>;
2215
2216    #[inline]
2217    fn into_iter(self) -> IntoIter<B> {
2218        let nbits = self.nbits;
2219        IntoIter {
2220            bit_vec: self,
2221            range: 0..nbits,
2222        }
2223    }
2224}
2225
2226/// An iterator over the blocks of a `BitVec`.
2227#[derive(Clone)]
2228pub struct Blocks<'a, B: 'a> {
2229    iter: slice::Iter<'a, B>,
2230}
2231
2232impl<B: BitBlock> Iterator for Blocks<'_, B> {
2233    type Item = B;
2234
2235    #[inline]
2236    fn next(&mut self) -> Option<B> {
2237        self.iter.next().cloned()
2238    }
2239
2240    #[inline]
2241    fn size_hint(&self) -> (usize, Option<usize>) {
2242        self.iter.size_hint()
2243    }
2244}
2245
2246impl<B: BitBlock> DoubleEndedIterator for Blocks<'_, B> {
2247    #[inline]
2248    fn next_back(&mut self) -> Option<B> {
2249        self.iter.next_back().cloned()
2250    }
2251}
2252
2253impl<B: BitBlock> ExactSizeIterator for Blocks<'_, B> {}
2254
2255#[cfg(test)]
2256mod tests {
2257    #![allow(clippy::shadow_reuse)]
2258    #![allow(clippy::shadow_same)]
2259    #![allow(clippy::shadow_unrelated)]
2260
2261    use super::{BitVec, Iter, Vec};
2262
2263    // This is stupid, but I want to differentiate from a "random" 32
2264    const U32_BITS: usize = 32;
2265
2266    #[test]
2267    fn test_display_output() {
2268        assert_eq!(format!("{}", BitVec::new()), "");
2269        assert_eq!(format!("{}", BitVec::from_elem(1, true)), "1");
2270        assert_eq!(format!("{}", BitVec::from_elem(8, false)), "00000000")
2271    }
2272
2273    #[test]
2274    fn test_debug_output() {
2275        assert_eq!(
2276            format!("{:?}", BitVec::new()),
2277            "BitVec { storage: \"\", nbits: 0 }"
2278        );
2279        assert_eq!(
2280            format!("{:?}", BitVec::from_elem(1, true)),
2281            "BitVec { storage: \"1\", nbits: 1 }"
2282        );
2283        assert_eq!(
2284            format!("{:?}", BitVec::from_elem(8, false)),
2285            "BitVec { storage: \"00000000\", nbits: 8 }"
2286        );
2287        assert_eq!(
2288            format!("{:?}", BitVec::from_elem(33, true)),
2289            "BitVec { storage: \"11111111111111111111111111111111 1\", nbits: 33 }"
2290        );
2291        assert_eq!(
2292            format!(
2293                "{:?}",
2294                BitVec::from_bytes(&[0b111, 0b000, 0b1110, 0b0001, 0b11111111, 0b00000000])
2295            ),
2296            "BitVec { storage: \"00000111000000000000111000000001 1111111100000000\", nbits: 48 }"
2297        )
2298    }
2299
2300    #[test]
2301    fn test_0_elements() {
2302        let act = BitVec::new();
2303        let exp = Vec::new();
2304        assert!(act.eq_vec(&exp));
2305        assert!(act.none() && act.all());
2306    }
2307
2308    #[test]
2309    fn test_1_element() {
2310        let mut act = BitVec::from_elem(1, false);
2311        assert!(act.eq_vec(&[false]));
2312        assert!(act.none() && !act.all());
2313        act = BitVec::from_elem(1, true);
2314        assert!(act.eq_vec(&[true]));
2315        assert!(!act.none() && act.all());
2316    }
2317
2318    #[test]
2319    fn test_2_elements() {
2320        let mut b = BitVec::from_elem(2, false);
2321        b.set(0, true);
2322        b.set(1, false);
2323        assert_eq!(format!("{}", b), "10");
2324        assert!(!b.none() && !b.all());
2325    }
2326
2327    #[test]
2328    fn test_10_elements() {
2329        // all 0
2330
2331        let mut act = BitVec::from_elem(10, false);
2332        assert!(
2333            (act.eq_vec(&[false, false, false, false, false, false, false, false, false, false]))
2334        );
2335        assert!(act.none() && !act.all());
2336        // all 1
2337
2338        act = BitVec::from_elem(10, true);
2339        assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
2340        assert!(!act.none() && act.all());
2341        // mixed
2342
2343        act = BitVec::from_elem(10, false);
2344        act.set(0, true);
2345        act.set(1, true);
2346        act.set(2, true);
2347        act.set(3, true);
2348        act.set(4, true);
2349        assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
2350        assert!(!act.none() && !act.all());
2351        // mixed
2352
2353        act = BitVec::from_elem(10, false);
2354        act.set(5, true);
2355        act.set(6, true);
2356        act.set(7, true);
2357        act.set(8, true);
2358        act.set(9, true);
2359        assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
2360        assert!(!act.none() && !act.all());
2361        // mixed
2362
2363        act = BitVec::from_elem(10, false);
2364        act.set(0, true);
2365        act.set(3, true);
2366        act.set(6, true);
2367        act.set(9, true);
2368        assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
2369        assert!(!act.none() && !act.all());
2370    }
2371
2372    #[test]
2373    fn test_31_elements() {
2374        // all 0
2375
2376        let mut act = BitVec::from_elem(31, false);
2377        assert!(act.eq_vec(&[
2378            false, false, false, false, false, false, false, false, false, false, false, false,
2379            false, false, false, false, false, false, false, false, false, false, false, false,
2380            false, false, false, false, false, false, false
2381        ]));
2382        assert!(act.none() && !act.all());
2383        // all 1
2384
2385        act = BitVec::from_elem(31, true);
2386        assert!(act.eq_vec(&[
2387            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2388            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2389            true, true, true
2390        ]));
2391        assert!(!act.none() && act.all());
2392        // mixed
2393
2394        act = BitVec::from_elem(31, false);
2395        act.set(0, true);
2396        act.set(1, true);
2397        act.set(2, true);
2398        act.set(3, true);
2399        act.set(4, true);
2400        act.set(5, true);
2401        act.set(6, true);
2402        act.set(7, true);
2403        assert!(act.eq_vec(&[
2404            true, true, true, true, true, true, true, true, false, false, false, false, false,
2405            false, false, false, false, false, false, false, false, false, false, false, false,
2406            false, false, false, false, false, false
2407        ]));
2408        assert!(!act.none() && !act.all());
2409        // mixed
2410
2411        act = BitVec::from_elem(31, false);
2412        act.set(16, true);
2413        act.set(17, true);
2414        act.set(18, true);
2415        act.set(19, true);
2416        act.set(20, true);
2417        act.set(21, true);
2418        act.set(22, true);
2419        act.set(23, true);
2420        assert!(act.eq_vec(&[
2421            false, false, false, false, false, false, false, false, false, false, false, false,
2422            false, false, false, false, true, true, true, true, true, true, true, true, false,
2423            false, false, false, false, false, false
2424        ]));
2425        assert!(!act.none() && !act.all());
2426        // mixed
2427
2428        act = BitVec::from_elem(31, false);
2429        act.set(24, true);
2430        act.set(25, true);
2431        act.set(26, true);
2432        act.set(27, true);
2433        act.set(28, true);
2434        act.set(29, true);
2435        act.set(30, true);
2436        assert!(act.eq_vec(&[
2437            false, false, false, false, false, false, false, false, false, false, false, false,
2438            false, false, false, false, false, false, false, false, false, false, false, false,
2439            true, true, true, true, true, true, true
2440        ]));
2441        assert!(!act.none() && !act.all());
2442        // mixed
2443
2444        act = BitVec::from_elem(31, false);
2445        act.set(3, true);
2446        act.set(17, true);
2447        act.set(30, true);
2448        assert!(act.eq_vec(&[
2449            false, false, false, true, false, false, false, false, false, false, false, false,
2450            false, false, false, false, false, true, false, false, false, false, false, false,
2451            false, false, false, false, false, false, true
2452        ]));
2453        assert!(!act.none() && !act.all());
2454    }
2455
2456    #[test]
2457    fn test_32_elements() {
2458        // all 0
2459
2460        let mut act = BitVec::from_elem(32, false);
2461        assert!(act.eq_vec(&[
2462            false, false, false, false, false, false, false, false, false, false, false, false,
2463            false, false, false, false, false, false, false, false, false, false, false, false,
2464            false, false, false, false, false, false, false, false
2465        ]));
2466        assert!(act.none() && !act.all());
2467        // all 1
2468
2469        act = BitVec::from_elem(32, true);
2470        assert!(act.eq_vec(&[
2471            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2472            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2473            true, true, true, true
2474        ]));
2475        assert!(!act.none() && act.all());
2476        // mixed
2477
2478        act = BitVec::from_elem(32, false);
2479        act.set(0, true);
2480        act.set(1, true);
2481        act.set(2, true);
2482        act.set(3, true);
2483        act.set(4, true);
2484        act.set(5, true);
2485        act.set(6, true);
2486        act.set(7, true);
2487        assert!(act.eq_vec(&[
2488            true, true, true, true, true, true, true, true, false, false, false, false, false,
2489            false, false, false, false, false, false, false, false, false, false, false, false,
2490            false, false, false, false, false, false, false
2491        ]));
2492        assert!(!act.none() && !act.all());
2493        // mixed
2494
2495        act = BitVec::from_elem(32, false);
2496        act.set(16, true);
2497        act.set(17, true);
2498        act.set(18, true);
2499        act.set(19, true);
2500        act.set(20, true);
2501        act.set(21, true);
2502        act.set(22, true);
2503        act.set(23, true);
2504        assert!(act.eq_vec(&[
2505            false, false, false, false, false, false, false, false, false, false, false, false,
2506            false, false, false, false, true, true, true, true, true, true, true, true, false,
2507            false, false, false, false, false, false, false
2508        ]));
2509        assert!(!act.none() && !act.all());
2510        // mixed
2511
2512        act = BitVec::from_elem(32, false);
2513        act.set(24, true);
2514        act.set(25, true);
2515        act.set(26, true);
2516        act.set(27, true);
2517        act.set(28, true);
2518        act.set(29, true);
2519        act.set(30, true);
2520        act.set(31, true);
2521        assert!(act.eq_vec(&[
2522            false, false, false, false, false, false, false, false, false, false, false, false,
2523            false, false, false, false, false, false, false, false, false, false, false, false,
2524            true, true, true, true, true, true, true, true
2525        ]));
2526        assert!(!act.none() && !act.all());
2527        // mixed
2528
2529        act = BitVec::from_elem(32, false);
2530        act.set(3, true);
2531        act.set(17, true);
2532        act.set(30, true);
2533        act.set(31, true);
2534        assert!(act.eq_vec(&[
2535            false, false, false, true, false, false, false, false, false, false, false, false,
2536            false, false, false, false, false, true, false, false, false, false, false, false,
2537            false, false, false, false, false, false, true, true
2538        ]));
2539        assert!(!act.none() && !act.all());
2540    }
2541
2542    #[test]
2543    fn test_33_elements() {
2544        // all 0
2545
2546        let mut act = BitVec::from_elem(33, false);
2547        assert!(act.eq_vec(&[
2548            false, false, false, false, false, false, false, false, false, false, false, false,
2549            false, false, false, false, false, false, false, false, false, false, false, false,
2550            false, false, false, false, false, false, false, false, false
2551        ]));
2552        assert!(act.none() && !act.all());
2553        // all 1
2554
2555        act = BitVec::from_elem(33, true);
2556        assert!(act.eq_vec(&[
2557            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2558            true, true, true, true, true, true, true, true, true, true, true, true, true, true,
2559            true, true, true, true, true
2560        ]));
2561        assert!(!act.none() && act.all());
2562        // mixed
2563
2564        act = BitVec::from_elem(33, false);
2565        act.set(0, true);
2566        act.set(1, true);
2567        act.set(2, true);
2568        act.set(3, true);
2569        act.set(4, true);
2570        act.set(5, true);
2571        act.set(6, true);
2572        act.set(7, true);
2573        assert!(act.eq_vec(&[
2574            true, true, true, true, true, true, true, true, false, false, false, false, false,
2575            false, false, false, false, false, false, false, false, false, false, false, false,
2576            false, false, false, false, false, false, false, false
2577        ]));
2578        assert!(!act.none() && !act.all());
2579        // mixed
2580
2581        act = BitVec::from_elem(33, false);
2582        act.set(16, true);
2583        act.set(17, true);
2584        act.set(18, true);
2585        act.set(19, true);
2586        act.set(20, true);
2587        act.set(21, true);
2588        act.set(22, true);
2589        act.set(23, true);
2590        assert!(act.eq_vec(&[
2591            false, false, false, false, false, false, false, false, false, false, false, false,
2592            false, false, false, false, true, true, true, true, true, true, true, true, false,
2593            false, false, false, false, false, false, false, false
2594        ]));
2595        assert!(!act.none() && !act.all());
2596        // mixed
2597
2598        act = BitVec::from_elem(33, false);
2599        act.set(24, true);
2600        act.set(25, true);
2601        act.set(26, true);
2602        act.set(27, true);
2603        act.set(28, true);
2604        act.set(29, true);
2605        act.set(30, true);
2606        act.set(31, true);
2607        assert!(act.eq_vec(&[
2608            false, false, false, false, false, false, false, false, false, false, false, false,
2609            false, false, false, false, false, false, false, false, false, false, false, false,
2610            true, true, true, true, true, true, true, true, false
2611        ]));
2612        assert!(!act.none() && !act.all());
2613        // mixed
2614
2615        act = BitVec::from_elem(33, false);
2616        act.set(3, true);
2617        act.set(17, true);
2618        act.set(30, true);
2619        act.set(31, true);
2620        act.set(32, true);
2621        assert!(act.eq_vec(&[
2622            false, false, false, true, false, false, false, false, false, false, false, false,
2623            false, false, false, false, false, true, false, false, false, false, false, false,
2624            false, false, false, false, false, false, true, true, true
2625        ]));
2626        assert!(!act.none() && !act.all());
2627    }
2628
2629    #[test]
2630    fn test_equal_differing_sizes() {
2631        let v0 = BitVec::from_elem(10, false);
2632        let v1 = BitVec::from_elem(11, false);
2633        assert_ne!(v0, v1);
2634    }
2635
2636    #[test]
2637    fn test_equal_greatly_differing_sizes() {
2638        let v0 = BitVec::from_elem(10, false);
2639        let v1 = BitVec::from_elem(110, false);
2640        assert_ne!(v0, v1);
2641    }
2642
2643    #[test]
2644    fn test_equal_sneaky_small() {
2645        let mut a = BitVec::from_elem(1, false);
2646        a.set(0, true);
2647
2648        let mut b = BitVec::from_elem(1, true);
2649        b.set(0, true);
2650
2651        assert_eq!(a, b);
2652    }
2653
2654    #[test]
2655    fn test_equal_sneaky_big() {
2656        let mut a = BitVec::from_elem(100, false);
2657        for i in 0..100 {
2658            a.set(i, true);
2659        }
2660
2661        let mut b = BitVec::from_elem(100, true);
2662        for i in 0..100 {
2663            b.set(i, true);
2664        }
2665
2666        assert_eq!(a, b);
2667    }
2668
2669    #[test]
2670    fn test_from_bytes() {
2671        let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
2672        let str = concat!("10110110", "00000000", "11111111");
2673        assert_eq!(format!("{}", bit_vec), str);
2674    }
2675
2676    #[test]
2677    fn test_to_bytes() {
2678        let mut bv = BitVec::from_elem(3, true);
2679        bv.set(1, false);
2680        assert_eq!(bv.to_bytes(), [0b10100000]);
2681
2682        let mut bv = BitVec::from_elem(9, false);
2683        bv.set(2, true);
2684        bv.set(8, true);
2685        assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
2686    }
2687
2688    #[test]
2689    fn test_from_bools() {
2690        let bools = [true, false, true, true];
2691        let bit_vec: BitVec = bools.iter().copied().collect();
2692        assert_eq!(format!("{}", bit_vec), "1011");
2693    }
2694
2695    #[test]
2696    fn test_to_bools() {
2697        let bools = vec![false, false, true, false, false, true, true, false];
2698        assert_eq!(
2699            BitVec::from_bytes(&[0b00100110])
2700                .iter()
2701                .collect::<Vec<bool>>(),
2702            bools
2703        );
2704    }
2705
2706    #[test]
2707    fn test_bit_vec_iterator() {
2708        let bools = vec![true, false, true, true];
2709        let bit_vec: BitVec = bools.iter().copied().collect();
2710
2711        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
2712
2713        let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
2714        let bit_vec: BitVec = long.iter().copied().collect();
2715        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
2716    }
2717
2718    #[test]
2719    fn test_small_difference() {
2720        let mut b1 = BitVec::from_elem(3, false);
2721        let mut b2 = BitVec::from_elem(3, false);
2722        b1.set(0, true);
2723        b1.set(1, true);
2724        b2.set(1, true);
2725        b2.set(2, true);
2726        assert!(b1.difference(&b2));
2727        assert!(b1[0]);
2728        assert!(!b1[1]);
2729        assert!(!b1[2]);
2730    }
2731
2732    #[test]
2733    fn test_big_difference() {
2734        let mut b1 = BitVec::from_elem(100, false);
2735        let mut b2 = BitVec::from_elem(100, false);
2736        b1.set(0, true);
2737        b1.set(40, true);
2738        b2.set(40, true);
2739        b2.set(80, true);
2740        assert!(b1.difference(&b2));
2741        assert!(b1[0]);
2742        assert!(!b1[40]);
2743        assert!(!b1[80]);
2744    }
2745
2746    #[test]
2747    fn test_small_xor() {
2748        let mut a = BitVec::from_bytes(&[0b0011]);
2749        let b = BitVec::from_bytes(&[0b0101]);
2750        let c = BitVec::from_bytes(&[0b0110]);
2751        assert!(a.xor(&b));
2752        assert_eq!(a, c);
2753    }
2754
2755    #[test]
2756    fn test_small_xnor() {
2757        let mut a = BitVec::from_bytes(&[0b0011]);
2758        let b = BitVec::from_bytes(&[0b1111_0101]);
2759        let c = BitVec::from_bytes(&[0b1001]);
2760        assert!(a.xnor(&b));
2761        assert_eq!(a, c);
2762    }
2763
2764    #[test]
2765    fn test_small_nand() {
2766        let mut a = BitVec::from_bytes(&[0b1111_0011]);
2767        let b = BitVec::from_bytes(&[0b1111_0101]);
2768        let c = BitVec::from_bytes(&[0b1110]);
2769        assert!(a.nand(&b));
2770        assert_eq!(a, c);
2771    }
2772
2773    #[test]
2774    fn test_small_nor() {
2775        let mut a = BitVec::from_bytes(&[0b0011]);
2776        let b = BitVec::from_bytes(&[0b1111_0101]);
2777        let c = BitVec::from_bytes(&[0b1000]);
2778        assert!(a.nor(&b));
2779        assert_eq!(a, c);
2780    }
2781
2782    #[test]
2783    fn test_big_xor() {
2784        let mut a = BitVec::from_bytes(&[
2785            // 88 bits
2786            0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2787        ]);
2788        let b = BitVec::from_bytes(&[
2789            // 88 bits
2790            0, 0, 0b00010100, 0, 0, 0, 0, 0, 0, 0, 0b00110100,
2791        ]);
2792        let c = BitVec::from_bytes(&[
2793            // 88 bits
2794            0, 0, 0, 0, 0, 0, 0, 0b00110100, 0, 0, 0b00110100,
2795        ]);
2796        assert!(a.xor(&b));
2797        assert_eq!(a, c);
2798    }
2799
2800    #[test]
2801    fn test_big_xnor() {
2802        let mut a = BitVec::from_bytes(&[
2803            // 88 bits
2804            0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2805        ]);
2806        let b = BitVec::from_bytes(&[
2807            // 88 bits
2808            0, 0, 0b00010100, 0, 0, 0, 0, 0, 0, 0, 0b00110100,
2809        ]);
2810        let c = BitVec::from_bytes(&[
2811            // 88 bits
2812            !0,
2813            !0,
2814            !0,
2815            !0,
2816            !0,
2817            !0,
2818            !0,
2819            !0b00110100,
2820            !0,
2821            !0,
2822            !0b00110100,
2823        ]);
2824        assert!(a.xnor(&b));
2825        assert_eq!(a, c);
2826    }
2827
2828    #[test]
2829    fn test_small_fill() {
2830        let mut b = BitVec::from_elem(14, true);
2831        assert!(!b.none() && b.all());
2832        b.fill(false);
2833        assert!(b.none() && !b.all());
2834        b.fill(true);
2835        assert!(!b.none() && b.all());
2836    }
2837
2838    #[test]
2839    fn test_big_fill() {
2840        let mut b = BitVec::from_elem(140, true);
2841        assert!(!b.none() && b.all());
2842        b.fill(false);
2843        assert!(b.none() && !b.all());
2844        b.fill(true);
2845        assert!(!b.none() && b.all());
2846    }
2847
2848    #[test]
2849    fn test_bit_vec_lt() {
2850        let mut a = BitVec::from_elem(5, false);
2851        let mut b = BitVec::from_elem(5, false);
2852
2853        assert!(a >= b && b >= a);
2854        b.set(2, true);
2855        assert!(a < b);
2856        a.set(3, true);
2857        assert!(a < b);
2858        a.set(2, true);
2859        assert!(a >= b && b < a);
2860        b.set(0, true);
2861        assert!(a < b);
2862    }
2863
2864    #[test]
2865    fn test_ord() {
2866        let mut a = BitVec::from_elem(5, false);
2867        let mut b = BitVec::from_elem(5, false);
2868
2869        assert!(a == b);
2870        a.set(1, true);
2871        assert!(a > b && a >= b);
2872        assert!(b < a && b <= a);
2873        b.set(1, true);
2874        b.set(2, true);
2875        assert!(b > a && b >= a);
2876        assert!(a < b && a <= b);
2877    }
2878
2879    #[test]
2880    fn test_small_bit_vec_tests() {
2881        let v = BitVec::from_bytes(&[0]);
2882        assert!(!v.all());
2883        assert!(!v.any());
2884        assert!(v.none());
2885
2886        let v = BitVec::from_bytes(&[0b00010100]);
2887        assert!(!v.all());
2888        assert!(v.any());
2889        assert!(!v.none());
2890
2891        let v = BitVec::from_bytes(&[0xFF]);
2892        assert!(v.all());
2893        assert!(v.any());
2894        assert!(!v.none());
2895    }
2896
2897    #[test]
2898    fn test_big_bit_vec_tests() {
2899        let v = BitVec::from_bytes(&[
2900            // 88 bits
2901            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2902        ]);
2903        assert!(!v.all());
2904        assert!(!v.any());
2905        assert!(v.none());
2906
2907        let v = BitVec::from_bytes(&[
2908            // 88 bits
2909            0, 0, 0b00010100, 0, 0, 0, 0, 0b00110100, 0, 0, 0,
2910        ]);
2911        assert!(!v.all());
2912        assert!(v.any());
2913        assert!(!v.none());
2914
2915        let v = BitVec::from_bytes(&[
2916            // 88 bits
2917            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2918        ]);
2919        assert!(v.all());
2920        assert!(v.any());
2921        assert!(!v.none());
2922    }
2923
2924    #[test]
2925    fn test_bit_vec_push_pop() {
2926        let mut s = BitVec::from_elem(5 * U32_BITS - 2, false);
2927        assert_eq!(s.len(), 5 * U32_BITS - 2);
2928        assert!(!s[5 * U32_BITS - 3]);
2929        s.push(true);
2930        s.push(true);
2931        assert!(s[5 * U32_BITS - 2]);
2932        assert!(s[5 * U32_BITS - 1]);
2933        // Here the internal vector will need to be extended
2934        s.push(false);
2935        assert!(!s[5 * U32_BITS]);
2936        s.push(false);
2937        assert!(!s[5 * U32_BITS + 1]);
2938        assert_eq!(s.len(), 5 * U32_BITS + 2);
2939        // Pop it all off
2940        assert_eq!(s.pop(), Some(false));
2941        assert_eq!(s.pop(), Some(false));
2942        assert_eq!(s.pop(), Some(true));
2943        assert_eq!(s.pop(), Some(true));
2944        assert_eq!(s.len(), 5 * U32_BITS - 2);
2945    }
2946
2947    #[test]
2948    fn test_bit_vec_truncate() {
2949        let mut s = BitVec::from_elem(5 * U32_BITS, true);
2950
2951        assert_eq!(s, BitVec::from_elem(5 * U32_BITS, true));
2952        assert_eq!(s.len(), 5 * U32_BITS);
2953        s.truncate(4 * U32_BITS);
2954        assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2955        assert_eq!(s.len(), 4 * U32_BITS);
2956        // Truncating to a size > s.len() should be a noop
2957        s.truncate(5 * U32_BITS);
2958        assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
2959        assert_eq!(s.len(), 4 * U32_BITS);
2960        s.truncate(3 * U32_BITS - 10);
2961        assert_eq!(s, BitVec::from_elem(3 * U32_BITS - 10, true));
2962        assert_eq!(s.len(), 3 * U32_BITS - 10);
2963        s.truncate(0);
2964        assert_eq!(s, BitVec::from_elem(0, true));
2965        assert_eq!(s.len(), 0);
2966    }
2967
2968    #[test]
2969    fn test_bit_vec_reserve() {
2970        let mut s = BitVec::from_elem(5 * U32_BITS, true);
2971        // Check capacity
2972        assert!(s.capacity() >= 5 * U32_BITS);
2973        s.reserve(2 * U32_BITS);
2974        assert!(s.capacity() >= 7 * U32_BITS);
2975        s.reserve(7 * U32_BITS);
2976        assert!(s.capacity() >= 12 * U32_BITS);
2977        s.reserve_exact(7 * U32_BITS);
2978        assert!(s.capacity() >= 12 * U32_BITS);
2979        s.reserve(7 * U32_BITS + 1);
2980        assert!(s.capacity() > 12 * U32_BITS);
2981        // Check that length hasn't changed
2982        assert_eq!(s.len(), 5 * U32_BITS);
2983        s.push(true);
2984        s.push(false);
2985        s.push(true);
2986        assert!(s[5 * U32_BITS - 1]);
2987        assert!(s[5 * U32_BITS]);
2988        assert!(!s[5 * U32_BITS + 1]);
2989        assert!(s[5 * U32_BITS + 2]);
2990    }
2991
2992    #[test]
2993    fn test_bit_vec_grow() {
2994        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
2995        bit_vec.grow(32, true);
2996        assert_eq!(
2997            bit_vec,
2998            BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF])
2999        );
3000        bit_vec.grow(64, false);
3001        assert_eq!(
3002            bit_vec,
3003            BitVec::from_bytes(&[
3004                0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0
3005            ])
3006        );
3007        bit_vec.grow(16, true);
3008        assert_eq!(
3009            bit_vec,
3010            BitVec::from_bytes(&[
3011                0b10110110, 0b00000000, 0b10101010, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0,
3012                0xFF, 0xFF
3013            ])
3014        );
3015    }
3016
3017    #[test]
3018    fn test_bit_vec_extend() {
3019        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
3020        let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
3021        bit_vec.extend(ext.iter());
3022        assert_eq!(
3023            bit_vec,
3024            BitVec::from_bytes(&[
3025                0b10110110, 0b00000000, 0b11111111, 0b01001001, 0b10010010, 0b10111101
3026            ])
3027        );
3028    }
3029
3030    #[test]
3031    fn test_bit_vec_append() {
3032        // Append to BitVec that holds a multiple of U32_BITS bits
3033        let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011]);
3034        let mut b = BitVec::new();
3035        b.push(false);
3036        b.push(true);
3037        b.push(true);
3038
3039        a.append(&mut b);
3040
3041        assert_eq!(a.len(), 35);
3042        assert_eq!(b.len(), 0);
3043        assert!(b.capacity() >= 3);
3044
3045        assert!(a.eq_vec(&[
3046            true, false, true, false, false, false, false, false, false, false, false, true, false,
3047            false, true, false, true, false, false, true, false, false, true, false, false, false,
3048            true, true, false, false, true, true, false, true, true
3049        ]));
3050
3051        // Append to arbitrary BitVec
3052        let mut a = BitVec::new();
3053        a.push(true);
3054        a.push(false);
3055
3056        let mut b =
3057            BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
3058
3059        a.append(&mut b);
3060
3061        assert_eq!(a.len(), 42);
3062        assert_eq!(b.len(), 0);
3063        assert!(b.capacity() >= 40);
3064
3065        assert!(a.eq_vec(&[
3066            true, false, true, false, true, false, false, false, false, false, false, false, false,
3067            true, false, false, true, false, true, false, false, true, false, false, true, false,
3068            false, false, true, true, false, false, true, true, true, false, false, true, false,
3069            true, false, true
3070        ]));
3071
3072        // Append to empty BitVec
3073        let mut a = BitVec::new();
3074        let mut b =
3075            BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
3076
3077        a.append(&mut b);
3078
3079        assert_eq!(a.len(), 40);
3080        assert_eq!(b.len(), 0);
3081        assert!(b.capacity() >= 40);
3082
3083        assert!(a.eq_vec(&[
3084            true, false, true, false, false, false, false, false, false, false, false, true, false,
3085            false, true, false, true, false, false, true, false, false, true, false, false, false,
3086            true, true, false, false, true, true, true, false, false, true, false, true, false,
3087            true
3088        ]));
3089
3090        // Append empty BitVec
3091        let mut a =
3092            BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
3093        let mut b = BitVec::new();
3094
3095        a.append(&mut b);
3096
3097        assert_eq!(a.len(), 40);
3098        assert_eq!(b.len(), 0);
3099
3100        assert!(a.eq_vec(&[
3101            true, false, true, false, false, false, false, false, false, false, false, true, false,
3102            false, true, false, true, false, false, true, false, false, true, false, false, false,
3103            true, true, false, false, true, true, true, false, false, true, false, true, false,
3104            true
3105        ]));
3106    }
3107
3108    #[test]
3109    fn test_bit_vec_split_off() {
3110        // Split at 0
3111        let mut a = BitVec::new();
3112        a.push(true);
3113        a.push(false);
3114        a.push(false);
3115        a.push(true);
3116
3117        let b = a.split_off(0);
3118
3119        assert_eq!(a.len(), 0);
3120        assert_eq!(b.len(), 4);
3121
3122        assert!(b.eq_vec(&[true, false, false, true]));
3123
3124        // Split at last bit
3125        a.truncate(0);
3126        a.push(true);
3127        a.push(false);
3128        a.push(false);
3129        a.push(true);
3130
3131        let b = a.split_off(4);
3132
3133        assert_eq!(a.len(), 4);
3134        assert_eq!(b.len(), 0);
3135
3136        assert!(a.eq_vec(&[true, false, false, true]));
3137
3138        // Split at block boundary
3139        let mut a =
3140            BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b11110011]);
3141
3142        let b = a.split_off(32);
3143
3144        assert_eq!(a.len(), 32);
3145        assert_eq!(b.len(), 8);
3146
3147        assert!(a.eq_vec(&[
3148            true, false, true, false, false, false, false, false, false, false, false, true, false,
3149            false, true, false, true, false, false, true, false, false, true, false, false, false,
3150            true, true, false, false, true, true
3151        ]));
3152        assert!(b.eq_vec(&[true, true, true, true, false, false, true, true]));
3153
3154        // Don't split at block boundary
3155        let mut a = BitVec::from_bytes(&[
3156            0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b01101011, 0b10101101,
3157        ]);
3158
3159        let b = a.split_off(13);
3160
3161        assert_eq!(a.len(), 13);
3162        assert_eq!(b.len(), 35);
3163
3164        assert!(a.eq_vec(&[
3165            true, false, true, false, false, false, false, false, false, false, false, true, false
3166        ]));
3167        assert!(b.eq_vec(&[
3168            false, true, false, true, false, false, true, false, false, true, false, false, false,
3169            true, true, false, false, true, true, false, true, true, false, true, false, true,
3170            true, true, false, true, false, true, true, false, true
3171        ]));
3172    }
3173
3174    #[test]
3175    fn test_into_iter() {
3176        let bools = [true, false, true, true];
3177        let bit_vec: BitVec = bools.iter().copied().collect();
3178        let mut iter = bit_vec.into_iter();
3179        assert_eq!(Some(true), iter.next());
3180        assert_eq!(Some(false), iter.next());
3181        assert_eq!(Some(true), iter.next());
3182        assert_eq!(Some(true), iter.next());
3183        assert_eq!(None, iter.next());
3184        assert_eq!(None, iter.next());
3185
3186        let bit_vec: BitVec = bools.iter().copied().collect();
3187        let mut iter = bit_vec.into_iter();
3188        assert_eq!(Some(true), iter.next_back());
3189        assert_eq!(Some(true), iter.next_back());
3190        assert_eq!(Some(false), iter.next_back());
3191        assert_eq!(Some(true), iter.next_back());
3192        assert_eq!(None, iter.next_back());
3193        assert_eq!(None, iter.next_back());
3194
3195        let bit_vec: BitVec = bools.iter().copied().collect();
3196        let mut iter = bit_vec.into_iter();
3197        assert_eq!(Some(true), iter.next_back());
3198        assert_eq!(Some(true), iter.next());
3199        assert_eq!(Some(false), iter.next());
3200        assert_eq!(Some(true), iter.next_back());
3201        assert_eq!(None, iter.next());
3202        assert_eq!(None, iter.next_back());
3203    }
3204
3205    #[test]
3206    fn iter() {
3207        let b = BitVec::with_capacity(10);
3208        let _a: Iter = b.iter();
3209    }
3210
3211    #[cfg(feature = "serde")]
3212    #[test]
3213    fn test_serialization() {
3214        let bit_vec: BitVec = BitVec::new();
3215        let serialized = serde_json::to_string(&bit_vec).unwrap();
3216        let unserialized: BitVec = serde_json::from_str(&serialized).unwrap();
3217        assert_eq!(bit_vec, unserialized);
3218
3219        let bools = vec![true, false, true, true];
3220        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
3221        let serialized = serde_json::to_string(&bit_vec).unwrap();
3222        let unserialized = serde_json::from_str(&serialized).unwrap();
3223        assert_eq!(bit_vec, unserialized);
3224    }
3225
3226    #[cfg(feature = "miniserde")]
3227    #[test]
3228    fn test_miniserde_serialization() {
3229        let bit_vec: BitVec = BitVec::new();
3230        let serialized = miniserde::json::to_string(&bit_vec);
3231        let unserialized: BitVec = miniserde::json::from_str(&serialized[..]).unwrap();
3232        assert_eq!(bit_vec, unserialized);
3233
3234        let bools = vec![true, false, true, true];
3235        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
3236        let serialized = miniserde::json::to_string(&bit_vec);
3237        let unserialized = miniserde::json::from_str(&serialized[..]).unwrap();
3238        assert_eq!(bit_vec, unserialized);
3239    }
3240
3241    #[cfg(feature = "nanoserde")]
3242    #[test]
3243    fn test_nanoserde_json_serialization() {
3244        use nanoserde::{DeJson, SerJson};
3245
3246        let bit_vec: BitVec = BitVec::new();
3247        let serialized = bit_vec.serialize_json();
3248        let unserialized: BitVec = BitVec::deserialize_json(&serialized[..]).unwrap();
3249        assert_eq!(bit_vec, unserialized);
3250
3251        let bools = vec![true, false, true, true];
3252        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
3253        let serialized = bit_vec.serialize_json();
3254        let unserialized = BitVec::deserialize_json(&serialized[..]).unwrap();
3255        assert_eq!(bit_vec, unserialized);
3256    }
3257
3258    #[cfg(feature = "borsh")]
3259    #[test]
3260    fn test_borsh_serialization() {
3261        let bit_vec: BitVec = BitVec::new();
3262        let serialized = borsh::to_vec(&bit_vec).unwrap();
3263        let unserialized: BitVec = borsh::from_slice(&serialized[..]).unwrap();
3264        assert_eq!(bit_vec, unserialized);
3265
3266        let bools = vec![true, false, true, true];
3267        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
3268        let serialized = borsh::to_vec(&bit_vec).unwrap();
3269        let unserialized = borsh::from_slice(&serialized[..]).unwrap();
3270        assert_eq!(bit_vec, unserialized);
3271    }
3272
3273    #[test]
3274    fn test_bit_vec_unaligned_small_append() {
3275        let mut a = BitVec::from_elem(8, false);
3276        a.set(7, true);
3277
3278        let mut b = BitVec::from_elem(16, false);
3279        b.set(14, true);
3280
3281        let mut c = BitVec::from_elem(8, false);
3282        c.set(6, true);
3283        c.set(7, true);
3284
3285        a.append(&mut b);
3286        a.append(&mut c);
3287
3288        assert_eq!(&[1, 0, 2, 3][..], &*a.to_bytes());
3289    }
3290
3291    #[test]
3292    fn test_bit_vec_unaligned_large_append() {
3293        let mut a = BitVec::from_elem(48, false);
3294        a.set(47, true);
3295
3296        let mut b = BitVec::from_elem(48, false);
3297        b.set(46, true);
3298
3299        let mut c = BitVec::from_elem(48, false);
3300        c.set(46, true);
3301        c.set(47, true);
3302
3303        a.append(&mut b);
3304        a.append(&mut c);
3305
3306        assert_eq!(
3307            &[
3308                0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
3309                0x00, 0x00, 0x00, 0x03
3310            ][..],
3311            &*a.to_bytes()
3312        );
3313    }
3314
3315    #[test]
3316    fn test_bit_vec_append_aligned_to_unaligned() {
3317        let mut a = BitVec::from_elem(2, true);
3318        let mut b = BitVec::from_elem(32, false);
3319        let mut c = BitVec::from_elem(8, true);
3320        a.append(&mut b);
3321        a.append(&mut c);
3322        assert_eq!(&[0xc0, 0x00, 0x00, 0x00, 0x3f, 0xc0][..], &*a.to_bytes());
3323    }
3324
3325    #[test]
3326    fn test_count_ones() {
3327        for i in 0..1000 {
3328            let mut t = BitVec::from_elem(i, true);
3329            let mut f = BitVec::from_elem(i, false);
3330            assert_eq!(i as u64, t.count_ones());
3331            assert_eq!(0_u64, f.count_ones());
3332            if i > 20 {
3333                t.set(10, false);
3334                t.set(i - 10, false);
3335                assert_eq!(i - 2, t.count_ones() as usize);
3336                f.set(10, true);
3337                f.set(i - 10, true);
3338                assert_eq!(2, f.count_ones());
3339            }
3340        }
3341    }
3342
3343    #[test]
3344    fn test_count_zeros() {
3345        for i in 0..1000 {
3346            let mut tbits = BitVec::from_elem(i, true);
3347            let mut fbits = BitVec::from_elem(i, false);
3348            assert_eq!(i as u64, fbits.count_zeros());
3349            assert_eq!(0_u64, tbits.count_zeros());
3350            if i > 20 {
3351                fbits.set(10, true);
3352                fbits.set(i - 10, true);
3353                assert_eq!(i - 2, fbits.count_zeros() as usize);
3354                tbits.set(10, false);
3355                tbits.set(i - 10, false);
3356                assert_eq!(2, tbits.count_zeros());
3357            }
3358        }
3359    }
3360
3361    #[test]
3362    fn test_get_mut() {
3363        let mut a = BitVec::from_elem(3, false);
3364        let mut a_bit_1 = a.get_mut(1).unwrap();
3365        assert!(!*a_bit_1);
3366        *a_bit_1 = true;
3367        drop(a_bit_1);
3368        assert!(a.eq_vec(&[false, true, false]));
3369    }
3370    #[test]
3371    fn test_iter_mut() {
3372        let mut a = BitVec::from_elem(8, false);
3373        a.iter_mut().enumerate().for_each(|(index, mut bit)| {
3374            *bit = index % 2 == 1;
3375        });
3376        assert!(a.eq_vec(&[false, true, false, true, false, true, false, true]));
3377    }
3378
3379    #[test]
3380    fn test_insert_at_zero() {
3381        let mut v = BitVec::new();
3382
3383        v.insert(0, false);
3384        v.insert(0, true);
3385        v.insert(0, false);
3386        v.insert(0, true);
3387        v.insert(0, false);
3388        v.insert(0, true);
3389
3390        assert_eq!(v.len(), 6);
3391        assert_eq!(v.storage().len(), 1);
3392        assert!(v.eq_vec(&[true, false, true, false, true, false]));
3393    }
3394
3395    #[test]
3396    fn test_insert_at_end() {
3397        let mut v = BitVec::new();
3398
3399        v.insert(v.len(), true);
3400        v.insert(v.len(), false);
3401        v.insert(v.len(), true);
3402        v.insert(v.len(), false);
3403        v.insert(v.len(), true);
3404        v.insert(v.len(), false);
3405
3406        assert_eq!(v.storage().len(), 1);
3407        assert_eq!(v.len(), 6);
3408        assert!(v.eq_vec(&[true, false, true, false, true, false]));
3409    }
3410
3411    #[test]
3412    fn test_insert_at_block_boundaries() {
3413        let mut v = BitVec::from_elem(32, false);
3414
3415        assert_eq!(v.storage().len(), 1);
3416
3417        v.insert(31, true);
3418
3419        assert_eq!(v.len(), 33);
3420
3421        assert!(matches!(v.get(31), Some(true)));
3422        assert!(v.eq_vec(&[
3423            false, false, false, false, false, false, false, false, false, false, false, false,
3424            false, false, false, false, false, false, false, false, false, false, false, false,
3425            false, false, false, false, false, false, false, true, false
3426        ]));
3427
3428        assert_eq!(v.storage().len(), 2);
3429    }
3430
3431    #[test]
3432    fn test_insert_at_block_boundaries_1() {
3433        let mut v = BitVec::from_elem(64, false);
3434
3435        assert_eq!(v.storage().len(), 2);
3436
3437        v.insert(63, true);
3438
3439        assert_eq!(v.len(), 65);
3440
3441        assert!(matches!(v.get(63), Some(true)));
3442        assert!(v.eq_vec(&[
3443            false, false, false, false, false, false, false, false, false, false, false, false,
3444            false, false, false, false, false, false, false, false, false, false, false, false,
3445            false, false, false, false, false, false, false, false, false, false, false, false,
3446            false, false, false, false, false, false, false, false, false, false, false, false,
3447            false, false, false, false, false, false, false, false, false, false, false, false,
3448            false, false, false, true, false
3449        ]));
3450
3451        assert_eq!(v.storage().len(), 3);
3452    }
3453
3454    #[test]
3455    fn test_push_within_capacity_with_suffice_cap() {
3456        let mut v = BitVec::from_elem(16, true);
3457
3458        assert!(v.push_within_capacity(false).is_ok());
3459
3460        for i in 0..16 {
3461            assert_eq!(v.get(i), Some(true));
3462        }
3463
3464        assert_eq!(v.get(16), Some(false));
3465        assert_eq!(v.len(), 17);
3466    }
3467
3468    #[test]
3469    fn test_push_within_capacity_at_brink() {
3470        let mut v = BitVec::from_elem(31, true);
3471
3472        assert!(v.push_within_capacity(false).is_ok());
3473
3474        assert_eq!(v.get(31), Some(false));
3475        assert_eq!(v.len(), v.capacity());
3476        assert_eq!(v.len(), 32);
3477
3478        assert_eq!(v.push_within_capacity(false), Err(false));
3479        assert_eq!(v.capacity(), 32);
3480
3481        for i in 0..31 {
3482            assert_eq!(v.get(i), Some(true));
3483        }
3484        assert_eq!(v.get(31), Some(false));
3485    }
3486
3487    #[test]
3488    fn test_push_within_capacity_at_brink_with_mul_blocks() {
3489        let mut v = BitVec::from_elem(95, true);
3490
3491        assert!(v.push_within_capacity(false).is_ok());
3492
3493        assert_eq!(v.get(95), Some(false));
3494        assert_eq!(v.len(), v.capacity());
3495        assert_eq!(v.len(), 96);
3496
3497        assert_eq!(v.push_within_capacity(false), Err(false));
3498        assert_eq!(v.capacity(), 96);
3499
3500        for i in 0..95 {
3501            assert_eq!(v.get(i), Some(true));
3502        }
3503        assert_eq!(v.get(95), Some(false));
3504    }
3505
3506    #[test]
3507    fn test_push_within_capacity_storage_push() {
3508        let mut v = BitVec::with_capacity(64);
3509
3510        for _ in 0..32 {
3511            v.push(true);
3512        }
3513
3514        assert_eq!(v.len(), 32);
3515
3516        assert!(v.push_within_capacity(false).is_ok());
3517
3518        assert_eq!(v.len(), 33);
3519
3520        for i in 0..32 {
3521            assert_eq!(v.get(i), Some(true));
3522        }
3523        assert_eq!(v.get(32), Some(false));
3524    }
3525
3526    #[test]
3527    fn test_insert_remove() {
3528        // two primes for no common divisors with 32
3529        let mut v = BitVec::from_fn(1024, |i| i % 11 < 7);
3530        for i in 0..1024 {
3531            let result = v.remove(i);
3532            v.insert(i, result);
3533            assert_eq!(result, i % 11 < 7);
3534        }
3535
3536        for i in 0..1024 {
3537            v.insert(i, false);
3538            v.remove(i);
3539        }
3540
3541        for i in 0..1024 {
3542            v.insert(i, true);
3543            v.remove(i);
3544        }
3545
3546        for (i, result) in v.into_iter().enumerate() {
3547            assert_eq!(result, i % 11 < 7);
3548        }
3549    }
3550
3551    #[test]
3552    fn test_remove_last() {
3553        let mut v = BitVec::from_fn(1025, |i| i % 11 < 7);
3554        assert_eq!(v.len(), 1025);
3555        assert_eq!(v.remove(1024), 1024 % 11 < 7);
3556        assert_eq!(v.len(), 1024);
3557        assert_eq!(v.storage().len(), 1024 / 32);
3558    }
3559
3560    #[test]
3561    fn test_remove_all() {
3562        let v = BitVec::from_elem(1024, false);
3563        for _ in 0..1024 {
3564            let mut v2 = v.clone();
3565            v2.remove_all();
3566            assert_eq!(v2.len(), 0);
3567            assert_eq!(v2.get(0), None);
3568            assert_eq!(v2, BitVec::new());
3569        }
3570    }
3571}