bitvec_rs/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2#![cfg_attr(feature = "unstable", feature(allocator_api))]
3
4//! This is a bit vector implementation with guaranteed `[u8]` [LSB 0][1]
5//! representation and the ability to get safe immutable and mutable views into its
6//! internal vector for easy I/O.
7//!
8//! [1]: https://en.wikipedia.org/wiki/Bit_numbering#LSB_0_bit_numbering
9//!
10//! It mirrors the API of `std::vec::Vec` as much as possible. Notable differences:
11//! - `BitVec`'s non-consuming iterator enumerates `bool`s instead of `&bool`s.
12
13// TODO: Flesh out docs.
14
15extern crate alloc;
16
17#[cfg(feature = "unstable")]
18use core::alloc::Allocator;
19use core::fmt;
20use core::num::Wrapping;
21use core::write;
22use core::prelude::rust_2021::*;
23use alloc::vec::Vec;
24use alloc::vec;
25#[cfg(feature = "unstable")]
26use alloc::alloc::Global;
27
28#[cfg(feature = "serde")]
29#[macro_use] extern crate serde;
30
31/// Bit vector with guaranteed `[u8]` LSB 0 representation and safe mutable access to this slice.
32/// Slices into the bit vector are guaranteed to have the unused bits on the last byte set to 0.
33#[cfg(not(feature = "unstable"))]
34#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
35#[derive(Clone, Default, PartialEq, Eq)]
36pub struct BitVec {
37    nbits: usize,
38    vec: Vec<u8>,
39}
40
41/// Bit vector with guaranteed `[u8]` LSB 0 representation and safe mutable access to this slice.
42/// Slices into the bit vector are guaranteed to have the unused bits on the last byte set to 0.
43#[cfg(feature = "unstable")]
44#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
45#[derive(Clone)]
46pub struct BitVec<A: Allocator = Global> {
47    nbits: usize,
48    vec: Vec<u8, A>,
49}
50
51// Explicitly allow comparisons between BitVecs regardless of whether
52// they use the same allocator or whether their allocator implements
53// PartialEq or not.
54#[cfg(feature = "unstable")]
55impl<A: Allocator, B: Allocator> PartialEq<BitVec<B>> for BitVec<A> {
56    
57    fn eq(&self, other: &BitVec<B>) -> bool {
58        self.nbits == other.nbits && self.vec == other.vec
59    }
60
61}
62
63#[cfg(feauture = "unstable")]
64impl Default for BitVec {
65    
66    fn default() -> Self {
67        Self { nbits: 0, vec: Vec::new() }
68    }
69
70}
71
72#[cfg(feature = "unstable")]
73impl<A: Allocator> Eq for BitVec<A> {}
74
75fn bytes_in_bits(nbits: usize) -> usize {
76    // #bytes = #ceil(nbits / 8)
77    (nbits + 7) / 8
78}
79
80fn byte_from_bool(bit: bool) -> u8 {
81    if bit { !0u8 } else { 0u8 }
82}
83
84#[cfg(feature = "unstable")]
85impl<A: Allocator> BitVec<A> {
86    ////////////////////////////////////////
87    // Constructors
88
89    /// Constructs an empty `BitVec`.
90    pub const fn new_in(alloc: A) -> Self {
91        Self { vec: Vec::new_in(alloc), nbits: 0 }
92    }
93
94    /// Constructs a `BitVec` from bytes.
95    pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
96        Self { vec: Vec::with_capacity_in(bytes_in_bits(capacity), alloc), nbits: 0 }
97    }
98
99}
100
101impl BitVec {
102    ////////////////////////////////////////
103    // Constructors
104
105    /// Constructs an empty `BitVec`.
106    pub const fn new() -> Self {
107        Self { vec: Vec::new(), nbits: 0 }
108    }
109
110    /// Constructs an empty `BitVec` with the given capacity.
111    ///
112    /// The bit vector will be able to hold at least capacity bits without reallocating. If
113    /// capacity is 0, the bit vector will not allocate.
114    pub fn with_capacity(capacity: usize) -> Self {
115        Self { vec: Vec::with_capacity(bytes_in_bits(capacity)), nbits: 0 }
116    }
117
118    /// Constructs a `BitVec` from bytes.
119    pub fn from_bytes(bytes: &[u8]) -> Self {
120        let mut vec = Self { vec: Vec::from(bytes), nbits: bytes.len() * 8 };
121        vec.set_unused_zero();
122        vec
123    }
124
125    /// Constructs a `BitVec` from bools.
126    pub fn from_bools(bools: &[bool]) -> Self {
127        let mut vec = Self::with_capacity(bools.len());
128        for &b in bools {
129            vec.push(b);
130        }
131        vec
132    }
133
134    /// Constructs a `BitVec` from a repeating bit value.
135    pub fn from_elem(len: usize, value: bool) -> Self {
136        let mut vec = Self {
137            vec: vec![byte_from_bool(value); bytes_in_bits(len)],
138            nbits: len,
139        };
140        vec.set_unused_zero();
141        vec
142    }
143
144}
145
146macro_rules! impl_bitvec {
147    ($into_bytes_type: ty) => {
148
149        ////////////////////////////////////////
150        // Converters/views
151
152        /// Returns a byte slice view of the data.
153        pub fn as_bytes(&self) -> &[u8] { &self.vec }
154
155        /// Invokes the given function on a mut byte slice view of the data. After `f` completes, the
156        /// trailing unused bits of the last byte are automatically set to 0.
157        pub fn with_bytes_mut<U, F: FnOnce(&mut [u8]) -> U>(&mut self, f: F) -> U {
158            let val = f(&mut self.vec);
159            self.set_unused_zero();
160            val
161        }
162
163        /// Consumes the `self` and returns the underlying `Vec<u8>` of length `ceil(self.len()/8)`.
164        /// The values of the bits in the last byte of `Vec<u8>` beyond the length of the `BitVec` are
165        /// 0.
166        pub fn into_bytes(self) -> $into_bytes_type { self.vec }
167
168        ////////////////////////////////////////
169        // Getters/setters
170
171        /// Returns the length of the bit vector.
172        pub fn len(&self) -> usize { self.nbits }
173
174        /// Returns whether the vector is empty.
175        pub fn is_empty(&self) -> bool { self.nbits == 0 }
176
177        /// Validates the index for validity or panics.
178        fn validate_index(&self, index: usize) {
179            assert!(self.nbits <= self.vec.len() * 8,
180                    "Expected #bits {} <= 8 x (#bytes {} in vec).", self.nbits, self.vec.len());
181            if index >= self.nbits { panic!("Index {} out of bounds [0, {})", index, self.nbits); }
182        }
183
184        /// Gets the bit at the given `index`.
185        pub fn get(&self, index: usize) -> Option<bool> {
186            if index < self.len() {
187                Some(unsafe { self.get_unchecked(index) })
188            } else {
189                None
190            }
191        }
192
193        /// Sets the bit at the given `index`. Panics if `index` exceeds length.
194        pub fn set(&mut self, index: usize, value: bool) {
195            self.validate_index(index);
196            unsafe { self.set_unchecked(index, value) };
197        }
198
199        /// Swaps two elements in the `BitVec`.
200        pub fn swap(&mut self, i: usize, j: usize) {
201            self.validate_index(i);
202            self.validate_index(j);
203            unsafe {
204                let val_i = self.get_unchecked(i);
205                let val_j = self.get_unchecked(j);
206                self.set_unchecked(i, val_j);
207                self.set_unchecked(j, val_i);
208            }
209        }
210
211        /// Gets the bit at the given `index` without bounds checking.
212        pub unsafe fn get_unchecked(&self, index: usize) -> bool {
213            let byte = self.vec.get_unchecked(index / 8);
214            let pattern = 1u8 << (index % 8);
215            (*byte & pattern) != 0u8
216        }
217
218        /// Sets the bit at the given `index` without bounds checking.
219        pub unsafe fn set_unchecked(&mut self, index: usize, value: bool) {
220            let byte = self.vec.get_unchecked_mut(index / 8);
221            let pattern = 1u8 << (index % 8);
222            *byte = if value { *byte |  pattern }
223                    else     { *byte & !pattern };
224        }
225
226        ////////////////////////////////////////
227        // Adding/removing items
228
229        /// Pushes a boolean to the end of the `BitVec`.
230        pub fn push(&mut self, value: bool) {
231            let nbits = self.nbits; // avoid mutable borrow error
232            if nbits % 8 == 0 {
233                self.vec.push(if value { 1u8 } else { 0u8 });
234            } else {
235                unsafe { self.set_unchecked(nbits, value) };
236            }
237            self.nbits += 1;
238        }
239
240         /// Pops a boolean from the end of the `BitVec`.
241        pub fn pop(&mut self) -> Option<bool> {
242            if self.nbits == 0 { return None }
243            self.nbits -= 1;
244
245            // Get the popped bit value to return.
246            let nbits = self.nbits; // avoid mutable borrow error
247            let value = unsafe { self.get_unchecked(nbits) };
248            // Set the popped bit value to 0.
249            unsafe { self.set_unchecked(nbits, false); }
250            // Pop off the last byte from the underlying vector if it has no active bits.
251            if self.nbits % 8 == 0 {
252                assert!(self.nbits == (self.vec.len() - 1) * 8,
253                    "Expected #bits {} == 8 x (#bytes {} in vec - 1) after bit pop and before vec pop.",
254                    self.nbits, self.vec.len());
255                self.vec.pop();
256            }
257
258            Some(value)
259        }
260
261        /// Clears the `BitVec`, removing all values.
262        pub fn clear(&mut self) {
263            self.vec.clear();
264            self.nbits = 0;
265        }
266
267        /// Returns the number of booleans that the bitvec can hold without reallocating.
268        pub fn capacity(&self) -> usize {
269            self.vec.capacity() * 8
270        }
271
272        /// Reserves capacity for at least additional more booleans to be inserted in the given
273        /// `BitVec`. The collection may reserve more space to avoid frequent reallocations.
274        pub fn reserve(&mut self, additional: usize) {
275            self.vec.reserve(bytes_in_bits(additional))
276        }
277
278        /// Shorten a vector, dropping excess elements.
279        ///
280        /// If `len` is greater than the vector's current length, this has no effect.
281        pub fn truncate(&mut self, len: usize) {
282            if len < self.len() {
283            let nbytes = bytes_in_bits(len);
284            self.vec.truncate(nbytes);
285            self.nbits = len;
286            self.set_unused_zero()
287            }
288        }
289
290        /// Reserves capacity for at least additional more booleans to be inserted in the given
291        /// `BitVec`. The collection may reserve more space to avoid frequent reallocations.
292        pub fn resize(&mut self, new_len: usize, value: bool) {
293            if new_len > self.len() {
294                let additional = new_len - self.len();
295                self.reserve(additional);
296                for _ in 0..additional {
297                    self.push(value);
298                }
299            } else {
300                self.truncate(new_len);
301            }
302        }
303
304
305        ////////////////////////////////////////
306        // Helpers
307
308        /// Sets the extra unused bits in the bitvector to 0.
309        fn set_unused_zero(&mut self) {
310            if self.nbits % 8 == 0 { return }
311            let len = self.vec.len(); // avoid mutable borrow error
312            assert!(len > 0);
313
314            let byte = unsafe { self.vec.get_unchecked_mut(len - 1) };
315            // Pattern with all 1's in the used bits only, avoiding overflow check in debug.
316            let pattern = (Wrapping(1u8 << (self.nbits % 8)) - Wrapping(1u8)).0;
317            *byte &= pattern;
318        }
319    }
320}
321
322#[cfg(not(feature = "unstable"))]
323impl BitVec {
324    impl_bitvec!(Vec<u8>);
325
326    ////////////////////////////////////////
327    // Iterators
328
329    /// Returns an iterator for the booleans in the bitvec.
330    pub fn iter(&self) -> Iter {
331        self.into_iter()
332    }
333}
334
335#[cfg(feature = "unstable")]
336impl<A: Allocator> BitVec<A> {
337    impl_bitvec!(Vec<u8, A>);
338
339    ////////////////////////////////////////
340    // Iterators
341
342    /// Returns an iterator for the booleans in the bitvec.
343    pub fn iter(&self) -> Iter<A> {
344        self.into_iter()
345    }
346}
347
348macro_rules! impl_display {
349    () => {
350        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
351            for (val, index) in self.iter().zip(0..usize::max_value()) {
352                if index > 0 && index % 8 == 0 {
353                    write!(f, " ")?;
354                }
355                write!(f, "{}", if val { "1" } else { "." })?;
356            }
357            Ok(())
358        }
359    }
360}
361
362#[cfg(not(feature = "unstable"))]
363impl fmt::Debug for BitVec {
364    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
365        write!(f, "BitVec{{{:?}: {}}}", self.nbits, &self)
366    }
367}
368
369#[cfg(not(feature = "unstable"))]
370impl fmt::Display for BitVec {
371    impl_display!();
372}
373
374#[cfg(feature = "unstable")]
375impl<A: Allocator> fmt::Debug for BitVec<A> {
376    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
377        write!(f, "BitVec{{{:?}: {}}}", self.nbits, &self)
378    }
379}
380
381#[cfg(feature = "unstable")]
382impl<A: Allocator> fmt::Display for BitVec<A> {
383    impl_display!();
384}
385
386impl Extend<bool> for BitVec {
387    fn extend<T>(&mut self, iterable: T)
388        where T: IntoIterator<Item = bool>
389    {
390        let iter = iterable.into_iter();
391        let (min, max) = iter.size_hint();
392        self.reserve(max.unwrap_or(min));
393        for val in iter { self.push(val); }
394    }
395}
396
397impl<'a> Extend<&'a bool> for BitVec {
398    fn extend<T>(&mut self, iterable: T)
399        where T: IntoIterator<Item = &'a bool>
400    {
401        let iter = iterable.into_iter();
402        let (min, max) = iter.size_hint();
403        self.reserve(max.unwrap_or(min));
404        for val in iter { self.push(*val); }
405    }
406}
407
408impl core::iter::FromIterator<bool> for BitVec {
409    fn from_iter<T>(iterable: T) -> Self
410        where T: IntoIterator<Item = bool>
411    {
412        let iter = iterable.into_iter();
413        let (min, max) = iter.size_hint();
414        let mut vec = BitVec::with_capacity(max.unwrap_or(min));
415        for val in iter { vec.push(val); }
416        vec
417    }
418}
419
420impl<'a> core::iter::FromIterator<&'a bool> for BitVec {
421    fn from_iter<T>(iterable: T) -> Self
422        where T: IntoIterator<Item = &'a bool>
423    {
424        let iter = iterable.into_iter();
425        let (min, max) = iter.size_hint();
426        let mut vec = BitVec::with_capacity(max.unwrap_or(min));
427        for &val in iter { vec.push(val); }
428        vec
429    }
430}
431
432impl From<&[bool]> for BitVec {
433    fn from(bools: &[bool]) -> Self {
434        BitVec::from_bools(bools)
435    }
436}
437
438impl From<&Vec<bool>> for BitVec {
439    fn from(bools: &Vec<bool>) -> Self {
440        BitVec::from_bools(bools)
441    }
442}
443
444impl From<Vec<bool>> for BitVec {
445        fn from(bools: Vec<bool>) -> Self {
446        BitVec::from_bools(&bools)
447    }
448}
449
450////////////////////////////////////////////////////////////////////////////////
451// Iterators
452
453macro_rules! impl_iter {
454    () => {
455        type Item = bool;
456
457        fn size_hint(&self) -> (usize, Option<usize>) {
458            let remaining = self.vec.len() - self.index;
459            (remaining, Some(remaining))
460        }
461
462        fn count(self) -> usize {
463            self.vec.len() - self.index
464        }
465
466        fn last(self) -> Option<Self::Item> {
467            let len = self.vec.len();
468            if self.index < len {
469                Some(unsafe { self.vec.get_unchecked(len - 1) })
470            } else {
471                None
472            }
473        }
474
475        fn nth(&mut self, count: usize) -> Option<Self::Item> {
476            self.index = if count >= self.vec.nbits - self.index {
477                self.vec.nbits
478            } else {
479                self.index + count
480            };
481            self.next()
482        }
483
484        fn next(&mut self) -> Option<Self::Item> {
485            if self.index >= self.vec.nbits {
486                None
487            } else {
488                let val = unsafe { self.vec.get_unchecked(self.index) };
489                self.index += 1;
490                Some(val)
491            }
492        }
493    };
494}
495
496pub use self::iter::*;
497
498#[cfg(not(feature = "unstable"))]
499mod iter {
500    use super::BitVec;
501
502    /// Allows forward iteration through the bits of a bit vector.
503    #[derive(Clone)]
504    pub struct Iter<'a>
505    {
506        vec: &'a BitVec,
507        index: usize,
508    }
509
510    /// Consumes and allows forward iteration through the bits of a bit vector.
511    pub struct IntoIter
512    {
513        vec: BitVec,
514        index: usize,
515    }
516
517    impl<'a> Iterator for Iter<'a> {
518        impl_iter!();
519    }
520
521    impl Iterator for IntoIter {
522        impl_iter!();
523    }
524
525    impl<'a> IntoIterator for &'a BitVec {
526        type Item = bool;
527        type IntoIter = Iter<'a>;
528        fn into_iter(self) -> Self::IntoIter {
529            Iter {
530                vec: self,
531                index: 0,
532            }
533        }
534    }
535
536    impl IntoIterator for BitVec {
537        type Item = bool;
538        type IntoIter = IntoIter;
539        fn into_iter(self) -> Self::IntoIter {
540            IntoIter {
541                vec: self,
542                index: 0,
543            }
544        }
545    }
546}
547
548#[cfg(feature = "unstable")]
549mod iter {
550    use alloc::alloc::Global;
551    use core::alloc::Allocator;
552    use super::BitVec;
553
554    /// Allows forward iteration through the bits of a bit vector.
555    #[derive(Clone)]
556    pub struct Iter<'a, A: Allocator = Global>
557    {
558        vec: &'a BitVec<A>,
559        index: usize,
560    }
561
562    /// Consumes and allows forward iteration through the bits of a bit vector.
563    pub struct IntoIter<A: Allocator = Global>
564    {
565        vec: BitVec<A>,
566        index: usize,
567    }
568
569    impl<'a, A: Allocator> Iterator for Iter<'a, A> {
570        impl_iter!();
571    }
572
573    impl<A: Allocator> Iterator for IntoIter<A> {
574        impl_iter!();
575    }
576
577    impl<'a, A: Allocator> IntoIterator for &'a BitVec<A> {
578        type Item = bool;
579        type IntoIter = Iter<'a, A>;
580        fn into_iter(self) -> Self::IntoIter {
581            Iter::<A> {
582                vec: self,
583                index: 0,
584            }
585        }
586    }
587
588    impl<A: Allocator> IntoIterator for BitVec<A> {
589        type Item = bool;
590        type IntoIter = IntoIter<A>;
591        fn into_iter(self) -> Self::IntoIter {
592            IntoIter::<A> {
593                vec: self,
594                index: 0,
595            }
596        }
597    }
598}
599
600////////////////////////////////////////////////////////////////////////////////
601// Indexing operations
602
603static TRUE: bool = true;
604static FALSE: bool = false;
605
606#[cfg(not(feature = "unstable"))]
607impl core::ops::Index<usize> for BitVec {
608    type Output = bool;
609
610    fn index(&self, index: usize) -> &Self::Output {
611        assert!(index < self.len());
612        let value = unsafe { self.get_unchecked(index) };
613        if value { &TRUE } else { &FALSE }
614    }
615}
616
617#[cfg(feature = "unstable")]
618impl<A: Allocator> core::ops::Index<usize> for BitVec<A> {
619    type Output = bool;
620
621    fn index(&self, index: usize) -> &Self::Output {
622        assert!(index < self.len());
623        let value = unsafe { self.get_unchecked(index) };
624        if value { &TRUE } else { &FALSE }
625    }
626}
627////////////////////////////////////////////////////////////////////////////////
628
629#[cfg(test)]
630mod test {
631    use super::BitVec;
632    use alloc::{vec::Vec, vec, format};
633
634    #[test]
635    fn test_index() {
636        let vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
637        assert_eq!(vec[0], true);
638        assert_eq!(vec[4], false);
639        assert_eq!(vec[15], true);
640    }
641
642    #[test]
643    fn test_constructors_for_empty() {
644        let vec = BitVec::new();
645        assert_eq!(vec.len(), 0);
646        assert_eq!(vec.capacity(), 0);
647        assert_eq!(vec.as_bytes(), &[]);
648
649        let vec = BitVec::with_capacity(0);
650        assert_eq!(vec.len(), 0);
651        assert_eq!(vec.capacity(), 0);
652        assert_eq!(vec.as_bytes(), &[]);
653
654        let vec = BitVec::with_capacity(1);
655        assert_eq!(vec.len(), 0);
656        assert_eq!(vec.capacity(), 8);
657        assert_eq!(vec.as_bytes(), &[]);
658
659        let vec = BitVec::with_capacity(8);
660        assert_eq!(vec.len(), 0);
661        assert_eq!(vec.capacity(), 8);
662        assert_eq!(vec.as_bytes(), &[]);
663
664        let vec = BitVec::with_capacity(9);
665        assert_eq!(vec.len(), 0);
666        assert_eq!(vec.capacity(), 16);
667        assert_eq!(vec.as_bytes(), &[]);
668    }
669
670    #[test]
671    fn test_convert_to_bools() {
672        let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
673        let vec: BitVec = BitVec::from_bools(from);
674        let bools: Vec<bool> = (&vec).iter().collect();
675        assert_eq!(bools, from);
676        let bools: Vec<bool> = vec.iter().collect();
677        assert_eq!(bools, from);
678    }
679
680    #[test]
681    fn test_convert_from_bools() {
682        use core::iter::FromIterator;
683
684        let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
685        let vec: BitVec = BitVec::from_bools(from);
686        assert_eq!(vec.len(), 11);
687        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
688
689        let vec: BitVec = from.into();
690        assert_eq!(vec.len(), 11);
691        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
692
693        let from = &vec![true, false, false, true, true, false, false, true, true, true, false];
694        let vec: BitVec = from.into();
695        assert_eq!(vec.len(), 11);
696        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
697        let vec = BitVec::from_iter(from);
698        assert_eq!(vec.len(), 11);
699        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
700
701        let from = vec![true, false, false, true, true, false, false, true, true, true, false];
702        let vec: BitVec = from.clone().into();
703        assert_eq!(vec.len(), 11);
704        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
705        let vec = BitVec::from_iter(from);
706        assert_eq!(vec.len(), 11);
707        assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
708    }
709
710    #[test]
711    fn test_constructors_from_bytes() {
712        let vec = BitVec::from_bytes(&[0xab, 0xcd]);
713        assert_eq!(vec.len(), 16);
714        assert_eq!(vec.as_bytes(), &[0xab, 0xcd]);
715
716        let vec = BitVec::from_elem(4, true);
717        assert_eq!(vec.len(), 4);
718        assert_eq!(vec.as_bytes(), &[0x0f]);
719
720        let vec = BitVec::from_elem(31, true);
721        assert_eq!(vec.len(), 31);
722        assert_eq!(vec.as_bytes(), &[0xff, 0xff, 0xff, 0x7f]);
723
724        let vec = BitVec::from_elem(4, false);
725        assert_eq!(vec.len(), 4);
726        assert_eq!(vec.as_bytes(), &[0]);
727
728        let vec = BitVec::from_elem(31, false);
729        assert_eq!(vec.len(), 31);
730        assert_eq!(vec.as_bytes(), &[0, 0, 0, 0]);
731    }
732
733    #[test]
734    fn test_with_bytes_mut() {
735        let mut vec = BitVec::from_elem(28, false);
736        assert_eq!(vec.len(), 28);
737        assert_eq!(vec.as_bytes(), &[0, 0, 0, 0]);
738
739        // Fill the underlying buffers with all 1s.
740        vec.with_bytes_mut(|slice| {
741            assert_eq!(slice.len(), 4);
742            for i in 0..4 { slice[i] = 0xff; }
743        });
744        // Expect the unused bytes to be zeroed out.
745        assert_eq!(vec.as_bytes(), &[0xff, 0xff, 0xff, 0x0f]);
746    }
747
748    #[test]
749    fn test_into_bytes() {
750        let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0xe3]);
751        vec.pop(); vec.pop();
752        assert_eq!(vec.len(), 54);
753        let vec = vec.into_bytes();
754        assert_eq!(vec, &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23]);
755    }
756
757    #[test]
758    fn test_get_set_index() {
759        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
760        assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
761        assert_eq!(Some(true), vec.get(8));
762        assert_eq!(true, vec[8]);
763
764        vec.set(8, true);
765        assert_eq!(Some(true), vec.get(8));
766        assert_eq!(true, vec[8]);
767        assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
768
769        vec.set(8, false);
770        assert_eq!(Some(false), vec.get(8));
771        assert_eq!(false, vec[8]);
772        assert_eq!(vec.as_bytes(), &[0xef, 0xa4, 0x71]);
773
774        vec.set(7, false);
775        assert_eq!(Some(false), vec.get(7));
776        assert_eq!(false, vec[7]);
777        assert_eq!(vec.as_bytes(), &[0x6f, 0xa4, 0x71]);
778
779        assert_eq!(None, vec.get(vec.len()));
780    }
781
782    #[test]
783    fn test_pop_to_empty() {
784        let mut vec = BitVec::new();
785        assert_eq!(vec.pop(), None);
786        assert_eq!(vec.pop(), None);
787
788        let mut vec = BitVec::from_bytes(&[0b01111111]);
789        assert_eq!(vec.pop(), Some(false));
790        assert_eq!(vec.len(), 7);
791        for _ in 0..7 {
792            assert_eq!(vec.pop(), Some(true));
793        }
794        assert_eq!(vec.len(), 0);
795        assert_eq!(vec.pop(), None);
796        assert_eq!(vec.pop(), None);
797        assert_eq!(vec.len(), 0);
798    }
799
800    #[test]
801    fn test_pop_push() {
802        let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b11100011]);
803        assert_eq!(vec.len(), 56);
804
805        // Pop 2 bits and expect the slice view to show zeros for them.
806        assert_eq!(vec.pop(), Some(true));
807        assert_eq!(vec.pop(), Some(true));
808        assert_eq!(vec.len(), 54);
809        assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b00100011]);
810
811        // Finish popping the byte and expect the slice to be one byte shorter.
812        assert_eq!(vec.pop(), Some(true));
813        assert_eq!(vec.pop(), Some(false));
814        assert_eq!(vec.pop(), Some(false));
815        assert_eq!(vec.pop(), Some(false));
816        assert_eq!(vec.pop(), Some(true));
817        assert_eq!(vec.pop(), Some(true));
818        assert_eq!(vec.len(), 48);
819        assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45]);
820
821        // Push another byte in.
822        for _ in 0..4 {
823            vec.push(true);
824            vec.push(false);
825        }
826        assert_eq!(vec.len(), 56);
827        assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b01010101]);
828    }
829
830    #[test]
831    fn test_clear() {
832        let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0xe3]);
833        assert_eq!(vec.len(), 56);
834        vec.clear();
835        assert_eq!(vec.len(), 0);
836        assert_eq!(vec.as_bytes(), &[]);
837    }
838
839    fn assert_iter_eq<I: IntoIterator<Item=bool>>(vec: I, expected: &Vec<bool>) {
840        let actual: Vec<bool> = vec.into_iter().collect();
841        assert_eq!(&actual, expected);
842    }
843
844    #[test]
845    fn test_iter() {
846        let l = true;
847        let o = false;
848
849        assert_iter_eq(&BitVec::new(), &Vec::new());
850
851        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
852        // low bit to high bit:       f       e        5       a        1       7
853        assert_iter_eq(&vec, &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l,l,o]);
854        vec.pop(); vec.pop();
855        
856        // low bit to high bit:       f       e        5       a        1     3
857        assert_iter_eq(&vec, &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l]);
858    }
859
860    #[test]
861    fn test_into_iter() {
862        let l = true;
863        let o = false;
864
865        assert_iter_eq(&BitVec::new(), &Vec::new());
866
867        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
868        // low bit to high bit:       f       e        5       a        1       7
869        assert_iter_eq(vec.clone(), &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l,l,o]);
870        vec.pop(); vec.pop();
871
872        // low bit to high bit:       f       e        5       a        1     3
873        assert_iter_eq(vec.clone(), &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l]);
874    }
875
876    #[test]
877    #[should_panic(expected = "out of bounds")]
878    fn test_set_validation() {
879        let _ = &BitVec::from_bytes(&[0xef, 0xa5, 0x71]).set(24, true);
880    }
881
882    #[test]
883    fn test_eq() {
884        let vec1 = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
885        let mut vec2 = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
886        assert!(vec1 == vec2);
887        vec2.push(true);
888        assert!(vec1 != vec2);
889        vec2.pop();
890        assert!(vec1 == vec2);
891        vec2.set(3, false);
892        assert!(vec1 != vec2);
893    }
894
895    #[test]
896    fn test_clone() {
897        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
898        assert_eq!(vec, vec.clone());
899        vec.pop(); vec.pop();
900        assert_eq!(vec, vec.clone());
901    }
902
903    #[test]
904    fn test_debug() {
905        assert_eq!(
906            format!("{:?}", &BitVec::from_bytes(&[0xef, 0xa5, 0x71])),
907            "BitVec{24: 1111.111 1.1..1.1 1...111.}"
908        )
909    }
910
911    #[test]
912    fn test_swap() {
913        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
914        vec.swap(0, 23);
915        assert_eq!(vec.len(), 24);
916        assert_eq!(vec.as_bytes(), &[0xee, 0xa5, 0xf1]);
917        vec.swap(0, 5);
918        assert_eq!(vec.len(), 24);
919        assert_eq!(vec.as_bytes(), &[0xcf, 0xa5, 0xf1]);
920    }
921
922    #[test]
923    fn test_capacity_reserve() {
924        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
925        assert_eq!(vec.len(), 24);
926        assert!(vec.capacity() >= vec.len());
927        let new_capacity = 2 * vec.capacity();
928        vec.reserve(new_capacity);
929        assert!(vec.capacity() >= new_capacity);
930    }
931
932    #[test]
933    fn test_truncate_extend() {
934        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
935
936        vec.truncate(25);
937        assert_eq!(vec.len(), 24);
938        assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
939
940        vec.truncate(12);
941        assert_eq!(vec.len(), 12);
942        assert_eq!(vec.as_bytes(), &[0xef, 0x05]);
943
944        vec.extend(core::iter::repeat(true).take(5));
945        assert_eq!(vec.len(), 17);
946        assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x01]);
947
948        vec.extend(core::iter::repeat(&true).take(6));
949        assert_eq!(vec.len(), 23);
950        assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x7f]);
951    }
952
953    #[test]
954    fn test_resize() {
955        let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
956
957        vec.resize(24, true);
958        assert_eq!(vec.len(), 24);
959        assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
960
961        vec.resize(12, true);
962        assert_eq!(vec.len(), 12);
963        assert_eq!(vec.as_bytes(), &[0xef, 0x05]);
964
965        vec.resize(17, true);
966        assert_eq!(vec.len(), 17);
967        assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x01]);
968    }
969
970    #[test]
971    fn test_iter_overrides() {
972        let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
973        let vec = BitVec::from_bools(from);
974        assert_eq!(vec.len(), 11);
975        assert_eq!(vec.iter().size_hint(), (11, Some(11)));
976        assert_eq!(vec.iter().count(), 11);
977        assert_eq!(vec.iter().last(), Some(false));
978
979        // nth from scratch
980        for (index, &b) in from.iter().enumerate() {
981            assert_eq!(vec.iter().nth(index), Some(b));
982        }
983        assert_eq!(vec.iter().nth(11), None);
984
985        // partially-consumed iterators
986        let mut iter = vec.iter();
987        for (index, &b) in from.iter().enumerate() {
988            assert_eq!(iter.size_hint(), (11 - index, Some(11 - index)));
989            assert_eq!(iter.clone().count(), 11 - index);
990            assert_eq!(iter.clone().last(), Some(false));
991            assert_eq!(iter.nth(0), Some(b));
992        }
993        assert_eq!(iter.size_hint(), (0, Some(0)));
994        assert_eq!(iter.clone().count(), 0);
995        assert_eq!(iter.clone().last(), None);
996        assert_eq!(iter.nth(0), None);
997    }
998
999    #[cfg(feature = "unstable")]
1000    #[test]
1001    fn test_custom_allocator() {
1002        use alloc::alloc::Global;
1003        
1004        let mut vec = Vec::new_in(Global);
1005        vec.push(false);
1006        vec.push(true);
1007        assert_eq!(vec[1], true);
1008    }
1009}