bitvec_rs/
lib.rs

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