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}