Coverage Report

Created: 2025-07-02 06:18

/rust/registry/src/index.crates.io-6f17d22bba15001f/bitvec-1.0.1/src/vec.rs
Line
Count
Source (jump to first uncovered line)
1
#![doc = include_str!("../doc/vec.md")]
2
#![cfg(feature = "alloc")]
3
4
#[cfg(not(feature = "std"))]
5
use alloc::vec;
6
use alloc::vec::Vec;
7
use core::{
8
  mem::{
9
    self,
10
    ManuallyDrop,
11
  },
12
  ptr,
13
  slice,
14
};
15
16
use tap::Pipe;
17
use wyz::comu::{
18
  Const,
19
  Mut,
20
};
21
22
pub use self::iter::{
23
  Drain,
24
  Splice,
25
};
26
pub use crate::boxed::IntoIter;
27
use crate::{
28
  boxed::BitBox,
29
  index::BitIdx,
30
  mem::bits_of,
31
  order::{
32
    BitOrder,
33
    Lsb0,
34
  },
35
  ptr::{
36
    AddressExt,
37
    BitPtr,
38
    BitSpan,
39
    BitSpanError,
40
  },
41
  slice::BitSlice,
42
  store::BitStore,
43
  view::BitView,
44
};
45
46
mod api;
47
mod iter;
48
mod ops;
49
mod tests;
50
mod traits;
51
52
#[repr(C)]
53
#[doc = include_str!("../doc/vec/BitVec.md")]
54
pub struct BitVec<T = usize, O = Lsb0>
55
where
56
  T: BitStore,
57
  O: BitOrder,
58
{
59
  /// Span description of the live bits in the allocation.
60
  bitspan:  BitSpan<Mut, T, O>,
61
  /// Allocation capacity, measured in `T` elements.
62
  capacity: usize,
63
}
64
65
/// Constructors.
66
impl<T, O> BitVec<T, O>
67
where
68
  T: BitStore,
69
  O: BitOrder,
