Skip to main content

probabilistic_collections/
bit_vec.rs

1//! Growable list of bits.
2
3#[cfg(feature = "serde")]
4use serde_crate::{Deserialize, Serialize};
5use std::mem;
6use std::ops::{Index, Range};
7use std::slice;
8
9/// A growable list of bits implemented using a `Vec<u8>`
10///
11/// # Examples
12///
13///
14/// ```
15/// use probabilistic_collections::bit_vec::BitVec;
16///
17/// let mut bv = BitVec::from_elem(5, false);
18///
19/// bv.set(0, true);
20/// bv.set(1, true);
21/// bv.set(2, true);
22/// assert_eq!(
23///     bv.iter().collect::<Vec<bool>>(),
24///     vec![true, true, true, false, false],
25/// );
26///
27/// bv.set_all(true);
28/// assert_eq!(
29///     bv.iter().collect::<Vec<bool>>(),
30///     vec![true, true, true, true, true],
31/// );
32///
33/// bv.flip(0);
34/// bv.flip_all();
35/// assert_eq!(
36///     bv.iter().collect::<Vec<bool>>(),
37///     vec![true, false, false, false, false],
38/// );
39///
40/// bv.push(true);
41/// assert_eq!(
42///     bv.iter().collect::<Vec<bool>>(),
43///     vec![true, false, false, false, false, true],
44/// );
45/// assert_eq!(bv.pop(), Some(true));
46///
47/// let clone = bv.clone();
48/// bv.flip_all();
49/// bv.union(&clone);
50/// assert_eq!(
51///     bv.iter().collect::<Vec<bool>>(),
52///     vec![true, true, true, true, true],
53/// );
54/// ```
55#[derive(Debug, PartialEq)]
56#[cfg_attr(
57    feature = "serde",
58    derive(Deserialize, Serialize),
59    serde(crate = "serde_crate")
60)]
61pub struct BitVec {
62    blocks: Vec<u8>,
63    len: usize,
64    one_count: usize,
65}
66
67const BLOCK_BIT_COUNT: usize = mem::size_of::<u8>() * 8;
68
69impl BitVec {
70    fn get_block_count(len: usize) -> usize {
71        (len + BLOCK_BIT_COUNT - 1) / BLOCK_BIT_COUNT
72    }
73
74    fn reverse_byte(byte: u8) -> u8 {
75        let mut ret = 0;
76        for i in 0..BLOCK_BIT_COUNT {
77            ret |= (byte >> i & 1) << (BLOCK_BIT_COUNT - i - 1);
78        }
79        ret
80    }
81
82    fn clear_extra_bits(&mut self) {
83        let extra_bits = self.len() % BLOCK_BIT_COUNT;
84        if extra_bits > 0 {
85            let mask = (1 << extra_bits) - 1;
86            let blocks_len = self.blocks.len();
87            let block = &mut self.blocks[blocks_len - 1];
88            *block &= mask;
89        }
90    }
91
92    /// Constructs a new `BitVec` with a certain number of bits. All bits are initialized to false.
93    ///
94    /// # Examples
95    ///
96    /// ```
97    /// use probabilistic_collections::bit_vec::BitVec;
98    ///
99    /// let bv = BitVec::new(5);
100    /// assert_eq!(
101    ///     bv.iter().collect::<Vec<bool>>(),
102    ///     vec![false, false, false, false, false],
103    /// );
104    /// ```
105    pub fn new(len: usize) -> Self {
106        Self {
107            blocks: vec![0; Self::get_block_count(len)],
108            len,
109            one_count: 0,
110        }
111    }
112
113    /// Constructs a new `BitVec` with a certain number of bits. All bits are initialized to `bit`.
114    ///
115    /// # Examples
116    ///
117    /// ```
118    /// use probabilistic_collections::bit_vec::BitVec;
119    ///
120    /// let bv = BitVec::from_elem(5, true);
121    /// assert_eq!(
122    ///     bv.iter().collect::<Vec<bool>>(),
123    ///     vec![true, true, true, true, true],
124    /// );
125    /// ```
126    pub fn from_elem(len: usize, bit: bool) -> Self {
127        let mut ret = BitVec {
128            blocks: vec![if bit { <u8>::max_value() } else { 0 }; Self::get_block_count(len)],
129            len,
130            one_count: if bit { len } else { 0 },
131        };
132        ret.clear_extra_bits();
133        ret
134    }
135
136    /// Constructs a `BitVec` from a byte slice. Each byte becomes eight bits, with the most
137    /// signficant bits of each byte coming first.
138    ///
139    /// # Examples
140    ///
141    /// ```
142    /// use probabilistic_collections::bit_vec::BitVec;
143    ///
144    /// let bv = BitVec::from_bytes(&[0b11010000]);
145    /// assert_eq!(
146    ///     bv.iter().collect::<Vec<bool>>(),
147    ///     vec![true, true, false, true, false, false, false, false],
148    /// );
149    /// ```
150    pub fn from_bytes(bytes: &[u8]) -> Self {
151        let len = bytes.len() * BLOCK_BIT_COUNT;
152        BitVec {
153            blocks: bytes
154                .to_vec()
155                .iter()
156                .map(|byte| Self::reverse_byte(*byte))
157                .collect(),
158            len,
159            one_count: bytes
160                .to_vec()
161                .iter()
162                .map(|byte| byte.count_ones() as usize)
163                .sum(),
164        }
165    }
166
167    /// Returns the byte-vec representation of the `BitVec` with the first bit in the `BitVec`
168    /// becoming the high-order bit of the first byte.
169    ///
170    /// # Examples
171    ///
172    /// ```
173    /// use probabilistic_collections::bit_vec::BitVec;
174    ///
175    /// let mut bv = BitVec::new(8);
176    ///
177    /// bv.set(0, true);
178    /// bv.set(1, true);
179    /// bv.set(3, true);
180    ///
181    /// assert_eq!(bv.to_bytes(), vec![0b11010000]);
182    /// ```
183    pub fn to_bytes(&self) -> Vec<u8> {
184        self.blocks
185            .iter()
186            .map(|byte| Self::reverse_byte(*byte))
187            .collect()
188    }
189
190    /// Constructs a new, empty `BitVec` with a certain capacity.
191    ///
192    /// # Examples
193    ///
194    /// ```
195    /// use probabilistic_collections::bit_vec::BitVec;
196    ///
197    /// let bv = BitVec::with_capacity(5);
198    /// ```
199    pub fn with_capacity(len: usize) -> Self {
200        BitVec {
201            blocks: Vec::with_capacity(Self::get_block_count(len)),
202            len: 0,
203            one_count: 0,
204        }
205    }
206
207    /// Sets the value at index `index` to `bit`.
208    ///
209    /// # Panics
210    ///
211    /// Panics if attempt to set an index out-of-bounds.
212    ///
213    /// # Examples
214    ///
215    /// ```
216    /// use probabilistic_collections::bit_vec::BitVec;
217    ///
218    /// let mut bv = BitVec::new(5);
219    /// bv.set(1, true);
220    ///
221    /// assert_eq!(bv.get(0), Some(false));
222    /// assert_eq!(bv.get(1), Some(true));
223    /// ```
224    pub fn set(&mut self, index: usize, bit: bool) {
225        assert!(index < self.len);
226        let block_index = index / BLOCK_BIT_COUNT;
227        let bit_index = index % BLOCK_BIT_COUNT;
228        let mask = 1 << bit_index;
229        let prev = ((self.blocks[block_index] >> bit_index) & 1) != 0;
230        if bit {
231            if !prev {
232                self.one_count += 1;
233            }
234            self.blocks[block_index] |= mask;
235        } else {
236            if prev {
237                self.one_count -= 1;
238            }
239            self.blocks[block_index] &= !mask;
240        }
241    }
242
243    /// Returns the value at index `index`, or `None` if index is out of bounds.
244    ///
245    /// # Examples
246    ///
247    /// ```
248    /// use probabilistic_collections::bit_vec::BitVec;
249    ///
250    /// let mut bv = BitVec::new(5);
251    /// bv.set(1, true);
252    ///
253    /// assert_eq!(bv.get(0), Some(false));
254    /// assert_eq!(bv.get(1), Some(true));
255    /// ```
256    pub fn get(&self, index: usize) -> Option<bool> {
257        if index >= self.len {
258            None
259        } else {
260            let block_index = index / BLOCK_BIT_COUNT;
261            let bit_index = index % BLOCK_BIT_COUNT;
262            self.blocks
263                .get(block_index)
264                .map(|block| ((block >> bit_index) & 1) != 0)
265        }
266    }
267
268    /// Sets all values in the `BitVec` to `bit`.
269    ///
270    /// # Panics
271    ///
272    /// Panics if attempting to set a bit out-of-bounds.
273    ///
274    /// # Examples
275    ///
276    /// ```
277    /// use probabilistic_collections::bit_vec::BitVec;
278    ///
279    /// let mut bv = BitVec::from_elem(5, false);
280    /// bv.set_all(true);
281    ///
282    /// assert_eq!(
283    ///     bv.iter().collect::<Vec<bool>>(),
284    ///     vec![true, true, true, true, true],
285    /// );
286    /// ```
287    pub fn set_all(&mut self, bit: bool) {
288        let mask;
289        if bit {
290            mask = !0;
291            self.one_count = self.len;
292        } else {
293            mask = 0;
294            self.one_count = 0;
295        }
296        for block in &mut self.blocks {
297            *block = mask;
298        }
299        self.clear_extra_bits();
300    }
301
302    /// Flip the value at index `index`.
303    ///
304    /// # Panics
305    ///
306    /// Panics if attempt to flip an index out-of-bounds.
307    ///
308    /// # Examples
309    ///
310    /// ```
311    /// use probabilistic_collections::bit_vec::BitVec;
312    ///
313    /// let mut bv = BitVec::from_elem(5, false);
314    ///
315    /// bv.flip(0);
316    /// assert_eq!(bv.get(0), Some(true));
317    ///
318    /// bv.flip(1);
319    /// assert_eq!(bv.get(0), Some(true));
320    /// ```
321    pub fn flip(&mut self, index: usize) {
322        assert!(index < self.len);
323        let block_index = index / BLOCK_BIT_COUNT;
324        let bit_index = index % BLOCK_BIT_COUNT;
325        let mask = 1 << bit_index;
326        if (self.blocks[block_index] >> bit_index) & 1 == 0 {
327            self.one_count += 1;
328            self.blocks[block_index] |= mask;
329        } else {
330            self.one_count -= 1;
331            self.blocks[block_index] &= !mask;
332        }
333    }
334
335    /// Flips all values in the `BitVec`.
336    ///
337    /// # Examples
338    ///
339    /// ```
340    /// use probabilistic_collections::bit_vec::BitVec;
341    ///
342    /// let mut bv = BitVec::from_elem(5, false);
343    ///
344    /// bv.flip_all();
345    /// assert_eq!(
346    ///     bv.iter().collect::<Vec<bool>>(),
347    ///     vec![true, true, true, true, true],
348    /// );
349    ///
350    /// bv.flip_all();
351    /// assert_eq!(
352    ///     bv.iter().collect::<Vec<bool>>(),
353    ///     vec![false, false, false, false, false],
354    /// );
355    /// ```
356    pub fn flip_all(&mut self) {
357        self.one_count = self.len - self.one_count;
358        for block in &mut self.blocks {
359            *block = !*block;
360        }
361    }
362
363    fn apply<F>(&mut self, other: &BitVec, mut op: F)
364    where
365        F: FnMut(u8, u8) -> u8,
366    {
367        assert_eq!(self.len(), other.len());
368        assert_eq!(self.blocks.len(), other.blocks.len());
369        for (x, y) in self.blocks_mut().zip(other.blocks()) {
370            *x = op(*x, y);
371        }
372        self.one_count = 0;
373        for index in 0..self.blocks.len() {
374            if index == self.blocks.len() - 1 && self.len() % BLOCK_BIT_COUNT != 0 {
375                let shift = BLOCK_BIT_COUNT - self.len() % BLOCK_BIT_COUNT;
376                self.one_count += (self.blocks[index] << shift).count_ones() as usize;
377            } else {
378                self.one_count += self.blocks[index].count_ones() as usize;
379            }
380        }
381    }
382
383    /// Sets `self` to the union of `self` and `other`.
384    ///
385    /// # Panics
386    ///
387    /// Panics if the two `BitVec` are of different lengths.
388    ///
389    /// # Examples
390    ///
391    /// ```
392    /// use probabilistic_collections::bit_vec::BitVec;
393    ///
394    /// let mut bv1 = BitVec::new(4);
395    /// bv1.set(0, true);
396    /// bv1.set(1, true);
397    ///
398    /// let mut bv2 = BitVec::new(4);
399    /// bv2.set(0, true);
400    /// bv2.set(2, true);
401    ///
402    /// bv1.union(&bv2);
403    /// assert_eq!(
404    ///     bv1.iter().collect::<Vec<bool>>(),
405    ///     vec![true, true, true, false],
406    /// );
407    /// ```
408    pub fn union(&mut self, other: &Self) {
409        self.apply(other, |x, y| x | y)
410    }
411
412    /// Sets `self` to the intersection of `self` and `other`.
413    ///
414    /// # Panics
415    ///
416    /// Panics if the two `BitVec` are of different lengths.
417    ///
418    /// # Examples
419    ///
420    /// ```
421    /// use probabilistic_collections::bit_vec::BitVec;
422    ///
423    /// let mut bv1 = BitVec::new(4);
424    /// bv1.set(0, true);
425    /// bv1.set(1, true);
426    ///
427    /// let mut bv2 = BitVec::new(4);
428    /// bv2.set(0, true);
429    /// bv2.set(2, true);
430    ///
431    /// bv1.intersection(&bv2);
432    /// assert_eq!(
433    ///     bv1.iter().collect::<Vec<bool>>(),
434    ///     vec![true, false, false, false],
435    /// );
436    /// ```
437    pub fn intersection(&mut self, other: &Self) {
438        self.apply(other, |x, y| x & y)
439    }
440
441    /// Sets `self` to the difference of `self` and `other`.
442    ///
443    /// # Panics
444    ///
445    /// Panics if the two `BitVec` are of different lengths.
446    ///
447    /// # Examples
448    ///
449    /// ```
450    /// use probabilistic_collections::bit_vec::BitVec;
451    ///
452    /// let mut bv1 = BitVec::new(4);
453    /// bv1.set(0, true);
454    /// bv1.set(1, true);
455    ///
456    /// let mut bv2 = BitVec::new(4);
457    /// bv2.set(0, true);
458    /// bv2.set(2, true);
459    ///
460    /// bv1.difference(&bv2);
461    /// assert_eq!(
462    ///     bv1.iter().collect::<Vec<bool>>(),
463    ///     vec![false, true, false, false],
464    /// );
465    /// ```
466    pub fn difference(&mut self, other: &Self) {
467        self.apply(other, |x, y| x & !y)
468    }
469
470    /// Sets `self` to the symmetric difference of `self` and `other`.
471    ///
472    /// # Panics
473    ///
474    /// Panics if the two `BitVec` are of different lengths.
475    ///
476    /// # Examples
477    ///
478    /// ```
479    /// use probabilistic_collections::bit_vec::BitVec;
480    ///
481    /// let mut bv1 = BitVec::new(4);
482    /// bv1.set(0, true);
483    /// bv1.set(1, true);
484    ///
485    /// let mut bv2 = BitVec::new(4);
486    /// bv2.set(0, true);
487    /// bv2.set(2, true);
488    ///
489    /// bv1.symmetric_difference(&bv2);
490    /// assert_eq!(
491    ///     bv1.iter().collect::<Vec<bool>>(),
492    ///     vec![false, true, true, false],
493    /// );
494    /// ```
495    pub fn symmetric_difference(&mut self, other: &Self) {
496        self.apply(other, |x, y| (x & !y) | (!x & y))
497    }
498
499    /// Truncates a `BitVec`, dropping excess elements.
500    ///
501    /// # Examples
502    ///
503    /// ```
504    /// use probabilistic_collections::bit_vec::BitVec;
505    ///
506    /// let mut bv = BitVec::from_elem(5, false);
507    ///
508    /// bv.truncate(2);
509    /// assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![false, false]);
510    /// ```
511    pub fn truncate(&mut self, len: usize) {
512        if len < self.len {
513            self.len = len;
514            self.blocks.truncate(Self::get_block_count(len));
515            self.clear_extra_bits();
516        }
517    }
518
519    /// Reserves capacity for at least `additional` more bits to be inserted in the given
520    /// `BitVec`.
521    ///
522    /// # Examples
523    ///
524    ///
525    /// ```
526    /// use probabilistic_collections::bit_vec::BitVec;
527    ///
528    /// let mut bv = BitVec::from_elem(5, false);
529    ///
530    /// bv.reserve(10);
531    /// assert_eq!(bv.len(), 5);
532    /// assert!(bv.capacity() >= 16);
533    /// ```
534    pub fn reserve(&mut self, additional: usize) {
535        let desired_cap = self.len + additional;
536        if desired_cap > self.capacity() {
537            let additional_blocks = Self::get_block_count(desired_cap) - self.blocks.len();
538            self.blocks.reserve(additional_blocks);
539        }
540    }
541
542    /// Reserves capacity for exactly `additional` more bits to be inserted in the given
543    /// `BitVec`.
544    ///
545    /// # Examples
546    ///
547    ///
548    /// ```
549    /// use probabilistic_collections::bit_vec::BitVec;
550    ///
551    /// let mut bv = BitVec::from_elem(5, false);
552    /// bv.reserve_exact(10);
553    /// assert_eq!(bv.len(), 5);
554    /// assert_eq!(bv.capacity(), 16);
555    /// ```
556    pub fn reserve_exact(&mut self, additional: usize) {
557        let desired_cap = self.len + additional;
558        if desired_cap > self.capacity() {
559            let additional_blocks = Self::get_block_count(desired_cap) - self.blocks.len();
560            self.blocks.reserve_exact(additional_blocks);
561        }
562    }
563
564    /// Returns and removes the last element of the `BitVec`. Returns `None` if the `BitVec` is
565    /// empty.
566    ///
567    /// # Examples
568    ///
569    /// ```
570    /// use probabilistic_collections::bit_vec::BitVec;
571    ///
572    /// let mut bv = BitVec::from_elem(1, false);
573    ///
574    /// assert_eq!(bv.pop(), Some(false));
575    /// assert_eq!(bv.pop(), None);
576    /// ```
577    pub fn pop(&mut self) -> Option<bool> {
578        if self.is_empty() {
579            None
580        } else {
581            let index = self.len - 1;
582            let ret = self.get(index);
583            self.set(index, false);
584            self.len -= 1;
585            if self.len % BLOCK_BIT_COUNT == 0 {
586                self.blocks.pop();
587            }
588            ret
589        }
590    }
591
592    /// Pushes an element into the `BitVec`.
593    ///
594    /// # Examples
595    ///
596    /// ```
597    /// use probabilistic_collections::bit_vec::BitVec;
598    ///
599    /// let mut bv = BitVec::from_elem(1, false);
600    ///
601    /// bv.push(true);
602    /// assert_eq!(bv.get(1), Some(true));
603    /// ```
604    pub fn push(&mut self, bit: bool) {
605        if self.len % BLOCK_BIT_COUNT == 0 {
606            self.blocks.push(0);
607        }
608        let index = self.len;
609        self.len += 1;
610        self.set(index, bit);
611    }
612
613    fn blocks(&self) -> Blocks<'_> {
614        Blocks {
615            iter: self.blocks.iter(),
616        }
617    }
618
619    fn blocks_mut(&mut self) -> BlocksMut<'_> {
620        self.blocks.iter_mut()
621    }
622
623    /// Returns an iterator over the elements of the vector in order.
624    ///
625    /// # Examples
626    ///
627    /// ```
628    /// use probabilistic_collections::bit_vec::BitVec;
629    ///
630    /// let mut bv = BitVec::from_elem(1, false);
631    ///
632    /// bv.push(true);
633    /// assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![false, true]);
634    /// ```
635    pub fn iter(&self) -> BitVecIter<'_> {
636        BitVecIter {
637            bit_vec: self,
638            range: 0..self.len,
639        }
640    }
641
642    /// Returns `true` if the `BitVec` is empty.
643    ///
644    /// # Examples
645    ///
646    /// ```
647    /// use probabilistic_collections::bit_vec::BitVec;
648    ///
649    /// let mut bv = BitVec::from_elem(1, false);
650    ///
651    /// assert!(!bv.is_empty());
652    /// bv.pop();
653    /// assert!(bv.is_empty());
654    /// ```
655    pub fn is_empty(&self) -> bool {
656        self.len == 0
657    }
658
659    /// Returns the number of elements in the `BitVec`.
660    ///
661    /// # Examples
662    ///
663    /// ```
664    /// use probabilistic_collections::bit_vec::BitVec;
665    ///
666    /// let mut bv = BitVec::from_elem(1, false);
667    ///
668    /// assert_eq!(bv.len(), 1);
669    /// bv.pop();
670    /// assert_eq!(bv.len(), 0);
671    /// ```
672    pub fn len(&self) -> usize {
673        self.len
674    }
675
676    /// Returns the capacity of the `BitVec`.
677    ///
678    /// # Examples
679    ///
680    /// ```
681    /// use probabilistic_collections::bit_vec::BitVec;
682    ///
683    /// let mut bv = BitVec::new(0);
684    ///
685    /// bv.reserve_exact(10);
686    /// assert_eq!(bv.capacity(), 16);
687    /// ```
688    pub fn capacity(&self) -> usize {
689        self.blocks.capacity() * BLOCK_BIT_COUNT
690    }
691
692    /// Returns the number of set bits in the `BitVec`.
693    ///
694    /// # Examples
695    ///
696    /// ```
697    /// use probabilistic_collections::bit_vec::BitVec;
698    ///
699    /// let bv = BitVec::from_bytes(&[0b11010000]);
700    /// assert_eq!(bv.count_ones(), 3);
701    /// ```
702    pub fn count_ones(&self) -> usize {
703        self.one_count
704    }
705
706    /// Returns the number of unset bits in the `BitVec`.
707    ///
708    /// # Examples
709    ///
710    /// ```
711    /// use probabilistic_collections::bit_vec::BitVec;
712    ///
713    /// let bv = BitVec::from_bytes(&[0b11010000]);
714    /// assert_eq!(bv.count_zeros(), 5);
715    /// ```
716    pub fn count_zeros(&self) -> usize {
717        self.len - self.one_count
718    }
719}
720
721impl Clone for BitVec {
722    fn clone(&self) -> Self {
723        BitVec {
724            blocks: self.blocks.clone(),
725            len: self.len,
726            one_count: self.one_count,
727        }
728    }
729
730    fn clone_from(&mut self, source: &Self) {
731        self.len = source.len;
732        self.blocks.clone_from(&source.blocks);
733    }
734}
735
736/// An owning iterator for `BitVec`.
737///
738/// This iterator yields bits in order.
739pub struct BitVecIter<'a> {
740    bit_vec: &'a BitVec,
741    range: Range<usize>,
742}
743
744impl<'a> Iterator for BitVecIter<'a> {
745    type Item = bool;
746
747    fn next(&mut self) -> Option<bool> {
748        self.range
749            .next()
750            .map(|index| self.bit_vec.get(index).unwrap())
751    }
752}
753
754impl<'a> IntoIterator for &'a BitVec {
755    type IntoIter = BitVecIter<'a>;
756    type Item = bool;
757
758    fn into_iter(self) -> Self::IntoIter {
759        self.iter()
760    }
761}
762
763/// An iterator for `BitVec`.
764///
765/// This iterator yields bits in order.
766pub struct BitVecIntoIter {
767    bit_vec: BitVec,
768    range: Range<usize>,
769}
770
771impl Iterator for BitVecIntoIter {
772    type Item = bool;
773
774    fn next(&mut self) -> Option<bool> {
775        self.range
776            .next()
777            .map(|index| self.bit_vec.get(index).unwrap())
778    }
779}
780
781impl IntoIterator for BitVec {
782    type IntoIter = BitVecIntoIter;
783    type Item = bool;
784
785    fn into_iter(self) -> Self::IntoIter {
786        let len = self.len;
787        Self::IntoIter {
788            bit_vec: self,
789            range: 0..len,
790        }
791    }
792}
793
794type BlocksMut<'a> = slice::IterMut<'a, u8>;
795
796struct Blocks<'a> {
797    iter: slice::Iter<'a, u8>,
798}
799
800impl<'a> Iterator for Blocks<'a> {
801    type Item = u8;
802
803    fn next(&mut self) -> Option<u8> {
804        self.iter.next().cloned()
805    }
806}
807
808static TRUE: bool = true;
809static FALSE: bool = false;
810
811impl Index<usize> for BitVec {
812    type Output = bool;
813
814    fn index(&self, index: usize) -> &bool {
815        if self.get(index).expect("Error: index out of bounds.") {
816            &TRUE
817        } else {
818            &FALSE
819        }
820    }
821}
822
823#[cfg(test)]
824mod tests {
825    use super::BitVec;
826
827    #[test]
828    fn test_new() {
829        let bv = BitVec::new(5);
830        assert_eq!(
831            bv.iter().collect::<Vec<bool>>(),
832            vec![false, false, false, false, false]
833        );
834        assert_eq!(bv.count_ones(), 0);
835        assert_eq!(bv.count_zeros(), 5);
836    }
837
838    #[test]
839    fn test_from_elem() {
840        let bv = BitVec::from_elem(5, true);
841        assert_eq!(
842            bv.iter().collect::<Vec<bool>>(),
843            vec![true, true, true, true, true]
844        );
845        assert_eq!(bv.count_ones(), 5);
846        assert_eq!(bv.count_zeros(), 0);
847    }
848
849    #[test]
850    fn test_from_bytes() {
851        let bv = BitVec::from_bytes(&[0b1101_0000]);
852        assert_eq!(
853            bv.iter().collect::<Vec<bool>>(),
854            vec![true, true, false, true, false, false, false, false],
855        );
856        assert_eq!(bv.count_ones(), 3);
857        assert_eq!(bv.count_zeros(), 5);
858    }
859
860    #[test]
861    fn test_to_bytes() {
862        let mut bv = BitVec::new(8);
863        bv.set(0, true);
864        bv.set(1, true);
865        bv.set(3, true);
866
867        assert_eq!(bv.to_bytes(), vec![0b1101_0000]);
868    }
869
870    #[test]
871    fn test_with_capacity() {
872        let bv = BitVec::with_capacity(10);
873
874        assert_eq!(bv.capacity(), 16);
875        assert_eq!(bv.count_ones(), 0);
876        assert_eq!(bv.count_zeros(), 0);
877    }
878
879    #[test]
880    fn test_set_get() {
881        let mut bv = BitVec::new(2);
882        bv.set(0, true);
883        bv.set(1, false);
884
885        assert_eq!(bv[0], true);
886        assert_eq!(bv[1], false);
887        assert_eq!(bv.get(2), None);
888        assert_eq!(bv.count_ones(), 1);
889        assert_eq!(bv.count_zeros(), 1);
890    }
891
892    #[test]
893    fn test_set_all() {
894        let mut bv = BitVec::new(3);
895
896        bv.set_all(true);
897        assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![true, true, true]);
898
899        bv.set_all(false);
900        assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![false, false, false]);
901    }
902
903    #[test]
904    fn test_flip() {
905        let mut bv = BitVec::new(1);
906
907        bv.flip(0);
908        assert_eq!(bv.get(0), Some(true));
909
910        bv.flip(0);
911        assert_eq!(bv.get(0), Some(false));
912    }
913
914    #[test]
915    fn test_flip_all() {
916        let mut bv = BitVec::new(3);
917
918        bv.flip_all();
919        assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![true, true, true]);
920        assert_eq!(bv.count_ones(), 3);
921        assert_eq!(bv.count_zeros(), 0);
922
923        bv.flip_all();
924        assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![false, false, false]);
925        assert_eq!(bv.count_ones(), 0);
926        assert_eq!(bv.count_zeros(), 3);
927    }
928
929    #[test]
930    fn test_union() {
931        let mut bv1 = BitVec::new(4);
932        bv1.set(0, true);
933        bv1.set(1, true);
934
935        let mut bv2 = BitVec::new(4);
936        bv2.set(0, true);
937        bv2.set(2, true);
938
939        bv1.union(&bv2);
940        assert_eq!(
941            bv1.iter().collect::<Vec<bool>>(),
942            vec![true, true, true, false]
943        );
944        assert_eq!(bv1.count_ones(), 3);
945        assert_eq!(bv1.count_zeros(), 1);
946    }
947
948    #[test]
949    fn test_intersection() {
950        let mut bv1 = BitVec::new(4);
951        bv1.set(0, true);
952        bv1.set(1, true);
953
954        let mut bv2 = BitVec::new(4);
955        bv2.set(0, true);
956        bv2.set(2, true);
957
958        bv1.intersection(&bv2);
959        assert_eq!(
960            bv1.iter().collect::<Vec<bool>>(),
961            vec![true, false, false, false]
962        );
963        assert_eq!(bv1.count_ones(), 1);
964        assert_eq!(bv1.count_zeros(), 3);
965    }
966
967    #[test]
968    fn test_difference() {
969        let mut bv1 = BitVec::new(4);
970        bv1.set(0, true);
971        bv1.set(1, true);
972
973        let mut bv2 = BitVec::new(4);
974        bv2.set(0, true);
975        bv2.set(2, true);
976
977        bv1.difference(&bv2);
978        assert_eq!(
979            bv1.iter().collect::<Vec<bool>>(),
980            vec![false, true, false, false]
981        );
982        assert_eq!(bv1.count_ones(), 1);
983        assert_eq!(bv1.count_zeros(), 3);
984    }
985
986    #[test]
987    fn test_symmetric_difference() {
988        let mut bv1 = BitVec::new(4);
989        bv1.set(0, true);
990        bv1.set(1, true);
991
992        let mut bv2 = BitVec::new(4);
993        bv2.set(0, true);
994        bv2.set(2, true);
995
996        bv1.symmetric_difference(&bv2);
997        assert_eq!(
998            bv1.iter().collect::<Vec<bool>>(),
999            vec![false, true, true, false]
1000        );
1001        assert_eq!(bv1.count_ones(), 2);
1002        assert_eq!(bv1.count_zeros(), 2);
1003    }
1004
1005    #[test]
1006    fn test_truncate() {
1007        let mut bv = BitVec::from_elem(9, false);
1008
1009        bv.truncate(1);
1010        assert_eq!(bv.iter().collect::<Vec<bool>>(), vec![false]);
1011        assert_eq!(bv.count_ones(), 0);
1012        assert_eq!(bv.count_zeros(), 1);
1013    }
1014
1015    #[test]
1016    fn test_reserve() {
1017        let mut bv = BitVec::from_elem(1, false);
1018
1019        bv.reserve(9);
1020        assert_eq!(bv.len(), 1);
1021        assert!(bv.capacity() >= 16);
1022    }
1023
1024    #[test]
1025    fn test_reserve_exact() {
1026        let mut bv = BitVec::from_elem(1, false);
1027
1028        bv.reserve_exact(9);
1029        assert_eq!(bv.len(), 1);
1030        assert!(bv.capacity() == 16);
1031    }
1032
1033    #[test]
1034    fn test_push_pop() {
1035        let mut bv = BitVec::new(0);
1036        assert_eq!(bv.count_ones(), 0);
1037        assert_eq!(bv.count_zeros(), 0);
1038
1039        bv.push(true);
1040        assert_eq!(bv.count_ones(), 1);
1041        assert_eq!(bv.count_zeros(), 0);
1042
1043        bv.push(false);
1044        assert_eq!(bv.count_ones(), 1);
1045        assert_eq!(bv.count_zeros(), 1);
1046
1047        assert_eq!(bv.pop(), Some(false));
1048        assert_eq!(bv.count_ones(), 1);
1049        assert_eq!(bv.count_zeros(), 0);
1050
1051        assert_eq!(bv.pop(), Some(true));
1052        assert_eq!(bv.count_ones(), 0);
1053        assert_eq!(bv.count_zeros(), 0);
1054
1055        assert_eq!(bv.pop(), None);
1056    }
1057
1058    #[test]
1059    fn test_push() {
1060        let mut bv = BitVec::from_elem(1, false);
1061
1062        bv.push(true);
1063        assert_eq!(bv.get(1), Some(true));
1064        assert_eq!(bv.count_ones(), 1);
1065        assert_eq!(bv.count_zeros(), 1);
1066    }
1067
1068    #[test]
1069    fn test_is_empty() {
1070        let mut bv = BitVec::new(0);
1071
1072        assert!(bv.is_empty());
1073
1074        bv.push(true);
1075        assert!(!bv.is_empty());
1076    }
1077
1078    #[test]
1079    fn test_len() {
1080        let mut bv = BitVec::new(0);
1081
1082        assert_eq!(bv.len(), 0);
1083
1084        bv.push(true);
1085        assert_eq!(bv.len(), 1);
1086    }
1087
1088    #[test]
1089    fn test_clone() {
1090        let bv = BitVec::from_bytes(&[0b1101_0000]);
1091        let mut cloned = BitVec::new(0);
1092
1093        assert_eq!(
1094            bv.clone().iter().collect::<Vec<bool>>(),
1095            vec![true, true, false, true, false, false, false, false],
1096        );
1097
1098        cloned.clone_from(&bv);
1099        assert_eq!(
1100            cloned.iter().collect::<Vec<bool>>(),
1101            vec![true, true, false, true, false, false, false, false],
1102        );
1103    }
1104
1105    #[test]
1106    fn test_iter() {
1107        let bv = BitVec::from_bytes(&[0b1101_0000]);
1108
1109        assert_eq!(
1110            (&bv).into_iter().collect::<Vec<bool>>(),
1111            vec![true, true, false, true, false, false, false, false],
1112        );
1113
1114        assert_eq!(
1115            bv.into_iter().collect::<Vec<bool>>(),
1116            vec![true, true, false, true, false, false, false, false],
1117        );
1118    }
1119}