bitvec/vec/api.rs
1//! Port of the `Vec<bool>` inherent API.
2
3use alloc::vec::Vec;
4use core::{
5 mem::ManuallyDrop,
6 ops::RangeBounds,
7};
8
9use tap::Pipe;
10use wyz::{
11 comu::{
12 Const,
13 Mut,
14 },
15 range::RangeExt,
16};
17
18use super::{
19 BitVec,
20 Drain,
21 Splice,
22};
23use crate::{
24 boxed::BitBox,
25 index::BitEnd,
26 mem,
27 order::BitOrder,
28 ptr::{
29 AddressExt,
30 BitPtr,
31 BitSpan,
32 },
33 slice::BitSlice,
34 store::BitStore,
35};
36
37/// Port of the `Vec<T>` inherent API.
38impl<T, O> BitVec<T, O>
39where
40 T: BitStore,
41 O: BitOrder,
42{
43 /// Constructs a new, empty, bit-vector.
44 ///
45 /// This does not allocate until bits are [`.push()`]ed into it, or space is
46 /// explicitly [`.reserve()`]d.
47 ///
48 /// ## Original
49 ///
50 /// [`Vec::new`](alloc::vec::Vec::new)
51 ///
52 /// ## Examples
53 ///
54 /// ```rust
55 /// use bitvec::prelude::*;
56 ///
57 /// let bv = BitVec::<u8, Msb0>::new();
58 /// assert!(bv.is_empty());
59 /// ```
60 ///
61 /// [`.push()`]: Self::push
62 /// [`.reserve()`]: Self::reserve
63 #[inline]
64 pub fn new() -> Self {
65 Self::EMPTY
66 }
67
68 /// Allocates a new, empty, bit-vector with space for at least `capacity`
69 /// bits before reallocating.
70 ///
71 /// ## Original
72 ///
73 /// [`Vec::with_capacity`](alloc::vec::Vec::with_capacity)
74 ///
75 /// ## Panics
76 ///
77 /// This panics if the requested capacity is longer than what the bit-vector
78 /// can represent. See [`BitSlice::MAX_BITS`].
79 ///
80 /// ## Examples
81 ///
82 /// ```rust
83 /// use bitvec::prelude::*;
84 ///
85 /// let mut bv: BitVec = BitVec::with_capacity(128);
86 ///
87 /// assert!(bv.is_empty());
88 /// assert!(bv.capacity() >= 128);
89 ///
90 /// for i in 0 .. 128 {
91 /// bv.push(i & 0xC0 == i);
92 /// }
93 /// assert_eq!(bv.len(), 128);
94 /// assert!(bv.capacity() >= 128);
95 ///
96 /// bv.push(false);
97 /// assert_eq!(bv.len(), 129);
98 /// assert!(bv.capacity() >= 129);
99 /// ```
100 ///
101 /// [`BitSlice::MAX_BITS`]: crate::slice::BitSlice::MAX_BITS
102 #[inline]
103 pub fn with_capacity(capacity: usize) -> Self {
104 Self::assert_len_encodable(capacity);
105 let mut vec = capacity
106 .pipe(crate::mem::elts::<T>)
107 .pipe(Vec::<T>::with_capacity)
108 .pipe(ManuallyDrop::new);
109 let (addr, capacity) = (vec.as_mut_ptr(), vec.capacity());
110 let bitspan = BitSpan::uninhabited(unsafe { addr.into_address() });
111 Self { bitspan, capacity }
112 }
113
114 /// Constructs a bit-vector handle from its constituent fields.
115 ///
116 /// ## Original
117 ///
118 /// [`Vec::from_raw_parts`](alloc::vec::Vec::from_raw_parts)
119 ///
120 /// ## Safety
121 ///
122 /// The **only** acceptable argument values for this function are those that
123 /// were previously produced by calling [`.into_raw_parts()`]. Furthermore,
124 /// you may only call this **at most once** on any set of arguments. Using
125 /// the same arguments in more than one call to this function will result in
126 /// a double- or use-after free error.
127 ///
128 /// Attempting to conjure your own values and pass them into this function
129 /// will break the allocator state.
130 ///
131 /// ## Examples
132 ///
133 /// ```rust
134 /// use bitvec::prelude::*;
135 ///
136 /// let bv = bitvec![0, 1, 0, 0, 1];
137 /// let (bitptr, len, capa) = bv.into_raw_parts();
138 /// let bv2 = unsafe {
139 /// BitVec::from_raw_parts(bitptr, len, capa)
140 /// };
141 /// assert_eq!(bv2, bits![0, 1, 0, 0, 1]);
142 /// ```
143 ///
144 /// [`.into_raw_parts()`]: Self::into_raw_parts
145 #[inline]
146 pub unsafe fn from_raw_parts(
147 bitptr: BitPtr<Mut, T, O>,
148 length: usize,
149 capacity: usize,
150 ) -> Self {
151 let bitspan = bitptr.span_unchecked(length);
152 Self {
153 bitspan,
154 capacity: mem::elts::<T>(
155 capacity.saturating_add(bitspan.head().into_inner() as usize),
156 ),
157 }
158 }
159
160 /// Decomposes a bit-vector into its constituent member fields.
161 ///
162 /// This disarms the destructor. In order to prevent a memory leak, you must
163 /// pass **these exact values** back into [`::from_raw_parts()`].
164 ///
165 /// ## Original
166 ///
167 /// [`Vec::into_raw_parts`](alloc::vec::Vec::into_raw_parts)
168 ///
169 /// ## API Differences
170 ///
171 /// This method is still unstable as of 1.54. It is provided here as a
172 /// convenience, under the expectation that the standard-library method will
173 /// stabilize as-is.
174 ///
175 /// [`::from_raw_parts()`]: Self::from_raw_parts
176 #[inline]
177 pub fn into_raw_parts(self) -> (BitPtr<Mut, T, O>, usize, usize) {
178 let this = ManuallyDrop::new(self);
179 (
180 this.bitspan.to_bitptr(),
181 this.bitspan.len(),
182 this.capacity(),
183 )
184 }
185
186 /// Gets the allocation capacity, measured in bits.
187 ///
188 /// This counts how many total bits the bit-vector can store before it must
189 /// perform a reällocation to acquire more memory.
190 ///
191 /// If the capacity is not a multiple of 8, you should call
192 /// [`.force_align()`].
193 ///
194 /// ## Original
195 ///
196 /// [`Vec::capacity`](alloc::vec::Vec::capacity)
197 ///
198 /// ## Examples
199 ///
200 /// ```rust
201 /// use bitvec::prelude::*;
202 ///
203 /// let bv = bitvec![0, 1, 0, 0, 1];
204 /// ```
205 ///
206 /// [`.force_align()`]: Self::force_align
207 #[inline]
208 pub fn capacity(&self) -> usize {
209 self.capacity
210 .checked_mul(mem::bits_of::<T>())
211 .expect("bit-vector capacity exceeded")
212 .saturating_sub(self.bitspan.head().into_inner() as usize)
213 }
214
215 /// Ensures that the bit-vector has allocation capacity for *at least*
216 /// `additional` more bits to be appended to it.
217 ///
218 /// For convenience, this method *guarantees* that the underlying memory for
219 /// `self[.. self.len() + additional]` is initialized, and may be safely
220 /// accessed directly without requiring use of `.push()` or `.extend()` to
221 /// initialize it.
222 ///
223 /// Newly-allocated memory is always initialized to zero. It is still *dead*
224 /// until the bit-vector is grown (by `.push()`, `.extend()`, or
225 /// `.set_len()`), but direct access will not trigger UB.
226 ///
227 /// ## Original
228 ///
229 /// [`Vec::reserve`](alloc::vec::Vec::reserve)
230 ///
231 /// ## Panics
232 ///
233 /// This panics if the new capacity exceeds the bit-vector’s maximum.
234 ///
235 /// ## Examples
236 ///
237 /// ```rust
238 /// use bitvec::prelude::*;
239 ///
240 /// let mut bv: BitVec = BitVec::with_capacity(80);
241 /// assert!(bv.capacity() >= 80);
242 /// bv.reserve(800);
243 /// assert!(bv.capacity() >= 800);
244 /// ```
245 #[inline]
246 pub fn reserve(&mut self, additional: usize) {
247 Self::assert_len_encodable(self.len() + additional);
248 self.do_reservation(additional, Vec::<T>::reserve);
249 }
250
251 /// Ensures that the bit-vector has allocation capacity for *at least*
252 /// `additional` more bits to be appended to it.
253 ///
254 /// This differs from [`.reserve()`] by requesting that the allocator
255 /// provide the minimum capacity necessary, rather than a potentially larger
256 /// amount that the allocator may find more convenient.
257 ///
258 /// Remember that this is a *request*: the allocator provides what it
259 /// provides, and you cannot rely on the new capacity to be exactly minimal.
260 /// You should still prefer `.reserve()`, especially if you expect to append
261 /// to the bit-vector in the future.
262 ///
263 /// ## Original
264 ///
265 /// [`Vec::reserve_exact`](alloc::vec::Vec::reserve_exact)
266 ///
267 /// ## Panics
268 ///
269 /// This panics if the new capacity exceeds the bit-vector’s maximum.
270 ///
271 /// ## Examples
272 ///
273 /// ```rust
274 /// use bitvec::prelude::*;
275 ///
276 /// let mut bv: BitVec = BitVec::with_capacity(80);
277 /// assert!(bv.capacity() >= 80);
278 /// bv.reserve_exact(800);
279 /// assert!(bv.capacity() >= 800);
280 /// ```
281 ///
282 /// [`.reserve()`]: Self::reserve
283 #[inline]
284 pub fn reserve_exact(&mut self, additional: usize) {
285 self.do_reservation(additional, Vec::<T>::reserve_exact);
286 }
287
288 /// Releases excess capacity back to the allocator.
289 ///
290 /// Like [`.reserve_exact()`], this is a *request* to the allocator, not a
291 /// command. The allocator may reclaim excess memory or may not.
292 ///
293 /// ## Original
294 ///
295 /// [`Vec::shrink_to_fit`](alloc::vec::Vec::shrink_to_fit)
296 ///
297 /// ## Examples
298 ///
299 /// ```rust
300 /// use bitvec::prelude::*;
301 ///
302 /// let mut bv: BitVec = BitVec::with_capacity(1000);
303 /// bv.push(true);
304 /// bv.shrink_to_fit();
305 /// ```
306 ///
307 /// [`.reserve_exact()`]: Self::reserve_exact
308 #[inline]
309 pub fn shrink_to_fit(&mut self) {
310 self.with_vec(|vec| vec.shrink_to_fit());
311 }
312
313 #[inline]
314 #[cfg(not(tarpaulin_include))]
315 #[deprecated = "prefer `.into_boxed_bitslice() instead"]
316 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
317 pub fn into_boxed_slice(self) -> BitBox<T, O> {
318 self.into_boxed_bitslice()
319 }
320
321 /// Shortens the bit-vector, keeping the first `new_len` bits and discarding
322 /// the rest.
323 ///
324 /// If `len` is greater than the bit-vector’s current length, this has no
325 /// effect.
326 ///
327 /// The [`.drain()`] method can emulate `.truncate()`, except that it yields
328 /// the excess bits rather than discarding them.
329 ///
330 /// Note that this has no effect on the allocated capacity of the
331 /// bit-vector, **nor does it erase truncated memory**. Bits in the
332 /// allocated memory that are outside of the [`.as_bitslice()`] view are
333 /// always considered to have *initialized*, but **unspecified**, values,
334 /// and you cannot rely on them to be zero.
335 ///
336 /// ## Original
337 ///
338 /// [`Vec::truncate`](alloc::vec::Vec::truncate)
339 ///
340 /// ## Examples
341 ///
342 /// Truncating a five-bit vector to two bits:
343 ///
344 /// ```rust
345 /// use bitvec::prelude::*;
346 ///
347 /// let mut bv = bitvec![0, 1, 0, 0, 1];
348 /// bv.truncate(2);
349 /// assert_eq!(bv.len(), 2);
350 /// assert!(bv.as_raw_slice()[0].count_ones() >= 2);
351 /// ```
352 ///
353 /// No truncation occurs when `len` is greater than the bit-vector’s current
354 /// length:
355 ///
356 /// [`.as_bitslice()`]: Self::as_bitslice
357 /// [`.drain()`]: Self::drain
358 #[inline]
359 pub fn truncate(&mut self, new_len: usize) {
360 if new_len < self.len() {
361 unsafe {
362 self.set_len_unchecked(new_len);
363 }
364 }
365 }
366
367 #[inline]
368 #[cfg(not(tarpaulin_include))]
369 #[deprecated = "use `.as_bitslice()` instead"]
370 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
371 pub fn as_slice(&self) -> &BitSlice<T, O> {
372 self.as_bitslice()
373 }
374
375 #[inline]
376 #[cfg(not(tarpaulin_include))]
377 #[deprecated = "use `.as_mut_bitslice()` instead"]
378 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
379 pub fn as_mut_slice(&mut self) -> &mut BitSlice<T, O> {
380 self.as_mut_bitslice()
381 }
382
383 #[inline]
384 #[cfg(not(tarpaulin_include))]
385 #[deprecated = "use `.as_bitptr()` instead"]
386 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
387 pub fn as_ptr(&self) -> BitPtr<Const, T, O> {
388 self.as_bitptr()
389 }
390
391 #[inline]
392 #[cfg(not(tarpaulin_include))]
393 #[deprecated = "use `.as_mut_bitptr()` instead"]
394 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
395 pub fn as_mut_ptr(&mut self) -> BitPtr<Mut, T, O> {
396 self.as_mut_bitptr()
397 }
398
399 /// Resizes a bit-vector to a new length.
400 ///
401 /// ## Original
402 ///
403 /// [`Vec::set_len`](alloc::vec::Vec::set_len)
404 ///
405 /// ## Safety
406 ///
407 /// **NOT ALL MEMORY IN THE ALLOCATION IS INITIALIZED!**
408 ///
409 /// Memory in a bit-vector’s allocation is only initialized when the
410 /// bit-vector grows into it normally (through [`.push()`] or one of the
411 /// various `.extend*()` methods). Setting the length to a value beyond what
412 /// was previously initialized, but still within the allocation, is
413 /// undefined behavior.
414 ///
415 /// The caller is responsible for ensuring that all memory up to (but not
416 /// including) the new length has already been initialized.
417 ///
418 /// ## Panics
419 ///
420 /// This panics if `new_len` exceeds the capacity as reported by
421 /// [`.capacity()`].
422 ///
423 /// ## Examples
424 ///
425 /// ```rust
426 /// use bitvec::prelude::*;
427 ///
428 /// let mut bv = bitvec![0, 1, 0, 0, 1];
429 /// unsafe {
430 /// // The default storage type, `usize`, is at least 32 bits.
431 /// bv.set_len(32);
432 /// }
433 /// assert_eq!(bv, bits![
434 /// 0, 1, 0, 0, 1, 0, 0, 0,
435 /// 0, 0, 0, 0, 0, 0, 0, 0,
436 /// 0, 0, 0, 0, 0, 0, 0, 0,
437 /// 0, 0, 0, 0, 0, 0, 0, 0,
438 /// ]);
439 /// // `BitVec` guarantees that newly-initialized memory is zeroed.
440 /// ```
441 ///
442 /// [`.push()`]: Self::push
443 /// [`.capacity()`]: Self::capacity
444 #[inline]
445 pub unsafe fn set_len(&mut self, new_len: usize) {
446 let capa = self.capacity();
447 assert!(
448 new_len <= capa,
449 "bit-vector capacity exceeded: {} > {}",
450 new_len,
451 capa,
452 );
453 self.set_len_unchecked(new_len);
454 }
455
456 /// Takes a bit out of the bit-vector.
457 ///
458 /// The empty slot is filled with the last bit in the bit-vector, rather
459 /// than shunting `index + 1 .. self.len()` down by one.
460 ///
461 /// ## Original
462 ///
463 /// [`Vec::swap_remove`](alloc::vec::Vec::swap_remove)
464 ///
465 /// ## Panics
466 ///
467 /// This panics if `index` is out of bounds (`self.len()` or greater).
468 ///
469 /// ## Examples
470 ///
471 /// ```rust
472 /// use bitvec::prelude::*;
473 ///
474 /// let mut bv = bitvec![0, 1, 0, 0, 1];
475 /// assert!(!bv.swap_remove(2));
476 /// assert_eq!(bv, bits![0, 1, 1, 0]);
477 /// ```
478 #[inline]
479 pub fn swap_remove(&mut self, index: usize) -> bool {
480 self.assert_in_bounds(index, 0 .. self.len());
481 let last = self.len() - 1;
482 unsafe {
483 self.swap_unchecked(index, last);
484 self.set_len(last);
485 *self.get_unchecked(last)
486 }
487 }
488
489 /// Inserts a bit at a given position, shifting all bits after it one spot
490 /// to the right.
491 ///
492 /// `index` may be any value up to *and including* `self.len()`. If it is
493 /// `self.len()`, it behaves equivalently to `.push()`.
494 ///
495 /// ## Original
496 ///
497 /// [`Vec::insert`](alloc::vec::Vec::insert)
498 ///
499 /// ## Panics
500 ///
501 /// This panics if `index` is out of bounds (including `self.len()`).
502 #[inline]
503 pub fn insert(&mut self, index: usize, value: bool) {
504 self.assert_in_bounds(index, 0 ..= self.len());
505 self.push(value);
506 unsafe { self.get_unchecked_mut(index ..) }.rotate_right(1);
507 }
508
509 /// Removes a bit at a given position, shifting all bits after it one spot
510 /// to the left.
511 ///
512 /// `index` may be any value up to, but **not** including, `self.len()`.
513 ///
514 /// ## Original
515 ///
516 /// [`Vec::remove`](alloc::vec::Vec::remove)
517 ///
518 /// ## Panics
519 ///
520 /// This panics if `index` is out of bounds (excluding `self.len()`).
521 #[inline]
522 pub fn remove(&mut self, index: usize) -> bool {
523 self.assert_in_bounds(index, 0 .. self.len());
524 let last = self.len() - 1;
525 unsafe {
526 self.get_unchecked_mut(index ..).rotate_left(1);
527 let out = *self.get_unchecked(last);
528 self.set_len(last);
529 out
530 }
531 }
532
533 /// Retains only the bits that the predicate allows.
534 ///
535 /// Bits are deleted from the vector when the predicate function returns
536 /// false. This function is linear in `self.len()`.
537 ///
538 /// ## Original
539 ///
540 /// [`Vec::retain`](alloc::vec::Vec::retain)
541 ///
542 /// ## API Differences
543 ///
544 /// The predicate receives both the index of the bit as well as its value,
545 /// in order to allow the predicate to have more than one bit of
546 /// keep/discard information.
547 ///
548 /// ## Examples
549 ///
550 /// ```rust
551 /// use bitvec::prelude::*;
552 ///
553 /// let mut bv = bitvec![0, 1, 0, 0, 1];
554 /// bv.retain(|idx, _| idx % 2 == 0);
555 /// assert_eq!(bv, bits![0, 0, 1]);
556 /// ```
557 #[inline]
558 pub fn retain<F>(&mut self, mut func: F)
559 where F: FnMut(usize, &bool) -> bool {
560 let mut len = self.len();
561 let mut hole_ptr = self.as_mut_bitptr();
562 let mut reader = self.as_bitptr_range().enumerate();
563
564 // Advance until the *first* hole is created. This avoids writing into
565 // the bit-slice when no change takes place.
566 for (idx, bitptr) in reader.by_ref() {
567 let bit = unsafe { bitptr.read() };
568 if func(idx, &bit) {
569 hole_ptr = unsafe { hole_ptr.add(1) };
570 }
571 else {
572 len -= 1;
573 break;
574 }
575 }
576 // Now that a hole exists, switch to a loop that always writes into the
577 // hole pointer.
578 for (idx, bitptr) in reader {
579 let bit = unsafe { bitptr.read() };
580 if func(idx, &bit) {
581 hole_ptr = unsafe {
582 hole_ptr.write(bit);
583 hole_ptr.add(1)
584 };
585 }
586 else {
587 len -= 1;
588 }
589 }
590 // Discard the bits that did not survive the predicate.
591 unsafe {
592 self.set_len_unchecked(len);
593 }
594 }
595
596 /// Appends a single bit to the vector.
597 ///
598 /// ## Original
599 ///
600 /// [`Vec::push`](alloc::vec::Vec::push)
601 ///
602 /// ## Panics
603 ///
604 /// This panics if the push would cause the bit-vector to exceed its maximum
605 /// capacity.
606 ///
607 /// ## Examples
608 ///
609 /// ```rust
610 /// use bitvec::prelude::*;
611 ///
612 /// let mut bv = bitvec![0, 0];
613 /// bv.push(true);
614 /// assert_eq!(bv.as_bitslice(), bits![0, 0, 1]);
615 /// ```
616 #[inline]
617 pub fn push(&mut self, value: bool) {
618 let len = self.len();
619 let new_len = len + 1;
620 Self::assert_len_encodable(new_len);
621 // Push a new `T` into the underlying buffer if needed.
622 if len == 0 || self.bitspan.tail() == BitEnd::MAX {
623 self.with_vec(|vec| vec.push(T::ZERO));
624 }
625 // Write `value` into the now-safely-allocated `len` slot.
626 unsafe {
627 self.set_len_unchecked(new_len);
628 self.set_unchecked(len, value);
629 }
630 }
631
632 /// Attempts to remove the trailing bit from the bit-vector.
633 ///
634 /// This returns `None` if the bit-vector is empty.
635 ///
636 /// ## Original
637 ///
638 /// [`Vec::pop`](alloc::vec::Vec::pop)
639 ///
640 /// ## Examples
641 ///
642 /// ```rust
643 /// use bitvec::prelude::*;
644 ///
645 /// let mut bv = bitvec![0, 1];
646 /// assert!(bv.pop().unwrap());
647 /// assert!(!bv.pop().unwrap());
648 /// assert!(bv.pop().is_none());
649 /// ```
650 #[inline]
651 pub fn pop(&mut self) -> Option<bool> {
652 match self.len() {
653 0 => None,
654 n => unsafe {
655 let new_len = n - 1;
656 let out = Some(*self.get_unchecked(new_len));
657 self.set_len_unchecked(new_len);
658 out
659 },
660 }
661 }
662
663 /// Moves all the bits out of `other` into the back of `self`.
664 ///
665 /// The `other` bit-vector is emptied after this occurs.
666 ///
667 /// ## Original
668 ///
669 /// [`Vec::append`](alloc::vec::Vec::append)
670 ///
671 /// ## API Differences
672 ///
673 /// This permits `other` to have different type parameters than `self`, and
674 /// does not require that it be literally `Self`.
675 ///
676 /// ## Panics
677 ///
678 /// This panics if `self.len() + other.len()` exceeds the maximum capacity
679 /// of a bit-vector.
680 ///
681 /// ## Examples
682 ///
683 /// ```rust
684 /// use bitvec::prelude::*;
685 ///
686 /// let mut bv1 = bitvec![u16, Msb0; 0; 10];
687 /// let mut bv2 = bitvec![u32, Lsb0; 1; 10];
688 ///
689 /// bv1.append(&mut bv2);
690 ///
691 /// assert_eq!(bv1.count_ones(), 10);
692 /// assert_eq!(bv1.count_zeros(), 10);
693 /// assert!(bv2.is_empty());
694 /// ```
695 #[inline]
696 pub fn append<T2, O2>(&mut self, other: &mut BitVec<T2, O2>)
697 where
698 T2: BitStore,
699 O2: BitOrder,
700 {
701 self.extend_from_bitslice(other);
702 other.clear();
703 }
704
705 /// Iterates over a portion of the bit-vector, *removing* all yielded bits
706 /// from it.
707 ///
708 /// When the iterator drops, *all* bits in its coverage are removed from
709 /// `self`, even if the iterator did not yield them. If the iterator is
710 /// leaked or otherwise forgotten, and its destructor never runs, then the
711 /// amount of un-yielded bits removed from the bit-vector is not specified.
712 ///
713 /// ## Original
714 ///
715 /// [`Vec::drain`](alloc::vec::Vec::drain)
716 ///
717 /// ## Panics
718 ///
719 /// This panics if `range` departs `0 .. self.len()`.
720 ///
721 /// ## Examples
722 ///
723 /// ```rust
724 /// use bitvec::prelude::*;
725 ///
726 /// let mut bv = bitvec![0, 1, 0, 0, 1];
727 /// let bv2 = bv.drain(1 ..= 3).collect::<BitVec>();
728 /// assert_eq!(bv, bits![0, 1]);
729 /// assert_eq!(bv2, bits![1, 0, 0]);
730 ///
731 /// // A full range clears the bit-vector.
732 /// bv.drain(..);
733 /// assert!(bv.is_empty());
734 /// ```
735 #[inline]
736 pub fn drain<R>(&mut self, range: R) -> Drain<T, O>
737 where R: RangeBounds<usize> {
738 Drain::new(self, range)
739 }
740
741 /// Empties the bit-vector.
742 ///
743 /// This does not affect the allocated capacity.
744 ///
745 /// ## Original
746 ///
747 /// [`Vec::clear`](alloc::vec::Vec::clear)
748 ///
749 /// ## Examples
750 ///
751 /// ```rust
752 /// use bitvec::prelude::*;
753 ///
754 /// let mut bv = bitvec![0, 1, 0, 0, 1];
755 /// bv.clear();
756 /// assert!(bv.is_empty());
757 /// ```
758 #[inline]
759 pub fn clear(&mut self) {
760 self.truncate(0);
761 }
762
763 /// Gets the length of the bit-vector.
764 ///
765 /// This is equivalent to `BitSlice::len`; it is provided as an inherent
766 /// method here rather than relying on `Deref` forwarding so that you can
767 /// write `BitVec::len` as a named function item.
768 ///
769 /// ## Original
770 ///
771 /// [`Vec::len`](alloc::vec::Vec::len)
772 #[inline]
773 #[cfg(not(tarpaulin_include))]
774 pub fn len(&self) -> usize {
775 self.bitspan.len()
776 }
777
778 /// Tests if the bit-vector is empty.
779 ///
780 /// This is equivalent to `BitSlice::is_empty`; it is provided as an
781 /// inherent method here rather than relying on `Deref` forwarding so that
782 /// you can write `BitVec::is_empty` as a named function item.
783 ///
784 /// ## Original
785 ///
786 /// [`Vec::is_empty`](alloc::vec::Vec::is_empty)
787 #[inline]
788 #[cfg(not(tarpaulin_include))]
789 pub fn is_empty(&self) -> bool {
790 self.bitspan.len() == 0
791 }
792
793 /// Splits the bit-vector in half at an index, moving `self[at ..]` out into
794 /// a new bit-vector.
795 ///
796 /// ## Original
797 ///
798 /// [`Vec::split_off`](alloc::vec::Vec::split_off)
799 ///
800 /// ## Examples
801 ///
802 /// ```rust
803 /// use bitvec::prelude::*;
804 ///
805 /// let mut bv = bitvec![0, 1, 0, 0, 1];
806 /// let bv2 = bv.split_off(2);
807 /// assert_eq!((&*bv, &*bv2), (bits![0, 1], bits![0, 0, 1]));
808 /// ```
809 #[inline]
810 pub fn split_off(&mut self, at: usize) -> Self {
811 let len = self.len();
812 self.assert_in_bounds(at, 0 ..= len);
813 let (this, that) = unsafe {
814 self.bitspan
815 .into_bitslice_mut()
816 .split_at_unchecked_mut_noalias(at)
817 };
818 self.bitspan = this.as_mut_bitspan();
819 Self::from_bitslice(that)
820 }
821
822 /// Resizes the bit-vector to a new length, using a function to produce each
823 /// inserted bit.
824 ///
825 /// If `new_len` is less than `self.len()`, this is a truncate operation; if
826 /// it is greater, then `self` is extended by repeatedly pushing `func()`.
827 ///
828 /// ## Original
829 ///
830 /// [`Vec::resize_with`](alloc::vec::Vec::resize_with)
831 ///
832 /// ## API Differences
833 ///
834 /// The generator function receives the index into which its bit will be
835 /// placed.
836 ///
837 /// ## Examples
838 ///
839 /// ```rust
840 /// use bitvec::prelude::*;
841 ///
842 /// let mut bv = bitvec![1; 2];
843 /// bv.resize_with(5, |idx| idx % 2 == 1);
844 /// assert_eq!(bv, bits![1, 1, 0, 1, 0]);
845 /// ```
846 #[inline]
847 pub fn resize_with<F>(&mut self, new_len: usize, mut func: F)
848 where F: FnMut(usize) -> bool {
849 let old_len = self.len();
850 self.resize(new_len, false);
851 if new_len > old_len {
852 for (bitptr, idx) in unsafe { self.get_unchecked_mut(old_len ..) }
853 .as_mut_bitptr_range()
854 .zip(old_len ..)
855 {
856 unsafe {
857 bitptr.write(func(idx));
858 }
859 }
860 }
861 }
862
863 /// Destroys the `BitVec` handle without destroying the bit-vector
864 /// allocation. The allocation is returned as an `&mut BitSlice` that lasts
865 /// for the remaining program lifetime.
866 ///
867 /// You *may* call [`BitBox::from_raw`] on this slice handle exactly once in
868 /// order to reap the allocation before program exit. That function takes a
869 /// mutable pointer, not a mutable reference, so you must ensure that the
870 /// returned reference is never used again after restoring the allocation
871 /// handle.
872 ///
873 /// ## Original
874 ///
875 /// [`Vec::leak`](alloc::vec::Vec::leak)
876 ///
877 /// ## Examples
878 ///
879 /// ```rust
880 /// use bitvec::prelude::*;
881 ///
882 /// let bv = bitvec![0, 0, 1];
883 /// let static_bits: &'static mut BitSlice = bv.leak();
884 /// static_bits.set(0, true);
885 /// assert_eq!(static_bits, bits![1, 0, 1]);
886 ///
887 /// let bb = unsafe { BitBox::from_raw(static_bits) };
888 /// // static_bits may no longer be used.
889 /// drop(bb); // explicitly reap memory before program exit
890 /// ```
891 ///
892 /// [`BitBox::leak`]: crate::boxed::BitBox::leak
893 #[inline]
894 #[cfg(not(tarpaulin_include))]
895 pub fn leak<'a>(self) -> &'a mut BitSlice<T, O> {
896 self.into_boxed_bitslice().pipe(BitBox::leak)
897 }
898
899 /// Resizes the bit-vector to a new length. New bits are initialized to
900 /// `value`.
901 ///
902 /// ## Original
903 ///
904 /// [`Vec::resize`](alloc::vec::Vec::resize)
905 ///
906 /// ## Examples
907 ///
908 /// ```rust
909 /// use bitvec::prelude::*;
910 ///
911 /// let mut bv = bitvec![0; 2];
912 /// bv.resize(5, true);
913 /// assert_eq!(bv, bits![0, 0, 1, 1, 1]);
914 /// ```
915 #[inline]
916 pub fn resize(&mut self, new_len: usize, value: bool) {
917 let len = self.len();
918 if new_len > len {
919 self.reserve(new_len - len);
920 unsafe {
921 self.set_len(new_len);
922 self.get_unchecked_mut(len .. new_len).fill(value);
923 }
924 }
925 else {
926 self.truncate(new_len);
927 }
928 }
929
930 #[inline]
931 #[cfg(not(tarpaulin_include))]
932 #[allow(missing_docs, clippy::missing_docs_in_private_items)]
933 #[deprecated = "use `.extend_from_bitslice()` or `.extend_from_raw_slice()` \
934 instead"]
935 pub fn extend_from_slice<T2, O2>(&mut self, other: &BitSlice<T2, O2>)
936 where
937 T2: BitStore,
938 O2: BitOrder,
939 {
940 self.extend_from_bitslice(other);
941 }
942
943 /// Extends `self` by copying an internal range of its bit-slice as the
944 /// region to append.
945 ///
946 /// ## Original
947 ///
948 /// [`Vec::extend_from_within`](alloc::vec::Vec::extend_from_within)
949 ///
950 /// ## Panics
951 ///
952 /// This panics if `src` is not within `0 .. self.len()`.
953 ///
954 /// ## Examples
955 ///
956 /// ```rust
957 /// use bitvec::prelude::*;
958 ///
959 /// let mut bv = bitvec![0, 1, 0, 0, 1];
960 /// bv.extend_from_within(1 .. 4);
961 /// assert_eq!(bv, bits![0, 1, 0, 0, 1, 1, 0, 0]);
962 /// ```
963 #[inline]
964 pub fn extend_from_within<R>(&mut self, src: R)
965 where R: RangeExt<usize> {
966 let old_len = self.len();
967 let src = src.normalize(0, old_len);
968 self.assert_in_bounds(src.end, 0 .. old_len);
969 self.resize(old_len + src.len(), false);
970 unsafe {
971 self.copy_within_unchecked(src, old_len);
972 }
973 }
974
975 /// Modifies [`self.drain()`] so that the removed bit-slice is instead
976 /// replaced with the contents of another bit-stream.
977 ///
978 /// As with `.drain()`, the specified range is always removed from the
979 /// bit-vector even if the splicer is not fully consumed, and the splicer
980 /// does not specify how many bits are removed if it leaks.
981 ///
982 /// The replacement source is only consumed when the splicer drops; however,
983 /// it may be pulled before then. The replacement source cannot assume that
984 /// there will be a delay between creation of the splicer and when it must
985 /// begin producing bits.
986 ///
987 /// This copies the `Vec::splice` implementation; see its documentation for
988 /// more details about how the replacement should act.
989 ///
990 /// ## Original
991 ///
992 /// [`Vec::splice`](alloc::vec::Vec::splice)
993 ///
994 /// ## Panics
995 ///
996 /// This panics if `range` departs `0 .. self.len()`.
997 ///
998 /// ## Examples
999 ///
1000 /// ```rust
1001 /// use bitvec::prelude::*;
1002 ///
1003 /// let mut bv = bitvec![0, 1, 1];
1004 /// // a b c
1005 /// let mut yank = bv.splice(
1006 /// .. 2,
1007 /// bits![static 1, 1, 0].iter().by_vals(),
1008 /// // d e f
1009 /// );
1010 ///
1011 /// assert!(!yank.next().unwrap()); // a
1012 /// assert!(yank.next().unwrap()); // b
1013 /// drop(yank);
1014 /// assert_eq!(bv, bits![1, 1, 0, 1]);
1015 /// // d e f c
1016 /// ```
1017 ///
1018 /// [`self.drain()`]: Self::drain
1019 #[inline]
1020 pub fn splice<R, I>(
1021 &mut self,
1022 range: R,
1023 replace_with: I,
1024 ) -> Splice<T, O, I::IntoIter>
1025 where
1026 R: RangeBounds<usize>,
1027 I: IntoIterator<Item = bool>,
1028 {
1029 Splice::new(self.drain(range), replace_with)
1030 }
1031}