70
{
71
  /// An empty bit-vector with no backing allocation.
72
  pub const EMPTY: Self = Self {
73
    bitspan:  BitSpan::EMPTY,
74
    capacity: 0,
75
  };
76
77
  /// Creates a new bit-vector by repeating a bit for the desired length.
78
  ///
79
  /// ## Examples
80
  ///
81
  /// ```rust
82
  /// use bitvec::prelude::*;
83
  ///
84
  /// let zeros = BitVec::<u8, Msb0>::repeat(false, 50);
85
  /// let ones = BitVec::<u16, Lsb0>::repeat(true, 50);
86
  /// ```
87
  #[inline]
88
0
  pub fn repeat(bit: bool, len: usize) -> Self {
89
0
    let mut out = Self::with_capacity(len);
90
0
    unsafe {
91
0
      out.set_len(len);
92
0
      out.as_raw_mut_slice().fill_with(|| {
93
0
        BitStore::new(if bit { !<T::Mem>::ZERO } else { <T::Mem>::ZERO })
94
0
      });
95
0
    }
96
0
    out
97
0
  }
98
99
  /// Copies the contents of a bit-slice into a new heap allocation.
100
  ///
101
  /// This copies the raw underlying elements into a new allocation, and sets
102
  /// the produced bit-vector to use the same memory layout as the originating
103
  /// bit-slice. This means that it may begin at any bit in the first element,
104
  /// not just the zeroth bit. If you require this property, call
105
  /// [`.force_align()`].
106
  ///
107
  /// Dead bits in the copied memory elements are guaranteed to be zeroed.
108
  ///
109
  /// ## Examples
110
  ///
111
  /// ```rust
112
  /// use bitvec::prelude::*;
113
  ///
114
  /// let bits = bits![0, 1, 0, 0, 1];
115
  /// let bv = BitVec::from_bitslice(bits);
116
  /// assert_eq!(bv, bits);
117
  /// ```
118
  ///
119
  /// [`.force_align()`]: Self::force_align
120
  #[inline]
121
0
  pub fn from_bitslice(slice: &BitSlice<T, O>) -> Self {
122
0
    let bitspan = slice.as_bitspan();
123
0
124
0
    let mut vec = bitspan
125
0
      .elements()
126
0
      .pipe(Vec::with_capacity)
127
0
      .pipe(ManuallyDrop::new);
128
0
    vec.extend(slice.domain());
129
0
130
0
    let bitspan = unsafe {
131
0
      BitSpan::new_unchecked(
132
0
        vec.as_mut_ptr().cast::<T>().into_address(),
133
0
        bitspan.head(),
134
0
        bitspan.len(),
135
0
      )
136
0
    };
137
0
    let capacity = vec.capacity();
138
0
    Self { bitspan, capacity }
139
0
  }
140
141
  /// Constructs a new bit-vector from a single element.
142
  ///
143
  /// This copies `elem` into a new heap allocation, and sets the bit-vector
144
  /// to cover it entirely.
145
  ///
146
  /// ## Examples
147
  ///
148
  /// ```rust
149
  /// use bitvec::prelude::*;
150
  ///
151
  /// let bv = BitVec::<_, Msb0>::from_element(1u8);
152
  /// assert!(bv[7]);
153
  /// ```
154
  #[inline]
155
0
  pub fn from_element(elem: T) -> Self {
156
0
    Self::from_vec(vec![elem])
157
0
  }
158
159
  /// Constructs a new bit-vector from a slice of memory elements.
160
  ///
161
  /// This copies `slice` into a new heap allocation, and sets the bit-vector
162
  /// to cover it entirely.
163
  ///
164
  /// ## Panics
165
  ///
166
  /// This panics if `slice` exceeds bit-vector capacity.
167
  ///
168
  /// ## Examples
169
  ///
170
  /// ```rust
171
  /// use bitvec::prelude::*;
172
  ///
173
  /// let slice = &[0u8, 1, 2, 3];
174
  /// let bv = BitVec::<_, Lsb0>::from_slice(slice);
175
  /// assert_eq!(bv.len(), 32);
176
  /// ```
177
  #[inline]
178
0
  pub fn from_slice(slice: &[T]) -> Self {
179
0
    Self::try_from_slice(slice).unwrap()
180
0
  }
181
182
  /// Fallibly constructs a new bit-vector from a slice of memory elements.
183
  ///
184
  /// This fails early if `slice` exceeds bit-vector capacity. If it is not,
185
  /// then `slice` is copied into a new heap allocation and fully spanned by
186
  /// the returned bit-vector.
187
  ///
188
  /// ## Examples
189
  ///
190
  /// ```rust
191
  /// use bitvec::prelude::*;
192
  ///
193
  /// let slice = &[0u8, 1, 2, 3];
194
  /// let bv = BitVec::<_, Lsb0>::try_from_slice(slice).unwrap();
195
  /// assert_eq!(bv.len(), 32);
196
  /// ```
197
  #[inline]
198
0
  pub fn try_from_slice(slice: &[T]) -> Result<Self, BitSpanError<T>> {
199
0
    BitSlice::<T, O>::try_from_slice(slice).map(Self::from_bitslice)
200
0
  }
201
202
  /// Converts a regular vector in-place into a bit-vector.
203
  ///
204
  /// The produced bit-vector spans every bit in the original vector. No
205
  /// reällocation occurs; this is purely a transform of the handle.
206
  ///
207
  /// ## Panics
208
  ///
209
  /// This panics if the source vector is too long to view as a bit-slice.
210
  ///
211
  /// ## Examples
212
  ///
213
  /// ```rust
214
  /// use bitvec::prelude::*;
215
  ///
216
  /// let v = vec![0u8, 1, 2, 3];
217
  /// let bv = BitVec::<_, Msb0>::from_vec(v);
218
  /// assert_eq!(bv.len(), 32);
219
  /// ```
220
  #[inline]
221
0
  pub fn from_vec(vec: Vec<T>) -> Self {
222
0
    Self::try_from_vec(vec)
223
0
      .expect("vector was too long to be converted into a `BitVec`")
224
0
  }
225
226
  /// Attempts to convert a regular vector in-place into a bit-vector.
227
  ///
228
  /// This fails if the source vector is too long to view as a bit-slice. On
229
  /// success, the produced bit-vector spans every bit in the original vector.
230
  /// No reällocation occurs; this is purely a transform of the handle.
231
  ///
232
  /// ## Examples
233
  ///
234
  /// ```rust
235
  /// use bitvec::prelude::*;
236
  ///
237
  /// let v = vec![0u8; 20];
238
  /// assert_eq!(BitVec::<_, Msb0>::try_from_vec(v).unwrap().len(), 160);
239
  /// ```
240
  ///
241
  /// It is not practical to allocate a vector that will fail this conversion.
242
  #[inline]
243
0
  pub fn try_from_vec(vec: Vec<T>) -> Result<Self, Vec<T>> {
244
0
    let mut vec = ManuallyDrop::new(vec);
245
0
    let capacity = vec.capacity();
246
0
247
0
    BitPtr::from_mut_slice(vec.as_mut_slice())
248
0
      .span(vec.len() * bits_of::<T::Mem>())
249
0
      .map(|bitspan| Self { bitspan, capacity })
250
0
      .map_err(|_| ManuallyDrop::into_inner(vec))
251
0
  }
252
253
  /// Appends the contents of a bit-slice to a bit-vector.
254
  ///
255
  /// This can extend from a bit-slice of any type parameters; it is not
256
  /// restricted to using the same parameters as `self`. However, when the
257
  /// type parameters *do* match, it is possible for this to use a batch-copy
258
  /// optimization to go faster than the individual-bit crawl that is
259
  /// necessary when they differ.
260
  ///
261
  /// Until Rust provides extensive support for specialization in trait
262
  /// implementations, you should use this method whenever you are extending
263
  /// from a `BitSlice` proper, and only use the general [`.extend()`]
264
  /// implementation if you are required to use a generic `bool` source.
265
  ///
266
  /// ## Original
267
  ///
268
  /// [`Vec::extend_from_slice`](alloc::vec::Vec::extend_from_slice)
269
  ///
270
  /// ## Examples
271
  ///
272
  /// ```rust
273
  /// use bitvec::prelude::*;
274
  ///
275
  /// let mut bv = bitvec![0, 1];
276
  /// bv.extend_from_bitslice(bits![0, 1, 0, 0, 1]);
277
  /// assert_eq!(bv, bits![0, 1, 0, 1, 0, 0, 1]);
278
  /// ```
279
  ///
280
  /// [`.extend()`]: https://docs.rs/bitvec/latest/bitvec/vec/struct.Vec.html#impl-Extend
281
  #[inline]
282
0
  pub fn extend_from_bitslice<T2, O2>(&mut self, other: &BitSlice<T2, O2>)
283
0
  where
284
0
    T2: BitStore,
285
0
    O2: BitOrder,
286
0
  {
287
0
    let len = self.len();
288
0
    let olen = other.len();
289
0
    self.resize(len + olen, false);
290
0
    unsafe { self.get_unchecked_mut(len ..) }.clone_from_bitslice(other);
291
0
  }
292
293
  /// Appends a slice of `T` elements to a bit-vector.
294
  ///
295
  /// The slice is viewed as a `BitSlice<T, O>`, then appended directly to the
296
  /// bit-vector.
297
  ///
298
  /// ## Original
299
  ///
300
  /// [`Vec::extend_from_slice`](alloc::vec::Vec::extend_from_slice)
301
  #[inline]
302
0
  pub fn extend_from_raw_slice(&mut self, slice: &[T]) {
303
0
    self.extend_from_bitslice(slice.view_bits::<O>());
304
0
  }
305
}
306
307
/// Converters.
308
impl<T, O> BitVec<T, O>
309
where
310
  T: BitStore,
311
  O: BitOrder,
312
{
313
  /// Explicitly views the bit-vector as a bit-slice.
314
  #[inline]
315
0
  pub fn as_bitslice(&self) -> &BitSlice<T, O> {
316
0
    unsafe { self.bitspan.into_bitslice_ref() }
317
0
  }
318
319
  /// Explicitly views the bit-vector as a mutable bit-slice.
320
  #[inline]
321
0
  pub fn as_mut_bitslice(&mut self) -> &mut BitSlice<T, O> {
322
0
    unsafe { self.bitspan.into_bitslice_mut() }
323
0
  }
324
325
  /// Views the bit-vector as a slice of its underlying memory elements.
326
  #[inline]
327
0
  pub fn as_raw_slice(&self) -> &[T] {
328
0
    let (data, len) =
329
0
      (self.bitspan.address().to_const(), self.bitspan.elements());
330
0
    unsafe { slice::from_raw_parts(data, len) }
331
0
  }
332
333
  /// Views the bit-vector as a mutable slice of its underlying memory
334
  /// elements.
335
  #[inline]
336
0
  pub fn as_raw_mut_slice(&mut self) -> &mut [T] {
337
0
    let (data, len) =
338
0
      (self.bitspan.address().to_mut(), self.bitspan.elements());
339
0
    unsafe { slice::from_raw_parts_mut(data, len) }
340
0
  }
341
342
  /// Creates an unsafe shared bit-pointer to the start of the buffer.
343
  ///
344
  /// ## Original
345
  ///
346
  /// [`Vec::as_ptr`](alloc::vec::Vec::as_ptr)
347
  ///
348
  /// ## Safety
349
  ///
350
  /// You must initialize the contents of the underlying buffer before
351
  /// accessing memory through this pointer. See the `BitPtr` documentation
352
  /// for more details.
353
  #[inline]
354
0
  pub fn as_bitptr(&self) -> BitPtr<Const, T, O> {
355
0
    self.bitspan.to_bitptr().to_const()
356
0
  }
357
358
  /// Creates an unsafe writable bit-pointer to the start of the buffer.
359
  ///
360
  /// ## Original
361
  ///
362
  /// [`Vec::as_mut_ptr`](alloc::vec::Vec::as_mut_ptr)
363
  ///
364
  /// ## Safety
365
  ///
366
  /// You must initialize the contents of the underlying buffer before
367
  /// accessing memory through this pointer. See the `BitPtr` documentation
368
  /// for more details.
369
  #[inline]
370
0
  pub fn as_mut_bitptr(&mut self) -> BitPtr<Mut, T, O> {
371
0
    self.bitspan.to_bitptr()
372
0
  }
373
374
  /// Converts a bit-vector into a boxed bit-slice.
375
  ///
376
  /// This may cause a reällocation to drop any excess capacity.
377
  ///
378
  /// ## Original
379
  ///
380
  /// [`Vec::into_boxed_slice`](alloc::vec::Vec::into_boxed_slice)
381
  ///
382
  /// ## Examples
383
  ///
384
  /// ```rust
385
  /// use bitvec::prelude::*;
386
  ///
387
  /// let bv = bitvec![0, 1, 0, 0, 1];
388
  /// let bb = bv.into_boxed_bitslice();
389
  /// ```
390
  #[inline]
391
0
  pub fn into_boxed_bitslice(self) -> BitBox<T, O> {
392
0
    let mut bitspan = self.bitspan;
393
0
    let mut boxed =
394
0
      self.into_vec().into_boxed_slice().pipe(ManuallyDrop::new);
395
0
    unsafe {
396
0
      bitspan.set_address(boxed.as_mut_ptr().into_address());
397
0
      BitBox::from_raw(bitspan.into_bitslice_ptr_mut())
398
0
    }
399
0
  }
400
401
  /// Converts a bit-vector into a `Vec` of its underlying storage.
402
  ///
403
  /// The produced vector contains all elements that contained live bits. Dead
404
  /// bits have an unspecified value; you should call [`.set_uninitialized()`]
405
  /// before converting into a vector.
406
  ///
407
  /// This does not affect the allocated memory; it is purely a conversion of
408
  /// the handle.
409
  ///
410
  /// ## Examples
411
  ///
412
  /// ```rust
413
  /// use bitvec::prelude::*;
414
  ///
415
  /// let bv = bitvec![u8, Msb0; 0, 1, 0, 0, 1];
416
  /// let v = bv.into_vec();
417
  /// assert_eq!(v[0] & 0xF8, 0b01001_000);
418
  /// ```
419
  ///
420
  /// [`.set_uninitialized()`]: Self::set_uninitialized
421
  #[inline]
422
0
  pub fn into_vec(self) -> Vec<T> {
423
0
    let (bitspan, capacity) = (self.bitspan, self.capacity);
424
0
    mem::forget(self);
425
0
    unsafe {
426
0
      Vec::from_raw_parts(
427
0
        bitspan.address().to_mut(),
428
0
        bitspan.elements(),
429
0
        capacity,
430
0
      )
431
0
    }
432
0
  }
433
}
434
435
/// Utilities.
436
impl<T, O> BitVec<T, O>
437
where
438
  T: BitStore,
439
  O: BitOrder,
440
{
441
  /// Overwrites each element (visible in [`.as_raw_mut_slice()`]) with a new
442
  /// bit-pattern.
443
  ///
444
  /// This unconditionally writes `element` into each element in the backing
445
  /// slice, without altering the bit-vector’s length or capacity.
446
  ///
447
  /// This guarantees that dead bits visible in [`.as_raw_slice()`] but not
448
  /// [`.as_bitslice()`] are initialized according to the bit-pattern of
449
  /// `element.` The elements not visible in the raw slice, but present in the
450
  /// allocation, do *not* specify a value. You may not rely on them being
451
  /// zeroed *or* being set to the `element` bit-pattern.
452
  ///
453
  /// ## Parameters
454
  ///
455
  /// - `&mut self`
456
  /// - `element`: The bit-pattern with which each live element in the backing
457
  ///   store is initialized.
458
  ///
459
  /// ## Examples
460
  ///
461
  /// ```rust
462
  /// use bitvec::prelude::*;
463
  ///
464
  /// let mut bv = bitvec![u8, Msb0; 0; 20];
465
  /// assert_eq!(bv.as_raw_slice(), [0; 3]);
466
  /// bv.set_elements(0xA5);
467
  /// assert_eq!(bv.as_raw_slice(), [0xA5; 3]);
468
  /// ```
469
  ///
470
  /// [`.as_bitslice()`]: Self::as_bitslice
471
  /// [`.as_raw_mut_slice()`]: Self::as_raw_mut_slice
472
  /// [`.as_raw_slice()`]: Self::as_raw_slice
473
  #[inline]
474
0
  pub fn set_elements(&mut self, element: T::Mem) {
475
0
    self.as_raw_mut_slice()
476
0
      .iter_mut()
477
0
      .for_each(|elt| elt.store_value(element));
478
0
  }
479
480
  /// Sets the uninitialized bits of a bit-vector to a known value.
481
  ///
482
  /// This method modifies all bits that are observable in [`.as_raw_slice()`]
483
  /// but *not* observable in [`.as_bitslice()`] to a known value.
484
  /// Memory beyond the raw-slice view, but still within the allocation, is
485
  /// considered fully dead and will never be seen.
486
  ///
487
  /// This can be used to zero the unused memory so that when viewed as a raw
488
  /// slice, unused bits have a consistent and predictable value.
489
  ///
490
  /// ## Examples
491
  ///
492
  /// ```rust
493
  /// use bitvec::prelude::*;
494
  ///
495
  /// let mut bv = 0b1101_1100u8.view_bits::<Lsb0>().to_bitvec();
496
  /// assert_eq!(bv.as_raw_slice()[0], 0b1101_1100u8);
497
  ///
498
  /// bv.truncate(4);
499
  /// assert_eq!(bv.count_ones(), 2);
500
  /// assert_eq!(bv.as_raw_slice()[0], 0b1101_1100u8);
501
  ///
502
  /// bv.set_uninitialized(false);
503
  /// assert_eq!(bv.as_raw_slice()[0], 0b0000_1100u8);
504
  ///
505
  /// bv.set_uninitialized(true);
506
  /// assert_eq!(bv.as_raw_slice()[0], 0b1111_1100u8);
507
  /// ```
508
  ///
509
  /// [`.as_bitslice()`]: Self::as_bitslice
510
  /// [`.as_raw_slice()`]: Self::as_raw_slice
511
  #[inline]
512
0
  pub fn set_uninitialized(&mut self, value: bool) {
513
0
    let head = self.bitspan.head().into_inner() as usize;
514
0
    let last = head + self.len();
515
0
    let all = self.as_raw_mut_slice().view_bits_mut::<O>();
516
0
    unsafe {
517
0
      all.get_unchecked_mut(.. head).fill(value);
518
0
      all.get_unchecked_mut(last ..).fill(value);
519
0
    }
520
0
  }
521
522
  /// Ensures that the live region of the bit-vector’s contents begin at the
523
  /// front edge of the buffer.
524
  ///
525
  /// `BitVec` has performance optimizations where it moves its view of its
526
  /// buffer contents in order to avoid needless moves of its data within the
527
  /// buffer. This can lead to unexpected contents of the raw memory values,
528
  /// so this method ensures that the semantic contents of the bit-vector
529
  /// match its in-memory storage.
530
  ///
531
  /// ## Examples
532
  ///
533
  /// ```rust
534
  /// use bitvec::prelude::*;
535
  ///
536
  /// let data = 0b00_1111_00u8;
537
  /// let bits = data.view_bits::<Msb0>();
538
  ///
539
  /// let mut bv = bits[2 .. 6].to_bitvec();
540
  /// assert_eq!(bv, bits![1; 4]);
541
  /// assert_eq!(bv.as_raw_slice()[0], data);
542
  ///
543
  /// bv.force_align();
544
  /// assert_eq!(bv, bits![1; 4]);
545
  /// // BitVec does not specify the value of dead bits in its buffer.
546
  /// assert_eq!(bv.as_raw_slice()[0] & 0xF0, 0xF0);
547
  /// ```
548
  #[inline]
549
0
  pub fn force_align(&mut self) {
550
0
    let mut bitspan = self.bitspan;
551
0
    let len = bitspan.len();
552
0
    let head = self.bitspan.head();
553
0
    if head == BitIdx::MIN {
554
0
      return;
555
0
    }
556
0
    let head = head.into_inner() as usize;
557
0
    let last = head + len;
558
0
    unsafe {
559
0
      bitspan.set_head(BitIdx::MIN);
560
0
      bitspan.set_len(last);
561
0
      bitspan
562
0
        .into_bitslice_mut()
563
0
        .copy_within_unchecked(head .., 0);
564
0
      bitspan.set_len(len);
565
0
    }
566
0
    self.bitspan = bitspan;
567
0
  }
568
569
  /// Sets the starting-bit index of the span descriptor.
570
  ///
571
  /// ## Safety
572
  ///
573
  /// The new `head` value must not cause the final bits of the bit-vector to
574
  /// depart allocated memory.
575
0
  pub(crate) unsafe fn set_head(&mut self, new_head: BitIdx<T::Mem>) {
576
0
    self.bitspan.set_head(new_head);
577
0
  }
578
579
  /// Sets a bit-vector’s length without checking that it fits in the
580
  /// allocated capacity.
581
  ///
582
  /// ## Safety
583
  ///
584
  /// `new_len` must not exceed `self.capacity()`.
585
0
  pub(crate) unsafe fn set_len_unchecked(&mut self, new_len: usize) {
586
0
    self.bitspan.set_len(new_len);
587
0
  }
588
589
  /// Asserts that a length can be encoded into the bit-vector handle.
590
  ///
591
  /// ## Panics
592
  ///
593
  /// This panics if `len` is too large to encode into a `BitSpan`.
594
  #[inline]
595
0
  fn assert_len_encodable(len: usize) {
596
0
    assert!(
597
0
      BitSpan::<Const, T, O>::len_encodable(len),
598
0
      "bit-vector capacity exceeded: {} > {}",
599
      len,
600
      BitSlice::<T, O>::MAX_BITS,
601
    );
602
0
  }
603
604
  /// Reserves some memory through the underlying vector.
605
  ///
606
  /// ## Parameters
607
  ///
608
  /// - `&mut self`
609
  /// - `additional`: The amount of additional space required after
610
  ///   `self.len()` in the allocation.
611
  /// - `func`: A function that manipulates the memory reservation of the
612
  ///   underlying vector.
613
  ///
614
  /// ## Behavior
615
  ///
616
  /// `func` should perform the appropriate action to allocate space for at
617
  /// least `additional` more bits. After it returns, the underlying vector is
618
  /// extended with zero-initialized elements until `self.len() + additional`
619
  /// bits have been given initialized memory.
620
  #[inline]
621
0
  fn do_reservation(
622
0
    &mut self,
623
0
    additional: usize,
624
0
    func: impl FnOnce(&mut Vec<T>, usize),
625
0
  ) {
626
0
    let len = self.len();
627
0
    let new_len = len.saturating_add(additional);
628
0
    Self::assert_len_encodable(new_len);
629
0
630
0
    let (head, elts) = (self.bitspan.head(), self.bitspan.elements());
631
0
    let new_elts =
632
0
      crate::mem::elts::<T>(head.into_inner() as usize + new_len);
633
0
634
0
    let extra_elts = new_elts - elts;
635
0
    self.with_vec(|vec| {
636
0
      func(&mut **vec, extra_elts);
637
0
      //  Ensure that any new elements are initialized.
638
0
      vec.resize_with(new_elts, || <T as BitStore>::ZERO);
639
0
    });
640
0
  }
641
642
  /// Briefly constructs an ordinary `Vec` controlling the buffer, allowing
643
  /// operations to be applied to the memory allocation.
644
  ///
645
  /// ## Parameters
646
  ///
647
  /// - `&mut self`
648
  /// - `func`: A function which may interact with the memory allocation.
649
  ///
650
  /// After `func` runs, `self` is updated with the temporary `Vec`’s address
651
  /// and capacity.
652
  #[inline]
653
0
  fn with_vec<F, R>(&mut self, func: F) -> R
654
0
  where F: FnOnce(&mut ManuallyDrop<Vec<T>>) -> R {
655
0
    let mut vec = unsafe { ptr::read(self) }
656
0
      .into_vec()
657
0
      .pipe(ManuallyDrop::new);
658
0
    let out = func(&mut vec);
659
0
660
0
    unsafe {
661
0
      self.bitspan.set_address(vec.as_mut_ptr().into_address());
662
0
    }
663
0
    self.capacity = vec.capacity();
664
0
    out
665
0
  }
666
}