Skip to main content

bump_scope/
bump_vec.rs

1use core::{
2    alloc::Layout,
3    borrow::{Borrow, BorrowMut},
4    fmt::Debug,
5    hash::Hash,
6    iter,
7    marker::PhantomData,
8    mem::{ManuallyDrop, MaybeUninit},
9    ops::{Deref, DerefMut, Index, IndexMut, RangeBounds},
10    ptr::{self, NonNull},
11    slice::SliceIndex,
12};
13
14use crate::{
15    BumpBox, ErrorBehavior, FixedBumpVec, NoDrop, SizedTypeProperties,
16    alloc::AllocError,
17    destructure::destructure,
18    fixed_bump_vec::RawFixedBumpVec,
19    min_non_zero_cap,
20    owned_slice::{self, OwnedSlice, TakeOwnedSlice},
21    polyfill::{hint::likely, non_null, pointer, slice},
22    traits::{BumpAllocatorTyped, BumpAllocatorTypedScope},
23};
24
25#[cfg(feature = "panic-on-alloc")]
26use crate::panic_on_error;
27
28mod drain;
29mod into_iter;
30mod splice;
31
32pub use into_iter::IntoIter;
33
34#[cfg(feature = "panic-on-alloc")]
35pub(crate) use drain::Drain;
36
37#[cfg(feature = "panic-on-alloc")]
38pub use splice::Splice;
39
40/// Like [`vec!`](alloc_crate::vec!) but allocates inside a bump allocator, returning a [`BumpVec`].
41///
42/// `$bump` can be any type that implements [`BumpAllocatorTyped`].
43///
44/// # Panics
45/// If used without `try`, panics on allocation failure.
46///
47/// # Errors
48/// If used with `try`, errors on allocation failure.
49///
50/// # Examples
51///
52/// There are three forms of this macro:
53///
54/// - Create an empty [`BumpVec`]:
55/// ```
56/// # use bump_scope::{Bump, bump_vec, BumpVec};
57/// # let bump: Bump = Bump::new();
58/// let vec: BumpVec<i32, _> = bump_vec![in &bump];
59/// assert!(vec.is_empty());
60/// ```
61///
62/// - Create a [`BumpVec`] containing a given list of elements:
63///
64/// ```
65/// # use bump_scope::{Bump, bump_vec};
66/// # let bump: Bump = Bump::new();
67/// let vec = bump_vec![in &bump; 1, 2, 3];
68/// assert_eq!(vec[0], 1);
69/// assert_eq!(vec[1], 2);
70/// assert_eq!(vec[2], 3);
71/// ```
72///
73/// - Create a [`BumpVec`] from a given element and size:
74///
75/// ```
76/// # use bump_scope::{Bump, bump_vec};
77/// # let bump: Bump = Bump::new();
78/// let vec = bump_vec![in &bump; 1; 3];
79/// assert_eq!(vec, [1, 1, 1]);
80/// ```
81///
82/// Note that unlike array expressions this syntax supports all elements
83/// which implement [`Clone`] and the number of elements doesn't have to be
84/// a constant.
85///
86/// This will use `clone` to duplicate an expression, so one should be careful
87/// using this with types having a nonstandard `Clone` implementation. For
88/// example, `bump_vec![in &bump; Rc::new(1); 5]` will create a vector of five references
89/// to the same boxed integer value, not five references pointing to independently
90/// boxed integers.
91///
92/// Also, note that `bump_vec![in &bump; expr; 0]` is allowed, and produces an empty vector.
93/// This will still evaluate `expr`, however, and immediately drop the resulting value, so
94/// be mindful of side effects.
95#[macro_export]
96macro_rules! bump_vec {
97    [in $bump:expr] => {
98        $crate::BumpVec::new_in($bump)
99    };
100    [in $bump:expr; $($values:expr),* $(,)?] => {
101        $crate::__bump_vec_panic_on_alloc![in $bump; $($values),*]
102    };
103    [in $bump:expr; $value:expr; $count:expr] => {
104        $crate::__bump_vec_panic_on_alloc![in $bump; $value; $count]
105    };
106    [try in $bump:expr] => {
107        Ok::<_, $crate::alloc::AllocError>($crate::BumpVec::new_in($bump))
108    };
109    [try in $bump:expr; $($values:expr),* $(,)?] => {
110        $crate::BumpVec::try_from_owned_slice_in([$($values),*], $bump)
111    };
112    [try in $bump:expr; $value:expr; $count:expr] => {
113        $crate::BumpVec::try_from_elem_in($value, $count, $bump)
114    };
115}
116
117#[doc(hidden)]
118#[macro_export]
119#[cfg(feature = "panic-on-alloc")]
120macro_rules! __bump_vec_panic_on_alloc {
121    [in $bump:expr; $($values:expr),* $(,)?] => {
122        $crate::BumpVec::from_owned_slice_in([$($values),*], $bump)
123    };
124    [in $bump:expr; $value:expr; $count:expr] => {
125        $crate::BumpVec::from_elem_in($value, $count, $bump)
126    };
127}
128
129#[doc(hidden)]
130#[macro_export]
131#[cfg(not(feature = "panic-on-alloc"))]
132macro_rules! __bump_vec_panic_on_alloc {
133    [in $bump:expr; $($values:expr),* $(,)?] => {
134        compile_error!(concat!(
135            "the potentially panicking api of `bump_vec!` is not available\n",
136            "help: enable `bump-scope`'s \"panic-on-alloc\" feature or use `try`:\n",
137            "      `bump_vec![try in ",
138            stringify!($bump),
139            "; ",
140            stringify!($($values),*),
141            "]`"
142        ))
143    };
144    [in $bump:expr; $value:expr; $count:expr] => {
145        compile_error!(concat!(
146            "the potentially panicking api of `bump_vec!` is not available\n",
147            "help: enable `bump-scope`'s \"panic-on-alloc\" feature or use `try`:\n",
148            "      `bump_vec![try in ",
149            stringify!($bump),
150            "; ",
151            stringify!($value),
152            "; ",
153            stringify!($count),
154            "]`"
155        ))
156    };
157}
158
159/// A bump allocated [`Vec`](alloc_crate::vec::Vec).
160///
161/// The main difference to `Vec` is that it can be turned into a slice that is live for this bump scope (`'a`).
162/// Such a slice can be live while entering new scopes.
163///
164/// This would not be possible with `Vec`:
165///
166/// ```
167/// # use bump_scope::{Bump, BumpVec};
168/// # let mut bump: Bump = Bump::new();
169/// let bump = bump.as_mut_scope();
170///
171/// let slice = {
172///     let mut vec = BumpVec::new_in(&*bump);
173///
174///     vec.push(1);
175///     vec.push(2);
176///     vec.push(3);
177///
178///     vec.into_slice()
179/// };
180///
181/// bump.scoped(|bump| {
182///     // allocate more things
183///     # _ = bump;
184/// });
185///
186/// assert_eq!(slice, [1, 2, 3]);
187/// ```
188///
189/// # Examples
190///
191/// This type can be used to allocate a slice, when `alloc_*` methods are too limiting:
192/// ```
193/// # use bump_scope::{Bump, BumpVec};
194/// # let bump: Bump = Bump::new();
195/// let mut vec = BumpVec::new_in(&bump);
196///
197/// vec.push(1);
198/// vec.push(2);
199/// vec.push(3);
200///
201/// let slice: &[i32] = vec.into_slice();
202///
203/// assert_eq!(slice, [1, 2, 3]);
204/// ```
205// `BumpString` and `BumpVec<u8>` have the same repr.
206#[repr(C)]
207pub struct BumpVec<T, A: BumpAllocatorTyped> {
208    fixed: RawFixedBumpVec<T>,
209    allocator: A,
210}
211
212impl<T, A: BumpAllocatorTyped> Deref for BumpVec<T, A> {
213    type Target = [T];
214
215    fn deref(&self) -> &Self::Target {
216        unsafe { self.fixed.cook_ref() }
217    }
218}
219
220impl<T, A: BumpAllocatorTyped> DerefMut for BumpVec<T, A> {
221    fn deref_mut(&mut self) -> &mut Self::Target {
222        unsafe { self.fixed.cook_mut() }
223    }
224}
225
226impl<T, A: BumpAllocatorTyped> BumpVec<T, A> {
227    /// # Safety
228    ///
229    /// Must only be called from the drop implementation and a call to this function
230    /// must be the only thing in that drop implementation.
231    #[inline]
232    unsafe fn drop_inner(&mut self) {
233        struct DropGuard<'a, T, A: BumpAllocatorTyped>(&'a mut BumpVec<T, A>);
234
235        impl<T, A: BumpAllocatorTyped> Drop for DropGuard<'_, T, A> {
236            fn drop(&mut self) {
237                if T::IS_ZST || self.0.capacity() == 0 {
238                    return;
239                }
240
241                unsafe {
242                    let ptr = self.0.as_non_null().cast();
243                    let layout = Layout::from_size_align_unchecked(self.0.capacity() * T::SIZE, T::ALIGN);
244                    self.0.allocator.deallocate(ptr, layout);
245                }
246            }
247        }
248
249        let guard = DropGuard(self);
250
251        // destroy the remaining elements
252        guard.0.clear();
253
254        // now `guard` will be dropped and deallocate the memory
255    }
256}
257
258#[cfg(feature = "nightly-dropck-eyepatch")]
259unsafe impl<#[may_dangle] T, A: BumpAllocatorTyped> Drop for BumpVec<T, A> {
260    #[inline]
261    fn drop(&mut self) {
262        unsafe { self.drop_inner() }
263    }
264}
265
266#[cfg(not(feature = "nightly-dropck-eyepatch"))]
267impl<T, A: BumpAllocatorTyped> Drop for BumpVec<T, A> {
268    #[inline]
269    fn drop(&mut self) {
270        unsafe { self.drop_inner() }
271    }
272}
273
274impl<T, A: BumpAllocatorTyped + Default> Default for BumpVec<T, A> {
275    fn default() -> Self {
276        Self::new_in(A::default())
277    }
278}
279
280#[cfg(feature = "panic-on-alloc")]
281impl<T: Clone, A: BumpAllocatorTyped + Clone> Clone for BumpVec<T, A> {
282    fn clone(&self) -> Self {
283        let allocator = self.allocator.clone();
284        let ptr = allocator.allocate_slice::<MaybeUninit<T>>(self.len());
285        let slice = NonNull::slice_from_raw_parts(ptr, self.len());
286        let boxed = unsafe { BumpBox::from_raw(slice) };
287        let boxed = boxed.init_clone(self);
288        let fixed = FixedBumpVec::from_init(boxed);
289        let fixed = unsafe { RawFixedBumpVec::from_cooked(fixed) };
290        Self { fixed, allocator }
291    }
292}
293
294impl<T, A: BumpAllocatorTyped> BumpVec<T, A> {
295    /// Constructs a new empty `BumpVec<T>`.
296    ///
297    /// The vector will not allocate until elements are pushed onto it.
298    ///
299    /// # Examples
300    /// ```
301    /// # use bump_scope::{Bump, BumpVec};
302    /// # let bump: Bump = Bump::new();
303    /// let vec = BumpVec::<i32, _>::new_in(&bump);
304    /// assert_eq!(vec.len(), 0);
305    /// assert_eq!(vec.capacity(), 0);
306    /// ```
307    #[inline]
308    pub const fn new_in(allocator: A) -> Self {
309        Self {
310            fixed: RawFixedBumpVec::EMPTY,
311            allocator,
312        }
313    }
314
315    /// Constructs a new empty vector with at least the specified capacity
316    /// in the provided bump allocator.
317    ///
318    /// The vector will be able to hold `capacity` elements without
319    /// reallocating. If `capacity` is 0, the vector will not allocate.
320    ///
321    /// It is important to note that although the returned vector has the
322    /// minimum *capacity* specified, the vector will have a zero *length*. For
323    /// an explanation of the difference between length and capacity, see
324    /// *[Capacity and reallocation]*.
325    ///
326    /// When `T` is a zero-sized type, there will be no allocation
327    /// and the capacity will always be `usize::MAX`.
328    ///
329    /// [Capacity and reallocation]: alloc_crate::vec::Vec#capacity-and-reallocation
330    ///
331    /// # Panics
332    /// Panics if the allocation fails.
333    ///
334    /// # Examples
335    /// ```
336    /// # use bump_scope::{Bump, BumpVec};
337    /// # let bump: Bump = Bump::new();
338    /// let mut vec = BumpVec::<i32, _>::with_capacity_in(10, &bump);
339    ///
340    /// // The vector contains no items, even though it has capacity for more
341    /// assert_eq!(vec.len(), 0);
342    /// assert!(vec.capacity() >= 10);
343    ///
344    /// // These are all done without reallocating...
345    /// for i in 0..10 {
346    ///     vec.push(i);
347    /// }
348    /// assert_eq!(vec.len(), 10);
349    /// assert!(vec.capacity() >= 10);
350    ///
351    /// // ...but this may make the vector reallocate
352    /// vec.push(11);
353    /// assert_eq!(vec.len(), 11);
354    /// assert!(vec.capacity() >= 11);
355    ///
356    /// // A vector of a zero-sized type will always over-allocate, since no
357    /// // allocation is necessary
358    /// let vec_units = BumpVec::<(), _>::with_capacity_in(10, &bump);
359    /// assert_eq!(vec_units.capacity(), usize::MAX);
360    /// ```
361    #[must_use]
362    #[inline(always)]
363    #[cfg(feature = "panic-on-alloc")]
364    pub fn with_capacity_in(capacity: usize, allocator: A) -> Self {
365        panic_on_error(Self::generic_with_capacity_in(capacity, allocator))
366    }
367
368    /// Constructs a new empty vector with at least the specified capacity
369    /// in the provided bump allocator.
370    ///
371    /// The vector will be able to hold `capacity` elements without
372    /// reallocating. If `capacity` is 0, the vector will not allocate.
373    ///
374    /// It is important to note that although the returned vector has the
375    /// minimum *capacity* specified, the vector will have a zero *length*. For
376    /// an explanation of the difference between length and capacity, see
377    /// *[Capacity and reallocation]*.
378    ///
379    /// When `T` is a zero-sized type, there will be no allocation
380    /// and the capacity will always be `usize::MAX`.
381    ///
382    /// [Capacity and reallocation]: alloc_crate::vec::Vec#capacity-and-reallocation
383    ///
384    /// # Errors
385    /// Errors if the allocation fails.
386    ///
387    /// # Examples
388    /// ```
389    /// # use bump_scope::{Bump, BumpVec};
390    /// # let bump: Bump = Bump::new();
391    /// let mut vec = BumpVec::<i32, _>::try_with_capacity_in(10, &bump)?;
392    ///
393    /// // The vector contains no items, even though it has capacity for more
394    /// assert_eq!(vec.len(), 0);
395    /// assert!(vec.capacity() >= 10);
396    ///
397    /// // These are all done without reallocating...
398    /// for i in 0..10 {
399    ///     vec.push(i);
400    /// }
401    /// assert_eq!(vec.len(), 10);
402    /// assert!(vec.capacity() >= 10);
403    ///
404    /// // ...but this may make the vector reallocate
405    /// vec.push(11);
406    /// assert_eq!(vec.len(), 11);
407    /// assert!(vec.capacity() >= 11);
408    ///
409    /// // A vector of a zero-sized type will always over-allocate, since no
410    /// // allocation is necessary
411    /// let vec_units = BumpVec::<(), _>::try_with_capacity_in(10, &bump)?;
412    /// assert_eq!(vec_units.capacity(), usize::MAX);
413    /// # Ok::<(), bump_scope::alloc::AllocError>(())
414    /// ```
415    #[inline(always)]
416    pub fn try_with_capacity_in(capacity: usize, allocator: A) -> Result<Self, AllocError> {
417        Self::generic_with_capacity_in(capacity, allocator)
418    }
419
420    #[inline]
421    pub(crate) fn generic_with_capacity_in<E: ErrorBehavior>(capacity: usize, allocator: A) -> Result<Self, E> {
422        if T::IS_ZST || capacity == 0 {
423            return Ok(Self {
424                fixed: RawFixedBumpVec::EMPTY,
425                allocator,
426            });
427        }
428
429        Ok(Self {
430            fixed: unsafe { RawFixedBumpVec::allocate(&allocator, capacity)? },
431            allocator,
432        })
433    }
434
435    /// Constructs a new `BumpVec<T>` and pushes `value` `count` times.
436    ///
437    /// # Panics
438    /// Panics if the allocation fails.
439    ///
440    /// # Examples
441    /// ```
442    /// # use bump_scope::{Bump, BumpVec};
443    /// # let bump: Bump = Bump::new();
444    /// let vec = BumpVec::from_elem_in("ho", 3, &bump);
445    /// assert_eq!(vec, ["ho", "ho", "ho"]);
446    /// ```
447    #[must_use]
448    #[inline(always)]
449    #[cfg(feature = "panic-on-alloc")]
450    pub fn from_elem_in(value: T, count: usize, allocator: A) -> Self
451    where
452        T: Clone,
453    {
454        panic_on_error(Self::generic_from_elem_in(value, count, allocator))
455    }
456
457    /// Constructs a new `BumpVec<T>` and pushes `value` `count` times.
458    ///
459    /// # Errors
460    /// Errors if the allocation fails.
461    ///
462    /// # Examples
463    /// ```
464    /// # use bump_scope::{Bump, BumpVec};
465    /// # let bump: Bump = Bump::new();
466    /// let vec = BumpVec::try_from_elem_in("ho", 3, &bump)?;
467    /// assert_eq!(vec, ["ho", "ho", "ho"]);
468    /// # Ok::<(), bump_scope::alloc::AllocError>(())
469    /// ```
470    #[inline(always)]
471    pub fn try_from_elem_in(value: T, count: usize, allocator: A) -> Result<Self, AllocError>
472    where
473        T: Clone,
474    {
475        Self::generic_from_elem_in(value, count, allocator)
476    }
477
478    #[inline]
479    pub(crate) fn generic_from_elem_in<E: ErrorBehavior>(value: T, count: usize, allocator: A) -> Result<Self, E>
480    where
481        T: Clone,
482    {
483        let mut vec = Self::generic_with_capacity_in(count, allocator)?;
484
485        unsafe {
486            if count != 0 {
487                for _ in 0..(count - 1) {
488                    vec.push_unchecked(value.clone());
489                }
490
491                vec.push_unchecked(value);
492            }
493        }
494
495        Ok(vec)
496    }
497
498    /// Constructs a new `BumpVec<T>` from an [`OwnedSlice`].
499    ///
500    /// # Panics
501    /// Panics if the allocation fails.
502    ///
503    /// # Examples
504    /// ```
505    /// # use bump_scope::{Bump, BumpVec};
506    /// # let bump: Bump = Bump::new();
507    /// // by value
508    /// let a = BumpVec::from_owned_slice_in([1, 2], &bump);
509    /// let b = BumpVec::from_owned_slice_in(vec![3, 4], &bump);
510    /// let c = BumpVec::from_owned_slice_in(bump.alloc_iter(5..=6), &bump);
511    ///
512    /// // by mutable reference
513    /// let mut other = vec![7, 8];
514    /// let d = BumpVec::from_owned_slice_in(&mut other, &bump);
515    /// assert!(other.is_empty());
516    ///
517    /// assert_eq!(a, [1, 2]);
518    /// assert_eq!(b, [3, 4]);
519    /// assert_eq!(c, [5, 6]);
520    /// assert_eq!(d, [7, 8]);
521    /// ```
522    #[must_use]
523    #[inline(always)]
524    #[cfg(feature = "panic-on-alloc")]
525    pub fn from_owned_slice_in(owned_slice: impl OwnedSlice<Item = T>, allocator: A) -> Self {
526        panic_on_error(Self::generic_from_owned_slice_in(owned_slice, allocator))
527    }
528
529    /// Constructs a new `BumpVec<T>` from an [`OwnedSlice`].
530    ///
531    /// # Errors
532    /// Errors if the allocation fails.
533    ///
534    /// # Examples
535    /// ```
536    /// # use bump_scope::{Bump, BumpVec};
537    /// # let bump: Bump = Bump::new();
538    /// // by value
539    /// let a = BumpVec::try_from_owned_slice_in([1, 2], &bump)?;
540    /// let b = BumpVec::try_from_owned_slice_in(vec![3, 4], &bump)?;
541    /// let c = BumpVec::try_from_owned_slice_in(bump.alloc_iter(5..=6), &bump)?;
542    ///
543    /// // by mutable reference
544    /// let mut other = vec![7, 8];
545    /// let d = BumpVec::try_from_owned_slice_in(&mut other, &bump)?;
546    /// assert!(other.is_empty());
547    ///
548    /// assert_eq!(a, [1, 2]);
549    /// assert_eq!(b, [3, 4]);
550    /// assert_eq!(c, [5, 6]);
551    /// assert_eq!(d, [7, 8]);
552    /// # Ok::<(), bump_scope::alloc::AllocError>(())
553    /// ```
554    #[inline(always)]
555    pub fn try_from_owned_slice_in(owned_slice: impl OwnedSlice<Item = T>, allocator: A) -> Result<Self, AllocError> {
556        Self::generic_from_owned_slice_in(owned_slice, allocator)
557    }
558
559    #[inline]
560    pub(crate) fn generic_from_owned_slice_in<E: ErrorBehavior>(
561        owned_slice: impl OwnedSlice<Item = T>,
562        allocator: A,
563    ) -> Result<Self, E> {
564        let owned_slice = owned_slice.into_take_owned_slice();
565        let mut this = Self::generic_with_capacity_in(owned_slice.owned_slice_ref().len(), allocator)?;
566        this.generic_append(owned_slice)?;
567        Ok(this)
568    }
569
570    /// Create a new [`BumpVec`] whose elements are taken from an iterator and allocated in the given `bump`.
571    ///
572    /// This is behaviorally identical to [`FromIterator::from_iter`].
573    ///
574    /// If you have an `impl ExactSizeIterator` then you can use [`from_iter_exact_in`](Self::from_iter_exact_in) instead for better performance.
575    ///
576    /// # Panics
577    /// Panics if the allocation fails.
578    ///
579    /// # Examples
580    /// ```
581    /// # use bump_scope::{Bump, BumpVec};
582    /// # let bump: Bump = Bump::new();
583    /// let vec = BumpVec::from_iter_in([1, 2, 3], &bump);
584    /// assert_eq!(vec, [1, 2, 3]);
585    /// ```
586    #[must_use]
587    #[inline(always)]
588    #[cfg(feature = "panic-on-alloc")]
589    pub fn from_iter_in<I>(iter: I, allocator: A) -> Self
590    where
591        I: IntoIterator<Item = T>,
592    {
593        panic_on_error(Self::generic_from_iter_in(iter, allocator))
594    }
595
596    /// Create a new [`BumpVec`] whose elements are taken from an iterator and allocated in the given `bump`.
597    ///
598    /// This is behaviorally identical to [`FromIterator::from_iter`].
599    ///
600    /// If you have an `impl ExactSizeIterator` then you can use [`from_iter_exact_in`](Self::from_iter_exact_in) instead for better performance.
601    ///
602    /// # Errors
603    /// Errors if the allocation fails.
604    ///
605    /// # Examples
606    /// ```
607    /// # use bump_scope::{Bump, BumpVec};
608    /// # let bump: Bump = Bump::new();
609    /// let vec = BumpVec::try_from_iter_in([1, 2, 3], &bump)?;
610    /// assert_eq!(vec, [1, 2, 3]);
611    /// # Ok::<(), bump_scope::alloc::AllocError>(())
612    /// ```
613    #[inline(always)]
614    pub fn try_from_iter_in<I>(iter: I, allocator: A) -> Result<Self, AllocError>
615    where
616        I: IntoIterator<Item = T>,
617    {
618        Self::generic_from_iter_in(iter, allocator)
619    }
620
621    #[inline]
622    pub(crate) fn generic_from_iter_in<E: ErrorBehavior, I>(iter: I, allocator: A) -> Result<Self, E>
623    where
624        I: IntoIterator<Item = T>,
625    {
626        let iter = iter.into_iter();
627        let capacity = iter.size_hint().0;
628
629        let mut vec = Self::generic_with_capacity_in(capacity, allocator)?;
630
631        for value in iter {
632            vec.generic_push(value)?;
633        }
634
635        Ok(vec)
636    }
637
638    /// Create a new [`BumpVec`] whose elements are taken from an iterator and allocated in the given `bump`.
639    ///
640    /// This is just like [`from_iter_in`](Self::from_iter_in) but optimized for an [`ExactSizeIterator`].
641    ///
642    /// # Panics
643    /// Panics if the allocation fails.
644    ///
645    /// # Examples
646    /// ```
647    /// # use bump_scope::{Bump, BumpVec};
648    /// # let bump: Bump = Bump::new();
649    /// let vec = BumpVec::from_iter_exact_in([1, 2, 3], &bump);
650    /// assert_eq!(vec, [1, 2, 3]);
651    /// ```
652    #[must_use]
653    #[inline(always)]
654    #[cfg(feature = "panic-on-alloc")]
655    pub fn from_iter_exact_in<I>(iter: I, allocator: A) -> Self
656    where
657        I: IntoIterator<Item = T>,
658        I::IntoIter: ExactSizeIterator,
659    {
660        panic_on_error(Self::generic_from_iter_exact_in(iter, allocator))
661    }
662
663    /// Create a new [`BumpVec`] whose elements are taken from an iterator and allocated in the given `bump`.
664    ///
665    /// This is just like [`from_iter_in`](Self::from_iter_in) but optimized for an [`ExactSizeIterator`].
666    ///
667    /// # Errors
668    /// Errors if the allocation fails.
669    ///
670    /// # Examples
671    /// ```
672    /// # use bump_scope::{Bump, BumpVec};
673    /// # let bump: Bump = Bump::new();
674    /// let vec = BumpVec::try_from_iter_exact_in([1, 2, 3], &bump)?;
675    /// assert_eq!(vec, [1, 2, 3]);
676    /// # Ok::<(), bump_scope::alloc::AllocError>(())
677    /// ```
678    #[inline(always)]
679    pub fn try_from_iter_exact_in<I>(iter: I, allocator: A) -> Result<Self, AllocError>
680    where
681        I: IntoIterator<Item = T>,
682        I::IntoIter: ExactSizeIterator,
683    {
684        Self::generic_from_iter_exact_in(iter, allocator)
685    }
686
687    #[inline]
688    pub(crate) fn generic_from_iter_exact_in<E: ErrorBehavior, I>(iter: I, allocator: A) -> Result<Self, E>
689    where
690        I: IntoIterator<Item = T>,
691        I::IntoIter: ExactSizeIterator,
692    {
693        let mut iter = iter.into_iter();
694        let len = iter.len();
695
696        let mut vec = Self::generic_with_capacity_in(len, allocator)?;
697
698        while vec.len() != vec.capacity() {
699            match iter.next() {
700                // SAFETY: we checked above that `len != capacity`, so there is space
701                Some(value) => unsafe { vec.push_unchecked(value) },
702                None => break,
703            }
704        }
705
706        Ok(vec)
707    }
708
709    /// Returns the total number of elements the vector can hold without
710    /// reallocating.
711    ///
712    /// # Examples
713    ///
714    /// ```
715    /// # use bump_scope::{Bump, BumpVec};
716    /// # let bump: Bump = Bump::new();
717    /// let vec = BumpVec::<i32, _>::with_capacity_in(2048, &bump);
718    /// assert!(vec.capacity() >= 2048);
719    /// ```
720    #[must_use]
721    #[inline(always)]
722    pub const fn capacity(&self) -> usize {
723        self.fixed.capacity()
724    }
725
726    /// Returns the number of elements in the vector, also referred to
727    /// as its 'length'.
728    ///
729    /// # Examples
730    /// ```
731    /// # use bump_scope::{Bump, bump_vec};
732    /// # let bump: Bump = Bump::new();
733    /// let a = bump_vec![in &bump; 1, 2, 3];
734    /// assert_eq!(a.len(), 3);
735    /// ```
736    #[must_use]
737    #[inline(always)]
738    pub const fn len(&self) -> usize {
739        self.fixed.len()
740    }
741
742    /// Returns `true` if the vector contains no elements.
743    ///
744    /// # Examples
745    /// ```
746    /// # use bump_scope::{Bump, BumpVec};
747    /// # let bump: Bump = Bump::new();
748    /// let mut v = BumpVec::new_in(&bump);
749    /// assert!(v.is_empty());
750    ///
751    /// v.push(1);
752    /// assert!(!v.is_empty());
753    /// ```
754    #[must_use]
755    #[inline(always)]
756    pub const fn is_empty(&self) -> bool {
757        self.fixed.len() == 0
758    }
759
760    /// Splits the vector into two by removing the specified range.
761    ///
762    /// This method does not allocate and does not change the order of the elements.
763    ///
764    /// The excess capacity may end up in either vector.
765    /// This behavior is different from <code>Vec::[split_off](alloc_crate::vec::Vec::split_off)</code> which allocates a new vector for the split-off elements
766    /// so the original vector keeps its capacity.
767    /// If you rather want that behavior then you can write this instead:
768    /// ```
769    /// # use bump_scope::{Bump, BumpVec};
770    /// # let bump: Bump = Bump::new();
771    /// # let mut vec = BumpVec::from_owned_slice_in(['a', 'b', 'c', 'd', 'e'], &bump);
772    /// # let start = 1;
773    /// # let end = 4;
774    /// let mut other = BumpVec::new_in(*vec.allocator());
775    /// other.append(vec.drain(start..end));
776    /// # assert_eq!(vec, ['a', 'e']);
777    /// # assert_eq!(other, ['b', 'c', 'd']);
778    /// ```
779    ///
780    /// # Panics
781    ///
782    /// Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
783    ///
784    /// # Complexity
785    ///
786    /// This operation takes `O(1)` time if either the range starts at 0, ends at `len`, or is empty.
787    /// Otherwise it takes `O(min(end, len - start))` time.
788    ///
789    /// # Examples
790    ///
791    /// ```
792    /// # use bump_scope::{Bump, BumpVec};
793    /// # let bump: Bump = Bump::new();
794    /// let mut vec = BumpVec::with_capacity_in(10, &bump);
795    /// vec.append([1, 2, 3, 4, 5, 6, 7, 8]);
796    ///
797    /// let front = vec.split_off(..2);
798    /// assert_eq!(front, [1, 2]);
799    /// assert_eq!(vec, [3, 4, 5, 6, 7, 8]);
800    ///
801    /// let back = vec.split_off(4..);
802    /// assert_eq!(back, [7, 8]);
803    /// assert_eq!(vec, [3, 4, 5, 6]);
804    ///
805    /// let middle = vec.split_off(1..3);
806    /// assert_eq!(middle, [4, 5]);
807    /// assert_eq!(vec, [3, 6]);
808    ///
809    /// let rest = vec.split_off(..);
810    /// assert_eq!(rest, [3, 6]);
811    /// assert_eq!(vec, []);
812    /// ```
813    #[inline]
814    #[expect(clippy::return_self_not_must_use)]
815    pub fn split_off(&mut self, range: impl RangeBounds<usize>) -> Self
816    where
817        A: Clone,
818    {
819        let other = unsafe { self.fixed.cook_mut() }.split_off(range);
820
821        Self {
822            fixed: unsafe { RawFixedBumpVec::from_cooked(other) },
823            allocator: self.allocator.clone(),
824        }
825    }
826
827    /// Removes the last element from a vector and returns it, or [`None`] if it
828    /// is empty.
829    ///
830    /// # Examples
831    /// ```
832    /// # use bump_scope::{Bump, bump_vec};
833    /// # let bump: Bump = Bump::new();
834    /// let mut vec = bump_vec![in &bump; 1, 2, 3];
835    /// assert_eq!(vec.pop(), Some(3));
836    /// assert_eq!(vec, [1, 2]);
837    /// ```
838    ///
839    /// # Time complexity
840    /// Takes *O*(1) time.
841    #[inline(always)]
842    pub fn pop(&mut self) -> Option<T> {
843        unsafe { self.fixed.cook_mut() }.pop()
844    }
845
846    /// Removes and returns the last element from a vector if the predicate
847    /// returns `true`, or [`None`] if the predicate returns false or the vector
848    /// is empty (the predicate will not be called in that case).
849    ///
850    /// # Examples
851    ///
852    /// ```
853    /// # use bump_scope::{Bump, bump_vec};
854    /// # let bump: Bump = Bump::new();
855    /// let mut vec = bump_vec![in &bump; 1, 2, 3, 4];
856    /// let pred = |x: &mut i32| *x % 2 == 0;
857    ///
858    /// assert_eq!(vec.pop_if(pred), Some(4));
859    /// assert_eq!(vec, [1, 2, 3]);
860    /// assert_eq!(vec.pop_if(pred), None);
861    /// ```
862    pub fn pop_if(&mut self, predicate: impl FnOnce(&mut T) -> bool) -> Option<T> {
863        let last = self.last_mut()?;
864        if predicate(last) { self.pop() } else { None }
865    }
866
867    /// Clears the vector, removing all values.
868    ///
869    /// # Examples
870    /// ```
871    /// # use bump_scope::{Bump, bump_vec};
872    /// # let bump: Bump = Bump::new();
873    /// let mut vec = bump_vec![in &bump; 1, 2, 3];
874    /// vec.clear();
875    /// assert!(vec.is_empty());
876    /// ```
877    #[inline(always)]
878    pub fn clear(&mut self) {
879        unsafe { self.fixed.cook_mut() }.clear();
880    }
881
882    /// Shortens the vector, keeping the first `len` elements and dropping
883    /// the rest.
884    ///
885    /// If `len` is greater than the vector's current length, this has no
886    /// effect.
887    ///
888    /// The [`drain`] method can emulate `truncate`, but causes the excess
889    /// elements to be returned instead of dropped.
890    ///
891    /// Note that this method has no effect on the allocated capacity
892    /// of the vector.
893    ///
894    /// # Examples
895    ///
896    /// Truncating a five element vector to two elements:
897    ///
898    /// ```
899    /// # use bump_scope::{Bump, bump_vec};
900    /// # let bump: Bump = Bump::new();
901    /// #
902    /// let mut vec = bump_vec![in &bump; 1, 2, 3, 4, 5];
903    /// vec.truncate(2);
904    /// assert_eq!(vec, [1, 2]);
905    /// ```
906    ///
907    /// No truncation occurs when `len` is greater than the vector's current
908    /// length:
909    ///
910    /// ```
911    /// # use bump_scope::{Bump, bump_vec};
912    /// # let bump: Bump = Bump::new();
913    /// #
914    /// let mut vec = bump_vec![in &bump; 1, 2, 3];
915    /// vec.truncate(8);
916    /// assert_eq!(vec, [1, 2, 3]);
917    /// ```
918    ///
919    /// Truncating when `len == 0` is equivalent to calling the [`clear`]
920    /// method.
921    ///
922    /// ```
923    /// # use bump_scope::{Bump, bump_vec};
924    /// # let bump: Bump = Bump::new();
925    /// #
926    /// let mut vec = bump_vec![in &bump; 1, 2, 3];
927    /// vec.truncate(0);
928    /// assert_eq!(vec, []);
929    /// ```
930    ///
931    /// [`clear`]: Self::clear
932    /// [`drain`]: Self::drain
933    pub fn truncate(&mut self, len: usize) {
934        unsafe { self.fixed.cook_mut() }.truncate(len);
935    }
936
937    /// Removes and returns the element at position `index` within the vector,
938    /// shifting all elements after it to the left.
939    ///
940    /// Note: Because this shifts over the remaining elements, it has a
941    /// worst-case performance of *O*(*n*). If you don't need the order of elements
942    /// to be preserved, use [`swap_remove`] instead.
943    ///
944    /// # Panics
945    /// Panics if `index` is out of bounds.
946    ///
947    /// [`swap_remove`]: Self::swap_remove
948    /// # Examples
949    /// ```
950    /// # use bump_scope::{Bump, bump_vec};
951    /// # let bump: Bump = Bump::new();
952    /// let mut v = bump_vec![in &bump; 1, 2, 3];
953    /// assert_eq!(v.remove(1), 2);
954    /// assert_eq!(v, [1, 3]);
955    /// ```
956    #[track_caller]
957    pub fn remove(&mut self, index: usize) -> T {
958        unsafe { self.fixed.cook_mut() }.remove(index)
959    }
960
961    /// Removes an element from the vector and returns it.
962    ///
963    /// The removed element is replaced by the last element of the vector.
964    ///
965    /// This does not preserve ordering, but is *O*(1).
966    /// If you need to preserve the element order, use [`remove`] instead.
967    ///
968    /// # Panics
969    /// Panics if `index` is out of bounds.
970    ///
971    /// [`remove`]: Self::remove
972    /// # Examples
973    /// ```
974    /// # use bump_scope::{Bump, bump_vec};
975    /// # let bump: Bump = Bump::new();
976    /// #
977    /// let mut v = bump_vec![in &bump; "foo", "bar", "baz", "qux"];
978    ///
979    /// assert_eq!(v.swap_remove(1), "bar");
980    /// assert_eq!(v, ["foo", "qux", "baz"]);
981    ///
982    /// assert_eq!(v.swap_remove(0), "foo");
983    /// assert_eq!(v, ["baz", "qux"]);
984    /// ```
985    #[inline]
986    pub fn swap_remove(&mut self, index: usize) -> T {
987        unsafe { self.fixed.cook_mut() }.swap_remove(index)
988    }
989
990    /// Extracts a slice containing the entire vector.
991    ///
992    /// Equivalent to `&s[..]`.
993    #[must_use]
994    #[inline(always)]
995    pub const fn as_slice(&self) -> &[T] {
996        unsafe { self.fixed.cook_ref() }.as_slice()
997    }
998
999    /// Extracts a mutable slice containing the entire vector.
1000    ///
1001    /// Equivalent to `&mut s[..]`.
1002    #[must_use]
1003    #[inline(always)]
1004    pub fn as_mut_slice(&mut self) -> &mut [T] {
1005        unsafe { self.fixed.cook_mut() }.as_mut_slice()
1006    }
1007
1008    /// Returns a raw pointer to the slice, or a dangling raw pointer
1009    /// valid for zero sized reads.
1010    #[inline]
1011    #[must_use]
1012    pub fn as_ptr(&self) -> *const T {
1013        self.fixed.as_ptr()
1014    }
1015
1016    /// Returns an unsafe mutable pointer to slice, or a dangling
1017    /// raw pointer valid for zero sized reads.
1018    #[inline]
1019    pub fn as_mut_ptr(&mut self) -> *mut T {
1020        self.fixed.as_mut_ptr()
1021    }
1022
1023    /// Returns a `NonNull` pointer to the vector's buffer, or a dangling
1024    /// `NonNull` pointer valid for zero sized reads if the vector didn't allocate.
1025    ///
1026    /// The caller must ensure that the vector outlives the pointer this
1027    /// function returns, or else it will end up dangling.
1028    /// Modifying the vector may cause its buffer to be reallocated,
1029    /// which would also make any pointers to it invalid.
1030    ///
1031    /// This method guarantees that for the purpose of the aliasing model, this method
1032    /// does not materialize a reference to the underlying slice, and thus the returned pointer
1033    /// will remain valid when mixed with other calls to [`as_ptr`], [`as_mut_ptr`],
1034    /// and [`as_non_null`].
1035    /// Note that calling other methods that materialize references to the slice,
1036    /// or references to specific elements you are planning on accessing through this pointer,
1037    /// may still invalidate this pointer.
1038    /// See the second example below for how this guarantee can be used.
1039    ///
1040    /// # Examples
1041    ///
1042    /// ```
1043    /// # use bump_scope::{Bump, BumpVec};
1044    /// # let bump: Bump = Bump::new();
1045    /// // Allocate vector big enough for 4 elements.
1046    /// let size = 4;
1047    /// let mut x: BumpVec<i32, _> = BumpVec::with_capacity_in(size, &bump);
1048    /// let x_ptr = x.as_non_null();
1049    ///
1050    /// // Initialize elements via raw pointer writes, then set length.
1051    /// unsafe {
1052    ///     for i in 0..size {
1053    ///         x_ptr.add(i).write(i as i32);
1054    ///     }
1055    ///     x.set_len(size);
1056    /// }
1057    /// assert_eq!(&*x, &[0, 1, 2, 3]);
1058    /// ```
1059    ///
1060    /// Due to the aliasing guarantee, the following code is legal:
1061    ///
1062    /// ```
1063    /// # use bump_scope::{Bump, bump_vec};
1064    /// # let bump: Bump = Bump::new();
1065    /// unsafe {
1066    ///     let v = bump_vec![in &bump; 0];
1067    ///     let ptr1 = v.as_non_null();
1068    ///     ptr1.write(1);
1069    ///     let ptr2 = v.as_non_null();
1070    ///     ptr2.write(2);
1071    ///     // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
1072    ///     ptr1.write(3);
1073    /// }
1074    /// ```
1075    ///
1076    /// [`as_mut_ptr`]: Self::as_mut_ptr
1077    /// [`as_ptr`]: Self::as_ptr
1078    /// [`as_non_null`]: Self::as_non_null
1079    #[must_use]
1080    #[inline(always)]
1081    pub const fn as_non_null(&self) -> NonNull<T> {
1082        self.fixed.as_non_null()
1083    }
1084
1085    /// Appends an element to the back of the collection.
1086    ///
1087    /// # Safety
1088    /// Vector must not be full.
1089    ///
1090    /// # Examples
1091    /// ```
1092    /// # use bump_scope::{Bump, BumpVec};
1093    /// # let bump: Bump = Bump::new();
1094    /// let mut vec = BumpVec::with_capacity_in(3, &bump);
1095    /// vec.append([1, 2]);
1096    /// unsafe { vec.push_unchecked(3) };
1097    /// assert_eq!(vec, [1, 2, 3]);
1098    /// ```
1099    #[inline(always)]
1100    pub unsafe fn push_unchecked(&mut self, value: T) {
1101        _ = unsafe { self.push_mut_unchecked(value) };
1102    }
1103
1104    /// Appends an element to the back of the collection, returning a reference to it.
1105    ///
1106    /// # Safety
1107    /// Vector must not be full.
1108    ///
1109    /// # Examples
1110    /// ```
1111    /// # use bump_scope::{Bump, BumpVec};
1112    /// # let bump: Bump = Bump::new();
1113    /// let mut vec = BumpVec::with_capacity_in(4, &bump);
1114    /// vec.append([1, 2]);
1115    ///
1116    /// let last = unsafe { vec.push_mut_unchecked(3) };
1117    /// assert_eq!(*last, 3);
1118    /// assert_eq!(vec, [1, 2, 3]);
1119    ///
1120    /// let last = unsafe { vec.push_mut_unchecked(3) };
1121    /// *last += 1;
1122    /// assert_eq!(vec, [1, 2, 3, 4]);
1123    /// ```
1124    #[inline(always)]
1125    #[must_use = "if you don't need a reference to the value, use `push_unchecked` instead"]
1126    pub unsafe fn push_mut_unchecked(&mut self, value: T) -> &mut T {
1127        unsafe { self.fixed.cook_mut().push_mut_unchecked(value) }
1128    }
1129
1130    /// Appends an element to the back of the collection.
1131    ///
1132    /// # Safety
1133    /// Vector must not be full.
1134    #[inline(always)]
1135    #[deprecated = "use `push_unchecked(f())` instead"]
1136    pub unsafe fn push_with_unchecked(&mut self, f: impl FnOnce() -> T) {
1137        unsafe { self.push_unchecked(f()) }
1138    }
1139
1140    /// Forces the length of the vector to `new_len`.
1141    ///
1142    /// This is a low-level operation that maintains none of the normal
1143    /// invariants of the type. Normally changing the length of a vector
1144    /// is done using one of the safe operations instead, such as
1145    /// [`resize`], [`truncate`], [`extend`], or [`clear`].
1146    ///
1147    /// # Safety
1148    /// - `new_len` must be less than or equal to the [`capacity`].
1149    /// - The elements at `old_len..new_len` must be initialized.
1150    ///
1151    /// [`resize`]: Self::resize
1152    /// [`truncate`]: Self::truncate
1153    /// [`extend`]: Self::extend
1154    /// [`clear`]: Self::clear
1155    /// [`capacity`]: Self::capacity
1156    #[inline]
1157    pub unsafe fn set_len(&mut self, new_len: usize) {
1158        unsafe { self.fixed.set_len(new_len) };
1159    }
1160
1161    #[inline]
1162    pub(crate) unsafe fn inc_len(&mut self, amount: usize) {
1163        unsafe { self.fixed.cook_mut().inc_len(amount) };
1164    }
1165
1166    /// Appends an element to the back of a collection.
1167    ///
1168    /// # Panics
1169    /// Panics if the allocation fails.
1170    ///
1171    /// # Examples
1172    /// ```
1173    /// # use bump_scope::{bump_vec, Bump};
1174    /// # let bump: Bump = Bump::new();
1175    /// let mut vec = bump_vec![in &bump; 1, 2];
1176    /// vec.push(3);
1177    /// assert_eq!(vec, [1, 2, 3]);
1178    /// ```
1179    #[inline(always)]
1180    #[cfg(feature = "panic-on-alloc")]
1181    pub fn push(&mut self, value: T) {
1182        panic_on_error(self.generic_push(value));
1183    }
1184
1185    /// Appends an element to the back of a collection.
1186    ///
1187    /// # Errors
1188    /// Errors if the allocation fails.
1189    ///
1190    /// # Examples
1191    /// ```
1192    /// # use bump_scope::{bump_vec, Bump};
1193    /// # let bump: Bump = Bump::new();
1194    /// let mut vec = bump_vec![try in &bump; 1, 2]?;
1195    /// vec.try_push(3)?;
1196    /// assert_eq!(vec, [1, 2, 3]);
1197    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1198    /// ```
1199    #[inline(always)]
1200    pub fn try_push(&mut self, value: T) -> Result<(), AllocError> {
1201        self.generic_push(value)
1202    }
1203
1204    #[inline]
1205    pub(crate) fn generic_push<E: ErrorBehavior>(&mut self, value: T) -> Result<(), E> {
1206        self.generic_push_with(|| value)
1207    }
1208
1209    /// Reserves space for one more element, then calls `f`
1210    /// to produce the value that is appended.
1211    ///
1212    /// In some cases this could be more performant than `push(f())` because it
1213    /// permits the compiler to directly place `T` in the vector instead of
1214    /// constructing it on the stack and copying it over.
1215    ///
1216    /// # Panics
1217    /// Panics if the allocation fails.
1218    ///
1219    /// # Examples
1220    /// ```
1221    /// # use bump_scope::{Bump, bump_vec};
1222    /// # let bump: Bump = Bump::new();
1223    /// let mut vec = bump_vec![in &bump; 1, 2];
1224    /// vec.push_with(|| 3);
1225    /// assert_eq!(vec, [1, 2, 3]);
1226    /// ```
1227    #[inline(always)]
1228    #[cfg(feature = "panic-on-alloc")]
1229    pub fn push_with(&mut self, f: impl FnOnce() -> T) {
1230        panic_on_error(self.generic_push_with(f));
1231    }
1232
1233    /// Reserves space for one more element, then calls `f`
1234    /// to produce the value that is appended.
1235    ///
1236    /// In some cases this could be more performant than `push(f())` because it
1237    /// permits the compiler to directly place `T` in the vector instead of
1238    /// constructing it on the stack and copying it over.
1239    ///
1240    /// # Errors
1241    /// Errors if the allocation fails.
1242    ///
1243    /// # Examples
1244    /// ```
1245    /// # use bump_scope::{Bump, bump_vec};
1246    /// # let bump: Bump = Bump::new();
1247    /// let mut vec = bump_vec![in &bump; 1, 2];
1248    /// vec.try_push_with(|| 3)?;
1249    /// assert_eq!(vec, [1, 2, 3]);
1250    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1251    /// ```
1252    #[inline(always)]
1253    pub fn try_push_with(&mut self, f: impl FnOnce() -> T) -> Result<(), AllocError> {
1254        self.generic_push_with(f)
1255    }
1256
1257    #[inline]
1258    pub(crate) fn generic_push_with<E: ErrorBehavior>(&mut self, f: impl FnOnce() -> T) -> Result<(), E> {
1259        self.generic_push_mut_with(f).map(drop)
1260    }
1261
1262    /// Appends an element to the back of a collection.
1263    ///
1264    /// # Panics
1265    /// Panics if the allocation fails.
1266    ///
1267    /// # Examples
1268    /// ```
1269    /// # use bump_scope::{Bump, bump_vec};
1270    /// # let bump: Bump = Bump::new();
1271    /// let mut vec = bump_vec![in &bump; 1, 2];
1272    ///
1273    /// let last = vec.push_mut(3);
1274    /// assert_eq!(*last, 3);
1275    /// assert_eq!(vec, [1, 2, 3]);
1276    ///
1277    /// let last = vec.push_mut(3);
1278    /// *last += 1;
1279    /// assert_eq!(vec, [1, 2, 3, 4]);
1280    /// ```
1281    #[inline(always)]
1282    #[cfg(feature = "panic-on-alloc")]
1283    #[must_use = "if you don't need a reference to the value, use `push` instead"]
1284    pub fn push_mut(&mut self, value: T) -> &mut T {
1285        panic_on_error(self.generic_push_mut(value))
1286    }
1287
1288    /// Appends an element to the back of a collection.
1289    ///
1290    /// # Errors
1291    /// Errors if the allocation fails.
1292    ///
1293    /// # Examples
1294    /// ```
1295    /// # use bump_scope::{Bump, mut_bump_vec};
1296    /// # let mut bump: Bump = Bump::new();
1297    /// let mut vec = mut_bump_vec![try in &mut bump; 1, 2]?;
1298    ///
1299    /// let last = vec.try_push_mut(3)?;
1300    /// assert_eq!(*last, 3);
1301    /// assert_eq!(vec, [1, 2, 3]);
1302    ///
1303    /// let last = vec.try_push_mut(3)?;
1304    /// *last += 1;
1305    /// assert_eq!(vec, [1, 2, 3, 4]);
1306    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1307    /// ```
1308    #[inline(always)]
1309    #[must_use = "if you don't need a reference to the value, use `push` instead"]
1310    pub fn try_push_mut(&mut self, value: T) -> Result<&mut T, AllocError> {
1311        self.generic_push_mut(value)
1312    }
1313
1314    #[inline]
1315    pub(crate) fn generic_push_mut<E: ErrorBehavior>(&mut self, value: T) -> Result<&mut T, E> {
1316        self.generic_push_mut_with(|| value)
1317    }
1318
1319    /// Reserves space for one more element, then calls `f`
1320    /// to produce the value that is appended.
1321    ///
1322    /// In some cases this could be more performant than `push(f())` because it
1323    /// permits the compiler to directly place `T` in the vector instead of
1324    /// constructing it on the stack and copying it over.
1325    ///
1326    /// # Panics
1327    /// Panics if the allocation fails.
1328    ///
1329    /// # Examples
1330    /// ```
1331    /// # use bump_scope::{Bump, BumpVec};
1332    /// # let bump: Bump = Bump::new();
1333    /// let mut vec = BumpVec::new_in(&bump);
1334    /// let item = vec.push_mut_with(i32::default);
1335    /// *item += 1;
1336    /// *item += 2;
1337    /// assert_eq!(*item, 3);
1338    /// ```
1339    #[inline(always)]
1340    #[cfg(feature = "panic-on-alloc")]
1341    #[must_use = "if you don't need a reference to the value, use `push` instead"]
1342    pub fn push_mut_with(&mut self, f: impl FnOnce() -> T) -> &mut T {
1343        panic_on_error(self.generic_push_mut_with(f))
1344    }
1345
1346    /// Reserves space for one more element, then calls `f`
1347    /// to produce the value that is appended.
1348    ///
1349    /// In some cases this could be more performant than `push(f())` because it
1350    /// permits the compiler to directly place `T` in the vector instead of
1351    /// constructing it on the stack and copying it over.
1352    ///
1353    /// # Errors
1354    /// Errors if the allocation fails.
1355    ///
1356    /// # Examples
1357    /// ```
1358    /// # use bump_scope::{Bump, BumpVec};
1359    /// # let bump: Bump = Bump::new();
1360    /// let mut vec = BumpVec::new_in(&bump);
1361    /// let item = vec.try_push_mut_with(i32::default)?;
1362    /// *item += 1;
1363    /// *item += 2;
1364    /// assert_eq!(*item, 3);
1365    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1366    /// ```
1367    #[inline(always)]
1368    #[must_use = "if you don't need a reference to the value, use `push` instead"]
1369    pub fn try_push_mut_with(&mut self, f: impl FnOnce() -> T) -> Result<&mut T, AllocError> {
1370        self.generic_push_mut_with(f)
1371    }
1372
1373    #[inline]
1374    pub(crate) fn generic_push_mut_with<E: ErrorBehavior>(&mut self, f: impl FnOnce() -> T) -> Result<&mut T, E> {
1375        self.generic_reserve_one()?;
1376        Ok(unsafe { self.push_mut_unchecked(f()) })
1377    }
1378
1379    /// Inserts an element at position `index` within the vector, shifting all elements after it to the right.
1380    ///
1381    /// # Panics
1382    /// Panics if the allocation fails.
1383    ///
1384    /// Panics if `index > len`.
1385    ///
1386    /// # Examples
1387    /// ```
1388    /// # use bump_scope::{Bump, bump_vec};
1389    /// # let bump: Bump = Bump::new();
1390    /// let mut vec = bump_vec![in &bump; 'b', 'd'];
1391    /// vec.insert(1, 'c');
1392    /// assert_eq!(vec, ['b', 'c', 'd']);
1393    /// vec.insert(0, 'a');
1394    /// assert_eq!(vec, ['a', 'b', 'c', 'd']);
1395    /// vec.insert(4, 'e');
1396    /// assert_eq!(vec, ['a', 'b', 'c', 'd', 'e']);
1397    /// ```
1398    #[inline(always)]
1399    #[cfg(feature = "panic-on-alloc")]
1400    pub fn insert(&mut self, index: usize, element: T) {
1401        panic_on_error(self.generic_insert_mut(index, element));
1402    }
1403
1404    /// Inserts an element at position `index` within the vector, shifting all elements after it to the right.
1405    ///
1406    /// # Panics
1407    /// Panics if `index > len`.
1408    ///
1409    /// # Errors
1410    /// Errors if the allocation fails.
1411    ///
1412    /// # Examples
1413    /// ```
1414    /// # use bump_scope::{Bump, bump_vec};
1415    /// # let bump: Bump = Bump::new();
1416    /// let mut vec = bump_vec![try in &bump; 'b', 'd']?;
1417    /// vec.try_insert(1, 'c')?;
1418    /// assert_eq!(vec, ['b', 'c', 'd']);
1419    /// vec.try_insert(0, 'a')?;
1420    /// assert_eq!(vec, ['a', 'b', 'c', 'd']);
1421    /// vec.try_insert(4, 'e')?;
1422    /// assert_eq!(vec, ['a', 'b', 'c', 'd', 'e']);
1423    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1424    /// ```
1425    #[inline(always)]
1426    pub fn try_insert(&mut self, index: usize, element: T) -> Result<(), AllocError> {
1427        self.generic_insert_mut(index, element).map(drop)
1428    }
1429
1430    /// Inserts an element at position `index` within the vector, shifting all elements after it to the right.
1431    ///
1432    /// # Panics
1433    /// Panics if the vector does not have enough capacity.
1434    ///
1435    /// Panics if `index > len`.
1436    ///
1437    /// # Examples
1438    /// ```
1439    /// # use bump_scope::{Bump, bump_vec};
1440    /// # let bump: Bump = Bump::new();
1441    /// let mut vec = bump_vec![in &bump; 1, 3, 5, 9];
1442    /// let x = vec.insert_mut(3, 6);
1443    /// *x += 1;
1444    /// assert_eq!(vec, [1, 3, 5, 7, 9]);
1445    /// ```
1446    #[inline(always)]
1447    #[cfg(feature = "panic-on-alloc")]
1448    #[must_use = "if you don't need a reference to the value, use `insert` instead"]
1449    pub fn insert_mut(&mut self, index: usize, element: T) -> &mut T {
1450        panic_on_error(self.generic_insert_mut(index, element))
1451    }
1452
1453    /// Inserts an element at position `index` within the vector, shifting all elements after it to the right.
1454    ///
1455    /// # Panics
1456    /// Panics if `index > len`.
1457    ///
1458    /// # Errors
1459    /// Errors if the vector does not have enough capacity.
1460    ///
1461    /// # Examples
1462    /// ```
1463    /// # use bump_scope::{Bump, bump_vec};
1464    /// # let bump: Bump = Bump::new();
1465    /// let mut vec = bump_vec![try in &bump; 1, 3, 5, 9]?;
1466    /// let x = vec.try_insert_mut(3, 6)?;
1467    /// *x += 1;
1468    /// assert_eq!(vec, [1, 3, 5, 7, 9]);
1469    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1470    /// ```
1471    #[inline(always)]
1472    #[must_use = "if you don't need a reference to the value, use `try_insert` instead"]
1473    pub fn try_insert_mut(&mut self, index: usize, element: T) -> Result<&mut T, AllocError> {
1474        self.generic_insert_mut(index, element)
1475    }
1476
1477    #[inline]
1478    pub(crate) fn generic_insert_mut<E: ErrorBehavior>(&mut self, index: usize, element: T) -> Result<&mut T, E> {
1479        #[cold]
1480        #[track_caller]
1481        #[inline(never)]
1482        fn assert_failed(index: usize, len: usize) -> ! {
1483            panic!("insertion index (is {index}) should be <= len (is {len})");
1484        }
1485
1486        if index > self.len() {
1487            assert_failed(index, self.len());
1488        }
1489
1490        self.generic_reserve_one()?;
1491
1492        unsafe {
1493            let pos = self.as_mut_ptr().add(index);
1494
1495            if index != self.len() {
1496                let len = self.len() - index;
1497                ptr::copy(pos, pos.add(1), len);
1498            }
1499
1500            pos.write(element);
1501            self.inc_len(1);
1502            Ok(&mut *pos)
1503        }
1504    }
1505
1506    /// Copies and appends all elements in a slice to the `BumpVec`.
1507    ///
1508    /// Iterates over the `slice`, copies each element, and then appends
1509    /// it to this `BumpVec`. The `slice` is traversed in-order.
1510    ///
1511    /// Note that this function is same as [`extend`] except that it is
1512    /// specialized to work with copyable slices instead.
1513    ///
1514    /// [`extend`]: Self::extend
1515    ///
1516    /// # Panics
1517    /// Panics if the allocation fails.
1518    ///
1519    /// # Examples
1520    /// ```
1521    /// # use bump_scope::{ Bump, bump_vec };
1522    /// # let bump: Bump = Bump::new();
1523    /// let mut vec = bump_vec![in &bump; 1];
1524    /// vec.extend_from_slice_copy(&[2, 3, 4]);
1525    /// assert_eq!(vec, [1, 2, 3, 4]);
1526    /// ```
1527    #[inline(always)]
1528    #[cfg(feature = "panic-on-alloc")]
1529    pub fn extend_from_slice_copy(&mut self, slice: &[T])
1530    where
1531        T: Copy,
1532    {
1533        panic_on_error(self.generic_extend_from_slice_copy(slice));
1534    }
1535
1536    /// Copies and appends all elements in a slice to the `BumpVec`.
1537    ///
1538    /// Iterates over the `slice`, copies each element, and then appends
1539    /// it to this `BumpVec`. The `slice` is traversed in-order.
1540    ///
1541    /// Note that this function is same as [`extend`] except that it is
1542    /// specialized to work with copyable slices instead.
1543    ///
1544    /// [`extend`]: Self::extend
1545    ///
1546    /// # Errors
1547    /// Errors if the allocation fails.
1548    ///
1549    /// # Examples
1550    /// ```
1551    /// # use bump_scope::{ Bump, bump_vec };
1552    /// # let bump: Bump = Bump::new();
1553    /// let mut vec = bump_vec![try in &bump; 1]?;
1554    /// vec.try_extend_from_slice_copy(&[2, 3, 4])?;
1555    /// assert_eq!(vec, [1, 2, 3, 4]);
1556    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1557    /// ```
1558    #[inline(always)]
1559    pub fn try_extend_from_slice_copy(&mut self, slice: &[T]) -> Result<(), AllocError>
1560    where
1561        T: Copy,
1562    {
1563        self.generic_extend_from_slice_copy(slice)
1564    }
1565
1566    #[inline]
1567    pub(crate) fn generic_extend_from_slice_copy<E: ErrorBehavior>(&mut self, slice: &[T]) -> Result<(), E>
1568    where
1569        T: Copy,
1570    {
1571        unsafe { self.extend_by_copy_nonoverlapping(slice) }
1572    }
1573
1574    /// Clones and appends all elements in a slice to the `BumpVec`.
1575    ///
1576    /// Iterates over the `slice`, clones each element, and then appends
1577    /// it to this `BumpVec`. The `slice` is traversed in-order.
1578    ///
1579    /// Note that this function is same as [`extend`] except that it is
1580    /// specialized to work with slices instead.
1581    ///
1582    /// [`extend`]: Self::extend
1583    ///
1584    /// # Panics
1585    /// Panics if the allocation fails.
1586    ///
1587    /// # Examples
1588    /// ```
1589    /// # use std::string::String;
1590    /// # use bump_scope::{ Bump, bump_vec };
1591    /// # let bump: Bump = Bump::new();
1592    /// let mut vec = bump_vec![in &bump; String::from("a")];
1593    /// vec.extend_from_slice_clone(&[String::from("b"), String::from("c")]);
1594    /// assert_eq!(vec, ["a", "b", "c"]);
1595    /// ```
1596    #[inline(always)]
1597    #[cfg(feature = "panic-on-alloc")]
1598    pub fn extend_from_slice_clone(&mut self, slice: &[T])
1599    where
1600        T: Clone,
1601    {
1602        panic_on_error(self.generic_extend_from_slice_clone(slice));
1603    }
1604
1605    /// Clones and appends all elements in a slice to the `BumpVec`.
1606    ///
1607    /// Iterates over the `slice`, clones each element, and then appends
1608    /// it to this `BumpVec`. The `slice` is traversed in-order.
1609    ///
1610    /// Note that this function is same as [`extend`] except that it is
1611    /// specialized to work with slices instead.
1612    ///
1613    /// [`extend`]: Self::extend
1614    ///
1615    /// # Errors
1616    /// Errors if the allocation fails.
1617    ///
1618    /// # Examples
1619    /// ```
1620    /// # use std::string::String;
1621    /// # use bump_scope::{ Bump, bump_vec };
1622    /// # let bump: Bump = Bump::new();
1623    /// let mut vec = bump_vec![try in &bump; String::from("a")]?;
1624    /// vec.try_extend_from_slice_clone(&[String::from("b"), String::from("c")])?;
1625    /// assert_eq!(vec, ["a", "b", "c"]);
1626    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1627    /// ```
1628    #[inline(always)]
1629    pub fn try_extend_from_slice_clone(&mut self, slice: &[T]) -> Result<(), AllocError>
1630    where
1631        T: Clone,
1632    {
1633        self.generic_extend_from_slice_clone(slice)
1634    }
1635
1636    #[inline]
1637    pub(crate) fn generic_extend_from_slice_clone<E: ErrorBehavior>(&mut self, slice: &[T]) -> Result<(), E>
1638    where
1639        T: Clone,
1640    {
1641        self.generic_reserve(slice.len())?;
1642
1643        unsafe {
1644            let mut pos = 0usize;
1645
1646            while likely(pos != slice.len()) {
1647                let elem = slice.get_unchecked(pos);
1648                self.push_unchecked(elem.clone());
1649                pos += 1;
1650            }
1651        }
1652
1653        Ok(())
1654    }
1655
1656    /// Copies elements from `src` range to the end of the vector.
1657    ///
1658    /// # Panics
1659    /// Panics if the allocation fails.
1660    ///
1661    /// Panics if the starting point is greater than the end point or if
1662    /// the end point is greater than the length of the vector.
1663    ///
1664    /// # Examples
1665    /// ```
1666    /// # use bump_scope::{Bump, bump_vec};
1667    /// # let bump: Bump = Bump::new();
1668    /// let mut vec = bump_vec![in &bump; 0, 1, 2, 3, 4];
1669    ///
1670    /// vec.extend_from_within_copy(2..);
1671    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
1672    ///
1673    /// vec.extend_from_within_copy(..2);
1674    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
1675    ///
1676    /// vec.extend_from_within_copy(4..8);
1677    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
1678    /// ```
1679    #[inline(always)]
1680    #[cfg(feature = "panic-on-alloc")]
1681    pub fn extend_from_within_copy<R>(&mut self, src: R)
1682    where
1683        T: Copy,
1684        R: RangeBounds<usize>,
1685    {
1686        panic_on_error(self.generic_extend_from_within_copy(src));
1687    }
1688
1689    /// Copies elements from `src` range to the end of the vector.
1690    ///
1691    /// # Panics
1692    /// Panics if the starting point is greater than the end point or if
1693    /// the end point is greater than the length of the vector.
1694    ///
1695    /// # Errors
1696    /// Errors if the allocation fails.
1697    ///
1698    /// # Examples
1699    /// ```
1700    /// # use bump_scope::{Bump, bump_vec};
1701    /// # let bump: Bump = Bump::new();
1702    /// let mut vec = bump_vec![try in &bump; 0, 1, 2, 3, 4]?;
1703    ///
1704    /// vec.try_extend_from_within_copy(2..)?;
1705    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
1706    ///
1707    /// vec.try_extend_from_within_copy(..2)?;
1708    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
1709    ///
1710    /// vec.try_extend_from_within_copy(4..8)?;
1711    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
1712    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1713    /// ```
1714    #[inline(always)]
1715    pub fn try_extend_from_within_copy<R>(&mut self, src: R) -> Result<(), AllocError>
1716    where
1717        T: Copy,
1718        R: RangeBounds<usize>,
1719    {
1720        self.generic_extend_from_within_copy(src)
1721    }
1722
1723    #[inline]
1724    pub(crate) fn generic_extend_from_within_copy<E: ErrorBehavior, R>(&mut self, src: R) -> Result<(), E>
1725    where
1726        T: Copy,
1727        R: RangeBounds<usize>,
1728    {
1729        let range = slice::range(src, ..self.len());
1730        let count = range.len();
1731
1732        self.generic_reserve(count)?;
1733
1734        // SAFETY:
1735        // - `slice::range` guarantees that the given range is valid for indexing self
1736        unsafe {
1737            let ptr = self.as_mut_ptr();
1738
1739            let src = ptr.add(range.start);
1740            let dst = ptr.add(self.len());
1741            ptr::copy_nonoverlapping(src, dst, count);
1742
1743            self.inc_len(count);
1744            Ok(())
1745        }
1746    }
1747
1748    /// Clones elements from `src` range to the end of the vector.
1749    ///
1750    /// # Panics
1751    /// Panics if the allocation fails.
1752    ///
1753    /// Panics if the starting point is greater than the end point or if
1754    /// the end point is greater than the length of the vector.
1755    ///
1756    /// # Examples
1757    /// ```
1758    /// # use bump_scope::{Bump, bump_vec};
1759    /// # let bump: Bump = Bump::new();
1760    /// let mut vec = bump_vec![in &bump; 0, 1, 2, 3, 4];
1761    ///
1762    /// vec.extend_from_within_clone(2..);
1763    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
1764    ///
1765    /// vec.extend_from_within_clone(..2);
1766    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
1767    ///
1768    /// vec.extend_from_within_clone(4..8);
1769    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
1770    /// ```
1771    #[inline(always)]
1772    #[cfg(feature = "panic-on-alloc")]
1773    pub fn extend_from_within_clone<R>(&mut self, src: R)
1774    where
1775        T: Clone,
1776        R: RangeBounds<usize>,
1777    {
1778        panic_on_error(self.generic_extend_from_within_clone(src));
1779    }
1780
1781    /// Clones elements from `src` range to the end of the vector.
1782    ///
1783    /// # Panics
1784    /// Panics if the starting point is greater than the end point or if
1785    /// the end point is greater than the length of the vector.
1786    ///
1787    /// # Errors
1788    /// Errors if the allocation fails.
1789    ///
1790    /// # Examples
1791    /// ```
1792    /// # use bump_scope::{Bump, bump_vec};
1793    /// # let bump: Bump = Bump::new();
1794    /// let mut vec = bump_vec![try in &bump; 0, 1, 2, 3, 4]?;
1795    ///
1796    /// vec.try_extend_from_within_clone(2..)?;
1797    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
1798    ///
1799    /// vec.try_extend_from_within_clone(..2)?;
1800    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
1801    ///
1802    /// vec.try_extend_from_within_clone(4..8)?;
1803    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
1804    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1805    /// ```
1806    #[inline(always)]
1807    pub fn try_extend_from_within_clone<R>(&mut self, src: R) -> Result<(), AllocError>
1808    where
1809        T: Clone,
1810        R: RangeBounds<usize>,
1811    {
1812        self.generic_extend_from_within_clone(src)
1813    }
1814
1815    #[inline]
1816    pub(crate) fn generic_extend_from_within_clone<E: ErrorBehavior, R>(&mut self, src: R) -> Result<(), E>
1817    where
1818        T: Clone,
1819        R: RangeBounds<usize>,
1820    {
1821        let range = slice::range(src, ..self.len());
1822        let count = range.len();
1823
1824        self.generic_reserve(count)?;
1825
1826        if T::IS_ZST {
1827            unsafe {
1828                // We can materialize ZST's from nothing.
1829                #[expect(clippy::uninit_assumed_init)]
1830                let fake = ManuallyDrop::new(MaybeUninit::<T>::uninit().assume_init());
1831
1832                for _ in 0..count {
1833                    self.push_unchecked((*fake).clone());
1834                }
1835
1836                return Ok(());
1837            }
1838        }
1839
1840        // SAFETY:
1841        // - `slice::range` guarantees that the given range is valid for indexing self
1842        unsafe {
1843            let ptr = self.as_mut_ptr();
1844
1845            let mut src = ptr.add(range.start);
1846            let mut dst = ptr.add(self.len());
1847
1848            let src_end = src.add(count);
1849
1850            while src != src_end {
1851                dst.write((*src).clone());
1852
1853                src = src.add(1);
1854                dst = dst.add(1);
1855                self.inc_len(1);
1856            }
1857        }
1858
1859        Ok(())
1860    }
1861
1862    /// Reserves capacity for at least `additional` more elements to be inserted
1863    /// in the given `BumpVec<T>`. The collection may reserve more space to
1864    /// speculatively avoid frequent reallocations. After calling `reserve`,
1865    /// capacity will be greater than or equal to `self.len() + additional`.
1866    /// Does nothing if capacity is already sufficient.
1867    ///
1868    /// # Panics
1869    /// Panics if the allocation fails.
1870    ///
1871    /// # Examples
1872    /// ```
1873    /// # use bump_scope::{Bump, bump_vec};
1874    /// # let bump: Bump = Bump::new();
1875    /// let mut vec = bump_vec![in &bump; 1];
1876    /// vec.reserve(10);
1877    /// assert!(vec.capacity() >= 11);
1878    /// ```
1879    #[inline(always)]
1880    #[cfg(feature = "panic-on-alloc")]
1881    pub fn reserve(&mut self, additional: usize) {
1882        panic_on_error(self.generic_reserve(additional));
1883    }
1884
1885    /// Reserves capacity for at least `additional` more elements to be inserted
1886    /// in the given `BumpVec<T>`. The collection may reserve more space to
1887    /// speculatively avoid frequent reallocations. After calling `reserve`,
1888    /// capacity will be greater than or equal to `self.len() + additional`.
1889    /// Does nothing if capacity is already sufficient.
1890    ///
1891    /// # Errors
1892    /// Errors if the allocation fails.
1893    ///
1894    /// # Examples
1895    /// ```
1896    /// # use bump_scope::{Bump, bump_vec};
1897    /// # let bump: Bump = Bump::new();
1898    /// let mut vec = bump_vec![try in &bump; 1]?;
1899    /// vec.try_reserve(10)?;
1900    /// assert!(vec.capacity() >= 11);
1901    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1902    /// ```
1903    #[inline(always)]
1904    pub fn try_reserve(&mut self, additional: usize) -> Result<(), AllocError> {
1905        self.generic_reserve(additional)
1906    }
1907
1908    #[inline]
1909    pub(crate) fn generic_reserve<E: ErrorBehavior>(&mut self, additional: usize) -> Result<(), E> {
1910        if additional > (self.capacity() - self.len()) {
1911            self.generic_grow_amortized(additional)?;
1912        }
1913
1914        Ok(())
1915    }
1916
1917    /// Reserves the minimum capacity for at least `additional` more elements to
1918    /// be inserted in the given `BumpVec<T>`. Unlike [`reserve`], this will not
1919    /// deliberately over-allocate to speculatively avoid frequent allocations.
1920    /// After calling `reserve_exact`, capacity will be greater than or equal to
1921    /// `self.len() + additional`. Does nothing if the capacity is already
1922    /// sufficient.
1923    ///
1924    /// Note that the allocator may give the collection more space than it
1925    /// requests. Therefore, capacity cannot be relied upon to be precisely
1926    /// minimal. Prefer [`reserve`] if future insertions are expected.
1927    ///
1928    /// [`reserve`]: Self::reserve
1929    ///
1930    /// # Panics
1931    /// Panics if the allocation fails.
1932    ///
1933    /// # Examples
1934    /// ```
1935    /// # use bump_scope::{Bump, bump_vec};
1936    /// # let bump: Bump = Bump::new();
1937    /// let mut vec = bump_vec![in &bump; 1];
1938    /// vec.reserve_exact(10);
1939    /// assert!(vec.capacity() >= 11);
1940    /// ```
1941    #[inline(always)]
1942    #[cfg(feature = "panic-on-alloc")]
1943    pub fn reserve_exact(&mut self, additional: usize) {
1944        panic_on_error(self.generic_reserve_exact(additional));
1945    }
1946
1947    /// Reserves the minimum capacity for at least `additional` more elements to
1948    /// be inserted in the given `BumpVec<T>`. Unlike [`reserve`], this will not
1949    /// deliberately over-allocate to speculatively avoid frequent allocations.
1950    /// After calling `reserve_exact`, capacity will be greater than or equal to
1951    /// `self.len() + additional`. Does nothing if the capacity is already
1952    /// sufficient.
1953    ///
1954    /// Note that the allocator may give the collection more space than it
1955    /// requests. Therefore, capacity cannot be relied upon to be precisely
1956    /// minimal. Prefer [`reserve`] if future insertions are expected.
1957    ///
1958    /// [`reserve`]: Self::reserve
1959    ///
1960    /// # Errors
1961    /// Errors if the allocation fails.
1962    ///
1963    /// # Examples
1964    /// ```
1965    /// # use bump_scope::{Bump, bump_vec};
1966    /// # let bump: Bump = Bump::new();
1967    /// let mut vec = bump_vec![try in &bump; 1]?;
1968    /// vec.try_reserve_exact(10)?;
1969    /// assert!(vec.capacity() >= 11);
1970    /// # Ok::<(), bump_scope::alloc::AllocError>(())
1971    /// ```
1972    #[inline(always)]
1973    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), AllocError> {
1974        self.generic_reserve_exact(additional)
1975    }
1976
1977    #[inline]
1978    pub(crate) fn generic_reserve_exact<E: ErrorBehavior>(&mut self, additional: usize) -> Result<(), E> {
1979        if additional > (self.capacity() - self.len()) {
1980            self.generic_grow_exact(additional)?;
1981        }
1982
1983        Ok(())
1984    }
1985
1986    /// Resizes the `BumpVec` in-place so that `len` is equal to `new_len`.
1987    ///
1988    /// If `new_len` is greater than `len`, the `BumpVec` is extended by the
1989    /// difference, with each additional slot filled with `value`.
1990    /// If `new_len` is less than `len`, the `BumpVec` is simply truncated.
1991    ///
1992    /// This method requires `T` to implement [`Clone`],
1993    /// in order to be able to clone the passed value.
1994    /// If you need more flexibility (or want to rely on [`Default`] instead of
1995    /// [`Clone`]), use [`resize_with`].
1996    /// If you only need to resize to a smaller size, use [`truncate`].
1997    ///
1998    /// [`resize_with`]: Self::resize_with
1999    /// [`truncate`]: Self::truncate
2000    ///
2001    /// # Panics
2002    /// Panics if the allocation fails.
2003    ///
2004    /// # Examples
2005    /// ```
2006    /// # use bump_scope::{Bump, bump_vec};
2007    /// # let bump: Bump = Bump::new();
2008    /// let mut vec = bump_vec![in &bump; "hello"];
2009    /// vec.resize(3, "world");
2010    /// assert_eq!(vec, ["hello", "world", "world"]);
2011    /// drop(vec);
2012    ///
2013    /// let mut vec = bump_vec![in &bump; 1, 2, 3, 4];
2014    /// vec.resize(2, 0);
2015    /// assert_eq!(vec, [1, 2]);
2016    /// ```
2017    #[inline(always)]
2018    #[cfg(feature = "panic-on-alloc")]
2019    pub fn resize(&mut self, new_len: usize, value: T)
2020    where
2021        T: Clone,
2022    {
2023        panic_on_error(self.generic_resize(new_len, value));
2024    }
2025
2026    /// Resizes the `BumpVec` in-place so that `len` is equal to `new_len`.
2027    ///
2028    /// If `new_len` is greater than `len`, the `BumpVec` is extended by the
2029    /// difference, with each additional slot filled with `value`.
2030    /// If `new_len` is less than `len`, the `BumpVec` is simply truncated.
2031    ///
2032    /// This method requires `T` to implement [`Clone`],
2033    /// in order to be able to clone the passed value.
2034    /// If you need more flexibility (or want to rely on [`Default`] instead of
2035    /// [`Clone`]), use [`resize_with`].
2036    /// If you only need to resize to a smaller size, use [`truncate`].
2037    ///
2038    /// [`resize_with`]: Self::resize_with
2039    /// [`truncate`]: Self::truncate
2040    ///
2041    /// # Errors
2042    /// Errors if the allocation fails.
2043    ///
2044    /// # Examples
2045    /// ```
2046    /// # use bump_scope::{Bump, bump_vec};
2047    /// # let bump: Bump = Bump::new();
2048    /// let mut vec = bump_vec![try in &bump; "hello"]?;
2049    /// vec.try_resize(3, "world")?;
2050    /// assert_eq!(vec, ["hello", "world", "world"]);
2051    /// drop(vec);
2052    ///
2053    /// let mut vec = bump_vec![try in &bump; 1, 2, 3, 4]?;
2054    /// vec.try_resize(2, 0)?;
2055    /// assert_eq!(vec, [1, 2]);
2056    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2057    /// ```
2058    #[inline(always)]
2059    pub fn try_resize(&mut self, new_len: usize, value: T) -> Result<(), AllocError>
2060    where
2061        T: Clone,
2062    {
2063        self.generic_resize(new_len, value)
2064    }
2065
2066    #[inline]
2067    pub(crate) fn generic_resize<E: ErrorBehavior>(&mut self, new_len: usize, value: T) -> Result<(), E>
2068    where
2069        T: Clone,
2070    {
2071        let len = self.len();
2072
2073        if new_len > len {
2074            self.extend_with(new_len - len, value)
2075        } else {
2076            self.truncate(new_len);
2077            Ok(())
2078        }
2079    }
2080
2081    /// Resizes the `BumpVec` in-place so that `len` is equal to `new_len`.
2082    ///
2083    /// If `new_len` is greater than `len`, the `BumpVec` is extended by the
2084    /// difference, with each additional slot filled with the result of
2085    /// calling the closure `f`. The return values from `f` will end up
2086    /// in the `BumpVec` in the order they have been generated.
2087    ///
2088    /// If `new_len` is less than `len`, the `BumpVec` is simply truncated.
2089    ///
2090    /// This method uses a closure to create new values on every push. If
2091    /// you'd rather [`Clone`] a given value, use [`BumpVec::resize`]. If you
2092    /// want to use the [`Default`] trait to generate values, you can
2093    /// pass [`Default::default`] as the second argument.
2094    ///
2095    /// # Panics
2096    /// Panics if the allocation fails.
2097    ///
2098    /// # Examples
2099    /// ```
2100    /// # use bump_scope::{Bump, bump_vec};
2101    /// # let bump: Bump = Bump::new();
2102    /// let mut vec = bump_vec![in &bump; 1, 2, 3];
2103    /// vec.resize_with(5, Default::default);
2104    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
2105    /// drop(vec);
2106    ///
2107    /// let mut vec = bump_vec![in &bump];
2108    /// let mut p = 1;
2109    /// vec.resize_with(4, || { p *= 2; p });
2110    /// assert_eq!(vec, [2, 4, 8, 16]);
2111    /// ```
2112    #[inline(always)]
2113    #[cfg(feature = "panic-on-alloc")]
2114    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
2115    where
2116        F: FnMut() -> T,
2117    {
2118        panic_on_error(self.generic_resize_with(new_len, f));
2119    }
2120
2121    /// Resizes the `BumpVec` in-place so that `len` is equal to `new_len`.
2122    ///
2123    /// If `new_len` is greater than `len`, the `BumpVec` is extended by the
2124    /// difference, with each additional slot filled with the result of
2125    /// calling the closure `f`. The return values from `f` will end up
2126    /// in the `BumpVec` in the order they have been generated.
2127    ///
2128    /// If `new_len` is less than `len`, the `BumpVec` is simply truncated.
2129    ///
2130    /// This method uses a closure to create new values on every push. If
2131    /// you'd rather [`Clone`] a given value, use [`BumpVec::resize`]. If you
2132    /// want to use the [`Default`] trait to generate values, you can
2133    /// pass [`Default::default`] as the second argument.
2134    ///
2135    /// # Errors
2136    /// Errors if the allocation fails.
2137    ///
2138    /// # Examples
2139    /// ```
2140    /// # use bump_scope::{Bump, bump_vec};
2141    /// # let bump: Bump = Bump::new();
2142    /// let mut vec = bump_vec![try in &bump; 1, 2, 3]?;
2143    /// vec.try_resize_with(5, Default::default)?;
2144    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
2145    /// drop(vec);
2146    ///
2147    /// let mut vec = bump_vec![try in &bump]?;
2148    /// let mut p = 1;
2149    /// vec.try_resize_with(4, || { p *= 2; p })?;
2150    /// assert_eq!(vec, [2, 4, 8, 16]);
2151    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2152    /// ```
2153    #[inline(always)]
2154    pub fn try_resize_with<F>(&mut self, new_len: usize, f: F) -> Result<(), AllocError>
2155    where
2156        F: FnMut() -> T,
2157    {
2158        self.generic_resize_with(new_len, f)
2159    }
2160
2161    #[inline]
2162    pub(crate) fn generic_resize_with<E: ErrorBehavior, F>(&mut self, new_len: usize, f: F) -> Result<(), E>
2163    where
2164        F: FnMut() -> T,
2165    {
2166        let len = self.len();
2167        if new_len > len {
2168            unsafe { self.extend_trusted(iter::repeat_with(f).take(new_len - len)) }
2169        } else {
2170            self.truncate(new_len);
2171            Ok(())
2172        }
2173    }
2174
2175    /// Moves all the elements of `other` into `self`, leaving `other` empty.
2176    ///
2177    /// # Panics
2178    /// Panics if the allocation fails.
2179    ///
2180    /// # Examples
2181    /// ```
2182    /// # use bump_scope::{Bump, BumpVec};
2183    /// # let bump: Bump = Bump::new();
2184    /// let mut vec = BumpVec::new_in(&bump);
2185    ///
2186    /// // append by value
2187    /// vec.append([1, 2]);
2188    /// vec.append(vec![3, 4]);
2189    /// vec.append(bump.alloc_iter(5..=6));
2190    ///
2191    /// // append by mutable reference
2192    /// let mut other = vec![7, 8];
2193    /// vec.append(&mut other);
2194    ///
2195    /// assert_eq!(other, []);
2196    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6, 7, 8]);
2197    /// ```
2198    #[inline(always)]
2199    #[cfg(feature = "panic-on-alloc")]
2200    pub fn append(&mut self, other: impl OwnedSlice<Item = T>) {
2201        panic_on_error(self.generic_append(other));
2202    }
2203
2204    /// Moves all the elements of `other` into `self`, leaving `other` empty.
2205    ///
2206    /// # Errors
2207    /// Errors if the allocation fails.
2208    ///
2209    /// # Examples
2210    /// ```
2211    /// # use bump_scope::{Bump, BumpVec};
2212    /// # let bump: Bump = Bump::new();
2213    /// let mut vec = BumpVec::new_in(&bump);
2214    ///
2215    /// // append by value
2216    /// vec.try_append([1, 2])?;
2217    /// vec.try_append(vec![3, 4])?;
2218    /// vec.try_append(bump.alloc_iter(5..=6))?;
2219    ///
2220    /// // append by mutable reference
2221    /// let mut other = vec![7, 8];
2222    /// vec.try_append(&mut other)?;
2223    ///
2224    /// assert_eq!(other, []);
2225    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6, 7, 8]);
2226    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2227    /// ```
2228    #[inline(always)]
2229    pub fn try_append(&mut self, other: impl OwnedSlice<Item = T>) -> Result<(), AllocError> {
2230        self.generic_append(other)
2231    }
2232
2233    #[inline]
2234    pub(crate) fn generic_append<E: ErrorBehavior>(&mut self, other: impl OwnedSlice<Item = T>) -> Result<(), E> {
2235        unsafe {
2236            let mut owned_slice = other.into_take_owned_slice();
2237
2238            let slice = NonNull::from(owned_slice.owned_slice_ref());
2239            self.generic_reserve(slice.len())?;
2240
2241            let src = slice.cast::<T>().as_ptr();
2242            let dst = self.as_mut_ptr().add(self.len());
2243            ptr::copy_nonoverlapping(src, dst, slice.len());
2244
2245            owned_slice.take_owned_slice();
2246            self.inc_len(slice.len());
2247            Ok(())
2248        }
2249    }
2250
2251    /// Returns a vector of the same size as `self`, with function `f` applied to each element in order.
2252    ///
2253    /// Compared to `from_iter_in(into_iter().map(f), ...)` this method has the advantage that it can reuse the existing allocation.
2254    ///
2255    /// # Panics
2256    /// Panics if the allocation fails. An allocation only occurs when the alignment or size of `U` is greater than that of `T`.
2257    ///
2258    /// # Examples
2259    /// Mapping to a type with an equal alignment and size (no allocation):
2260    /// ```
2261    /// # use bump_scope::{Bump, BumpVec};
2262    /// # use core::num::NonZero;
2263    /// # let bump: Bump = Bump::new();
2264    /// let a = BumpVec::from_iter_exact_in([0, 1, 2], &bump);
2265    /// let b = a.map(NonZero::new);
2266    /// assert_eq!(format!("{b:?}"), "[None, Some(1), Some(2)]");
2267    /// ```
2268    ///
2269    /// Mapping to a type with a smaller alignment and size (no allocation, capacity may grow):
2270    /// ```
2271    /// # use bump_scope::{Bump, BumpVec};
2272    /// # let bump: Bump = Bump::new();
2273    /// let vec_a: BumpVec<u32, _> = BumpVec::from_iter_in([1, 2, 3, 4], &bump);
2274    /// assert_eq!(vec_a.capacity(), 4);
2275    /// assert_eq!(bump.stats().allocated(), 4 * 4);
2276    ///
2277    /// let vec_b: BumpVec<u16, _> = vec_a.map(|i| i as u16);
2278    /// assert_eq!(vec_b.capacity(), 8);
2279    /// assert_eq!(bump.stats().allocated(), 4 * 4);
2280    /// ```
2281    ///
2282    /// Mapping to a type with a higher alignment or size is equivalent to
2283    /// calling `from_iter_in(into_iter().map(f), ...)`:
2284    /// ```
2285    /// # use bump_scope::{Bump, BumpVec};
2286    /// # let bump: Bump = Bump::new();
2287    /// let vec_a: BumpVec<u16, _> = BumpVec::from_iter_in([1, 2, 3, 4], &bump);
2288    /// assert_eq!(vec_a.capacity(), 4);
2289    /// assert_eq!(bump.stats().allocated(), 4 * 2);
2290    ///
2291    /// let vec_b: BumpVec<u32, _> = vec_a.map(|i| i as u32);
2292    /// assert_eq!(vec_b.capacity(), 4);
2293    /// assert_eq!(bump.stats().allocated(), 4 * 2 + 4 * 4);
2294    /// ```
2295    #[inline(always)]
2296    #[cfg(feature = "panic-on-alloc")]
2297    pub fn map<U>(self, f: impl FnMut(T) -> U) -> BumpVec<U, A>
2298    where
2299        A: Clone,
2300    {
2301        panic_on_error(self.generic_map(f))
2302    }
2303
2304    /// Returns a vector of the same size as `self`, with function `f` applied to each element in order.
2305    ///
2306    /// Compared to `try_from_iter_in(into_iter().map(f), ...)` this method has the advantage that it can reuse the existing allocation.
2307    ///
2308    /// # Errors
2309    /// Errors if the allocation fails. An allocation can only occurs when the alignment or size of `U` is greater than that of `T`.
2310    ///
2311    /// # Examples
2312    /// Mapping to a type with an equal alignment and size (no allocation):
2313    /// ```
2314    /// # use bump_scope::{Bump, BumpVec};
2315    /// # use core::num::NonZero;
2316    /// # let bump: Bump = Bump::new();
2317    /// let a = BumpVec::try_from_iter_exact_in([0, 1, 2], &bump)?;
2318    /// let b = a.try_map(NonZero::new)?;
2319    /// assert_eq!(format!("{b:?}"), "[None, Some(1), Some(2)]");
2320    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2321    /// ```
2322    ///
2323    /// Mapping to a type with a smaller alignment and size (no allocation, capacity may grow):
2324    /// ```
2325    /// # use bump_scope::{Bump, BumpVec};
2326    /// # let bump: Bump = Bump::new();
2327    /// let vec_a: BumpVec<u32, _> = BumpVec::try_from_iter_in([1, 2, 3, 4], &bump)?;
2328    /// assert_eq!(vec_a.capacity(), 4);
2329    /// assert_eq!(bump.stats().allocated(), 4 * 4);
2330    ///
2331    /// let vec_b: BumpVec<u16, _> = vec_a.try_map(|i| i as u16)?;
2332    /// assert_eq!(vec_b.capacity(), 8);
2333    /// assert_eq!(bump.stats().allocated(), 4 * 4);
2334    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2335    /// ```
2336    ///
2337    /// Mapping to a type with a higher alignment or size is equivalent to
2338    /// calling `try_from_iter_in(into_iter().map(f), ...)`:
2339    /// ```
2340    /// # use bump_scope::{Bump, BumpVec};
2341    /// # let bump: Bump = Bump::new();
2342    /// let vec_a: BumpVec<u16, _> = BumpVec::try_from_iter_in([1, 2, 3, 4], &bump)?;
2343    /// assert_eq!(vec_a.capacity(), 4);
2344    /// assert_eq!(bump.stats().allocated(), 4 * 2);
2345    ///
2346    /// let vec_b: BumpVec<u32, _> = vec_a.try_map(|i| i as u32)?;
2347    /// assert_eq!(vec_b.capacity(), 4);
2348    /// assert_eq!(bump.stats().allocated(), 4 * 2 + 4 * 4);
2349    /// # Ok::<(), bump_scope::alloc::AllocError>(())
2350    /// ```
2351    #[inline(always)]
2352    pub fn try_map<U>(self, f: impl FnMut(T) -> U) -> Result<BumpVec<U, A>, AllocError>
2353    where
2354        A: Clone,
2355    {
2356        self.generic_map(f)
2357    }
2358
2359    #[inline]
2360    fn generic_map<B: ErrorBehavior, U>(self, mut f: impl FnMut(T) -> U) -> Result<BumpVec<U, A>, B>
2361    where
2362        A: Clone,
2363    {
2364        if !T::IS_ZST && !U::IS_ZST && T::ALIGN >= U::ALIGN && T::SIZE >= U::SIZE {
2365            struct DropGuard<T, U, A: BumpAllocatorTyped> {
2366                ptr: NonNull<T>,
2367                cap: usize,
2368                end: *mut T,
2369                src: *mut T,
2370                dst: *mut U,
2371                allocator: A,
2372            }
2373
2374            impl<T, U, A: BumpAllocatorTyped> DropGuard<T, U, A> {
2375                fn into_allocator(self) -> A {
2376                    destructure!(let Self { allocator } = self);
2377                    allocator
2378                }
2379            }
2380
2381            impl<T, U, A: BumpAllocatorTyped> Drop for DropGuard<T, U, A> {
2382                fn drop(&mut self) {
2383                    unsafe {
2384                        // drop `T`s
2385                        let drop_ptr = self.src.add(1);
2386                        let drop_len = pointer::offset_from_unsigned(self.end, drop_ptr);
2387                        ptr::slice_from_raw_parts_mut(drop_ptr, drop_len).drop_in_place();
2388
2389                        // drop `U`s
2390                        let drop_ptr = self.ptr.as_ptr().cast::<U>();
2391                        let drop_len = pointer::offset_from_unsigned(self.dst, drop_ptr);
2392                        ptr::slice_from_raw_parts_mut(drop_ptr, drop_len).drop_in_place();
2393
2394                        if T::IS_ZST || self.cap == 0 {
2395                            return;
2396                        }
2397
2398                        let layout = Layout::from_size_align_unchecked(self.cap * T::SIZE, T::ALIGN);
2399                        self.allocator.deallocate(self.ptr.cast(), layout);
2400                    }
2401                }
2402            }
2403
2404            destructure!(let Self { fixed, allocator } = self);
2405            let cap = fixed.capacity();
2406            let slice = unsafe { fixed.cook() }.into_boxed_slice().into_raw();
2407            let ptr = slice.cast::<T>();
2408            let len = slice.len();
2409
2410            unsafe {
2411                let mut guard = DropGuard::<T, U, A> {
2412                    ptr,
2413                    cap,
2414                    end: ptr.as_ptr().add(len),
2415                    src: ptr.as_ptr(),
2416                    dst: ptr.as_ptr().cast(),
2417                    allocator,
2418                };
2419
2420                while guard.src < guard.end {
2421                    let src_value = guard.src.read();
2422                    let dst_value = f(src_value);
2423                    guard.dst.write(dst_value);
2424                    guard.src = guard.src.add(1);
2425                    guard.dst = guard.dst.add(1);
2426                }
2427
2428                let allocator = guard.into_allocator();
2429                let new_cap = (cap * T::SIZE) / U::SIZE;
2430
2431                Ok(BumpVec {
2432                    fixed: RawFixedBumpVec::from_raw_parts(NonNull::slice_from_raw_parts(ptr.cast(), len), new_cap),
2433                    allocator,
2434                })
2435            }
2436        } else {
2437            // fallback
2438            let allocator = self.allocator.clone();
2439            Ok(BumpVec::generic_from_iter_exact_in(self.into_iter().map(f), allocator)?)
2440        }
2441    }
2442
2443    /// Returns a vector of the same size as `self`, with function `f` applied to each element in order.
2444    ///
2445    /// This function only compiles when `U`s size and alignment is less or equal to `T`'s or if `U` has a size of 0.
2446    ///
2447    /// # Examples
2448    /// Mapping to a type with an equal alignment and size:
2449    /// ```
2450    /// # use bump_scope::{Bump, BumpVec};
2451    /// # use core::num::NonZero;
2452    /// # let bump: Bump = Bump::new();
2453    /// let a = BumpVec::from_iter_exact_in([0, 1, 2], &bump);
2454    /// let b = a.map_in_place(NonZero::new);
2455    /// assert_eq!(format!("{b:?}"), "[None, Some(1), Some(2)]");
2456    /// ```
2457    ///
2458    /// Mapping to a type with a smaller alignment and size:
2459    /// ```
2460    /// # use bump_scope::{Bump, BumpVec};
2461    /// # let bump: Bump = Bump::new();
2462    /// let a: BumpVec<u32, _> = BumpVec::from_iter_exact_in([0, 1, 2], &bump);
2463    /// assert_eq!(a.capacity(), 3);
2464    ///
2465    /// let b: BumpVec<u16, _> = a.map_in_place(|i| i as u16);
2466    /// assert_eq!(b.capacity(), 6);
2467    ///
2468    /// assert_eq!(b, [0, 1, 2]);
2469    /// ```
2470    ///
2471    /// Mapping to a type with a greater alignment or size won't compile:
2472    /// ```compile_fail,E0080
2473    /// # use bump_scope::{Bump, BumpVec};
2474    /// # let bump: Bump = Bump::new();
2475    /// let a: BumpVec<u16, _> = BumpVec::from_iter_exact_in([0, 1, 2], &bump);
2476    /// let b: BumpVec<u32, _> = a.map_in_place(|i| i as u32);
2477    /// # _ = b;
2478    /// ```
2479    ///
2480    /// Mapping to a type with a greater size won't compile:
2481    /// ```compile_fail,E0080
2482    /// # use bump_scope::{Bump, BumpVec};
2483    /// # let bump: Bump = Bump::new();
2484    /// let a: BumpVec<u32, _> = BumpVec::from_iter_exact_in([42], &bump);
2485    /// let b: BumpVec<[u32; 2], _> = a.map_in_place(|i| [i; 2]);
2486    /// # _ = b;
2487    /// ```
2488    pub fn map_in_place<U>(self, f: impl FnMut(T) -> U) -> BumpVec<U, A> {
2489        destructure!(let Self { fixed, allocator } = self);
2490
2491        // `FixedBumpVec::map_in_place` handles dropping `T`s and `U`s on panic.
2492        // What is left to do is deallocating the memory.
2493
2494        struct DropGuard<T, A: BumpAllocatorTyped> {
2495            ptr: NonNull<T>,
2496            cap: usize,
2497            allocator: A,
2498        }
2499
2500        impl<T, A: BumpAllocatorTyped> DropGuard<T, A> {
2501            fn into_allocator(self) -> A {
2502                destructure!(let Self { allocator } = self);
2503                allocator
2504            }
2505        }
2506
2507        impl<T, A: BumpAllocatorTyped> Drop for DropGuard<T, A> {
2508            fn drop(&mut self) {
2509                unsafe {
2510                    if T::IS_ZST || self.cap == 0 {
2511                        return;
2512                    }
2513
2514                    let layout = Layout::from_size_align_unchecked(self.cap * T::SIZE, T::ALIGN);
2515                    self.allocator.deallocate(self.ptr.cast(), layout);
2516                }
2517            }
2518        }
2519
2520        let guard = DropGuard::<T, _> {
2521            ptr: fixed.as_non_null(),
2522            cap: fixed.capacity(),
2523            allocator,
2524        };
2525
2526        let fixed = unsafe { RawFixedBumpVec::from_cooked(fixed.cook().map_in_place(f)) };
2527        let allocator = guard.into_allocator();
2528
2529        BumpVec { fixed, allocator }
2530    }
2531
2532    /// Creates a splicing iterator that replaces the specified range in the vector
2533    /// with the given `replace_with` iterator and yields the removed items.
2534    /// `replace_with` does not need to be the same length as `range`.
2535    ///
2536    /// `range` is removed even if the iterator is not consumed until the end.
2537    ///
2538    /// It is unspecified how many elements are removed from the vector
2539    /// if the `Splice` value is leaked.
2540    ///
2541    /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped.
2542    ///
2543    /// This is optimal if:
2544    ///
2545    /// * The tail (elements in the vector after `range`) is empty,
2546    /// * or `replace_with` yields fewer or equal elements than `range`’s length
2547    /// * or the lower bound of its `size_hint()` is exact.
2548    ///
2549    /// Otherwise, a temporary vector is allocated and the tail is moved twice.
2550    ///
2551    /// # Panics
2552    ///
2553    /// Panics if the starting point is greater than the end point or if
2554    /// the end point is greater than the length of the vector.
2555    ///
2556    /// # Examples
2557    ///
2558    /// ```
2559    /// # use bump_scope::{Bump, bump_vec};
2560    /// # let bump: Bump = Bump::new();
2561    /// let mut v = bump_vec![in &bump; 1, 2, 3, 4];
2562    /// let new = [7, 8, 9];
2563    /// let u = bump.alloc_iter(v.splice(1..3, new));
2564    /// assert_eq!(v, [1, 7, 8, 9, 4]);
2565    /// assert_eq!(u, [2, 3]);
2566    /// ```
2567    #[cfg(feature = "panic-on-alloc")]
2568    #[inline]
2569    pub fn splice<R, I>(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter, A>
2570    where
2571        R: RangeBounds<usize>,
2572        I: IntoIterator<Item = T>,
2573    {
2574        // Memory safety
2575        //
2576        // When the Drain is first created, it shortens the length of
2577        // the source vector to make sure no uninitialized or moved-from elements
2578        // are accessible at all if the Drain's destructor never gets to run.
2579        //
2580        // Drain will ptr::read out the values to remove.
2581        // When finished, remaining tail of the vec is copied back to cover
2582        // the hole, and the vector length is restored to the new length.
2583
2584        use core::ops::Range;
2585        let len = self.len();
2586        let Range { start, end } = slice::range(range, ..len);
2587
2588        let drain = unsafe {
2589            // set self.vec length's to start, to be safe in case Drain is leaked
2590            self.set_len(start);
2591            let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
2592
2593            Drain {
2594                tail_start: end,
2595                tail_len: len - end,
2596                iter: range_slice.iter(),
2597                vec: NonNull::from(self),
2598            }
2599        };
2600
2601        Splice {
2602            drain,
2603            replace_with: replace_with.into_iter(),
2604        }
2605    }
2606
2607    /// Like [`reserve`] but allows you to provide a different `len`.
2608    ///
2609    /// This helps with algorithms from the standard library that make use of
2610    /// `RawVec::reserve` which behaves the same.
2611    ///
2612    /// # Safety
2613    ///
2614    /// - `len` must be less than or equal to `self.capacity()`
2615    ///
2616    /// [`reserve`]: Self::reserve
2617    #[inline(always)]
2618    #[cfg(feature = "panic-on-alloc")]
2619    pub(crate) unsafe fn buf_reserve(&mut self, len: usize, additional: usize) {
2620        unsafe {
2621            if additional > (self.capacity() - len) {
2622                panic_on_error(self.generic_grow_amortized_buf(len, additional));
2623            }
2624        }
2625    }
2626
2627    /// Extend the vector by `n` clones of value.
2628    fn extend_with<B: ErrorBehavior>(&mut self, n: usize, value: T) -> Result<(), B>
2629    where
2630        T: Clone,
2631    {
2632        self.generic_reserve(n)?;
2633        unsafe {
2634            self.fixed.cook_mut().extend_with_unchecked(n, value);
2635        }
2636        Ok(())
2637    }
2638
2639    #[inline(always)]
2640    unsafe fn extend_by_copy_nonoverlapping<E: ErrorBehavior>(&mut self, other: *const [T]) -> Result<(), E> {
2641        unsafe {
2642            let len = other.len();
2643            self.generic_reserve(len)?;
2644
2645            let src = other.cast::<T>();
2646            let dst = self.as_mut_ptr().add(self.len());
2647            ptr::copy_nonoverlapping(src, dst, len);
2648
2649            self.inc_len(len);
2650            Ok(())
2651        }
2652    }
2653
2654    #[inline]
2655    fn generic_reserve_one<E: ErrorBehavior>(&mut self) -> Result<(), E> {
2656        if self.capacity() == self.len() {
2657            self.generic_grow_amortized::<E>(1)?;
2658        }
2659
2660        Ok(())
2661    }
2662
2663    #[cold]
2664    #[inline(never)]
2665    fn generic_grow_amortized<E: ErrorBehavior>(&mut self, additional: usize) -> Result<(), E> {
2666        if T::IS_ZST {
2667            // This function is only called after we checked that the current capacity is not
2668            // sufficient. When `T::IS_ZST` the capacity is `usize::MAX`, so it can't grow.
2669            return Err(E::capacity_overflow());
2670        }
2671
2672        let Some(required_cap) = self.len().checked_add(additional) else {
2673            return Err(E::capacity_overflow())?;
2674        };
2675
2676        let new_cap = self.capacity().checked_mul(2).unwrap_or(required_cap).max(required_cap);
2677        let new_cap = new_cap.max(min_non_zero_cap(T::SIZE));
2678
2679        unsafe { self.generic_grow_to(new_cap) }
2680    }
2681
2682    /// Like [`reserve`] but allows you to provide a different `len`.
2683    ///
2684    /// This is only used for [`buf_reserve`], read its documentation for more.
2685    ///
2686    /// # Safety
2687    ///
2688    /// - `len` must be less than or equal to `self.capacity()`
2689    ///
2690    /// [`reserve`]: Self::reserve
2691    /// [`buf_reserve`]: Self::buf_reserve
2692    #[cold]
2693    #[inline(never)]
2694    #[cfg(feature = "panic-on-alloc")]
2695    unsafe fn generic_grow_amortized_buf<E: ErrorBehavior>(&mut self, len: usize, additional: usize) -> Result<(), E> {
2696        if T::IS_ZST {
2697            // This function is only called after we checked that the current capacity is not
2698            // sufficient. When `T::IS_ZST` the capacity is `usize::MAX`, so it can't grow.
2699            return Err(E::capacity_overflow());
2700        }
2701
2702        let Some(required_cap) = len.checked_add(additional) else {
2703            return Err(E::capacity_overflow())?;
2704        };
2705
2706        // This guarantees exponential growth. The doubling cannot overflow
2707        // because `capacity <= isize::MAX` and the type of `capacity` is usize;
2708        let new_cap = (self.capacity() * 2).max(required_cap).max(min_non_zero_cap(T::SIZE));
2709
2710        unsafe { self.generic_grow_to(new_cap) }
2711    }
2712
2713    #[cold]
2714    #[inline(never)]
2715    fn generic_grow_exact<E: ErrorBehavior>(&mut self, additional: usize) -> Result<(), E> {
2716        if T::IS_ZST {
2717            // This function is only called after we checked that the current capacity is not
2718            // sufficient. When `T::IS_ZST` the capacity is `usize::MAX`, so it can't grow.
2719            return Err(E::capacity_overflow());
2720        }
2721
2722        let Some(required_cap) = self.len().checked_add(additional) else {
2723            return Err(E::capacity_overflow())?;
2724        };
2725
2726        unsafe { self.generic_grow_to(required_cap) }
2727    }
2728
2729    /// # Safety
2730    ///
2731    /// `new_capacity` must be greater than the current capacity.
2732    unsafe fn generic_grow_to<E: ErrorBehavior>(&mut self, new_capacity: usize) -> Result<(), E> {
2733        unsafe {
2734            let new_cap = new_capacity;
2735
2736            if self.capacity() == 0 {
2737                self.fixed = RawFixedBumpVec::allocate(&self.allocator, new_cap)?;
2738                return Ok(());
2739            }
2740
2741            let old_ptr = self.as_non_null().cast();
2742
2743            let old_size = self.capacity() * T::SIZE; // we already allocated that amount so this can't overflow
2744            let Some(new_size) = new_cap.checked_mul(T::SIZE) else {
2745                return Err(E::capacity_overflow());
2746            };
2747
2748            let old_layout = Layout::from_size_align_unchecked(old_size, T::ALIGN);
2749            let Ok(new_layout) = Layout::from_size_align(new_size, T::ALIGN) else {
2750                return Err(E::capacity_overflow());
2751            };
2752
2753            let new_ptr = match self.allocator.grow(old_ptr, old_layout, new_layout) {
2754                Ok(ok) => ok.cast(),
2755                Err(_) => return Err(E::allocation(new_layout)),
2756            };
2757
2758            self.fixed.set_ptr(new_ptr);
2759            self.fixed.set_cap(new_cap);
2760
2761            Ok(())
2762        }
2763    }
2764
2765    /// Shrinks the capacity of the vector as much as possible.
2766    ///
2767    /// Shrinking will only take place if this vector owns the last allocation.
2768    ///
2769    /// # Examples
2770    /// ```
2771    /// # use bump_scope::{Bump, BumpVec, bump_vec};
2772    /// # let bump: Bump = Bump::new();
2773    /// let mut vec: BumpVec<u8, _> = bump_vec![in &bump; 1, 2, 3];
2774    /// assert!(vec.len() == 3);
2775    /// assert!(vec.capacity() == 3);
2776    /// assert_eq!(bump.stats().allocated(), 3);
2777    ///
2778    /// vec.pop();
2779    /// vec.shrink_to_fit();
2780    /// assert!(vec.len() == 2);
2781    /// assert!(vec.capacity() == 2);
2782    /// assert_eq!(bump.stats().allocated(), 2);
2783    ///
2784    /// // allocate something so the vec is no longer the last allocation
2785    /// bump.alloc::<u8>(123);
2786    ///
2787    /// // now shrinking won't take place, capacity stays the same
2788    /// vec.pop();
2789    /// vec.shrink_to_fit();
2790    /// assert!(vec.len() == 1);
2791    /// assert!(vec.capacity() == 2);
2792    /// ```
2793    pub fn shrink_to_fit(&mut self) {
2794        let Self { fixed, allocator } = self;
2795
2796        let ptr = fixed.as_non_null();
2797        let cap = fixed.capacity();
2798        let len = fixed.len();
2799
2800        // The capacity is never less than the length and there is nothing to do when
2801        // they are equal. This also checks that the capacity is not zero. If the
2802        // capacity is zero then no allocation has been made and the call to shrink
2803        // would be unsound.
2804        if T::IS_ZST || cap <= len {
2805            return;
2806        }
2807
2808        unsafe {
2809            if let Some(new_ptr) = allocator.shrink_slice(ptr, cap, len) {
2810                fixed.set_ptr(new_ptr);
2811                fixed.set_cap(len);
2812            }
2813        }
2814    }
2815
2816    /// Shrinks the capacity of the vector with a lower bound.
2817    ///
2818    /// The capacity will remain at least as large as both the length
2819    /// and the supplied value.
2820    ///
2821    /// If the current capacity is less than the lower limit, this is a no-op.
2822    ///
2823    /// # Examples
2824    ///
2825    /// ```
2826    /// # use bump_scope::{Bump, BumpVec};
2827    /// # let bump: Bump = Bump::new();
2828    /// let mut vec = BumpVec::with_capacity_in(10, &bump);
2829    /// vec.extend([1, 2, 3]);
2830    /// assert!(vec.capacity() >= 10);
2831    /// vec.shrink_to(4);
2832    /// assert!(vec.capacity() >= 4);
2833    /// vec.shrink_to(0);
2834    /// assert!(vec.capacity() >= 3);
2835    /// ```
2836    pub fn shrink_to(&mut self, min_capacity: usize) {
2837        let Self { fixed, allocator } = self;
2838
2839        let old_ptr = fixed.as_non_null();
2840        let old_cap = fixed.capacity();
2841        let new_cap = fixed.len().max(min_capacity);
2842
2843        // When the new capacity is not smaller than the old capacity then there
2844        // is nothing to do. This also checks that the capacity is not zero. If the
2845        // capacity is zero then no allocation has been made and the call to shrink
2846        // would be unsound.
2847        if T::IS_ZST || old_cap <= new_cap {
2848            return;
2849        }
2850
2851        unsafe {
2852            if let Some(new_ptr) = allocator.shrink_slice(old_ptr, old_cap, new_cap) {
2853                fixed.set_ptr(new_ptr);
2854                fixed.set_cap(new_cap);
2855            }
2856        }
2857    }
2858
2859    /// # Safety
2860    ///
2861    /// `iterator` must satisfy the invariants of nightly's `TrustedLen`.
2862    unsafe fn extend_trusted<B: ErrorBehavior>(&mut self, iterator: impl Iterator<Item = T>) -> Result<(), B> {
2863        unsafe {
2864            let (low, high) = iterator.size_hint();
2865            if let Some(additional) = high {
2866                debug_assert_eq!(
2867                    low,
2868                    additional,
2869                    "TrustedLen iterator's size hint is not exact: {:?}",
2870                    (low, high)
2871                );
2872
2873                self.generic_reserve(additional)?;
2874
2875                let ptr = self.as_mut_ptr();
2876                let mut local_len = self.fixed.set_len_on_drop();
2877
2878                iterator.for_each(move |element| {
2879                    let dst = ptr.add(local_len.current_len());
2880
2881                    ptr::write(dst, element);
2882                    // Since the loop executes user code which can panic we have to update
2883                    // the length every step to correctly drop what we've written.
2884                    // NB can't overflow since we would have had to alloc the address space
2885                    local_len.increment_len(1);
2886                });
2887
2888                Ok(())
2889            } else {
2890                // Per TrustedLen contract a `None` upper bound means that the iterator length
2891                // truly exceeds usize::MAX, which would eventually lead to a capacity overflow anyway.
2892                // Since the other branch already panics eagerly (via `reserve()`) we do the same here.
2893                // This avoids additional codegen for a fallback code path which would eventually
2894                // panic anyway.
2895                Err(B::capacity_overflow())
2896            }
2897        }
2898    }
2899
2900    /// Retains only the elements specified by the predicate, passing a mutable reference to it.
2901    ///
2902    /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
2903    /// This method operates in place, visiting each element exactly once in the
2904    /// original order, and preserves the order of the retained elements.
2905    ///
2906    /// # Examples
2907    ///
2908    /// ```
2909    /// # use bump_scope::{Bump, bump_vec};
2910    /// # let bump: Bump = Bump::new();
2911    /// #
2912    /// let mut vec = bump_vec![in &bump; 1, 2, 3, 4];
2913    ///
2914    /// vec.retain(|x| if *x <= 3 {
2915    ///     *x += 1;
2916    ///     true
2917    /// } else {
2918    ///     false
2919    /// });
2920    ///
2921    /// assert_eq!(vec, [2, 3, 4]);
2922    /// ```
2923    #[expect(clippy::pedantic)]
2924    pub fn retain<F>(&mut self, f: F)
2925    where
2926        F: FnMut(&mut T) -> bool,
2927    {
2928        unsafe { self.fixed.cook_mut() }.retain(f)
2929    }
2930
2931    /// Removes the specified range from the vector in bulk, returning all
2932    /// removed elements as an iterator. If the iterator is dropped before
2933    /// being fully consumed, it drops the remaining removed elements.
2934    ///
2935    /// The returned iterator keeps a mutable borrow on the vector to optimize
2936    /// its implementation.
2937    ///
2938    /// # Panics
2939    ///
2940    /// Panics if the starting point is greater than the end point or if
2941    /// the end point is greater than the length of the vector.
2942    ///
2943    /// # Leaking
2944    ///
2945    /// If the returned iterator goes out of scope without being dropped (due to
2946    /// [`mem::forget`](core::mem::forget), for example), the vector may have lost and leaked
2947    /// elements arbitrarily, including elements outside the range.
2948    ///
2949    /// # Examples
2950    ///
2951    /// ```
2952    /// # use bump_scope::{Bump, bump_vec};
2953    /// # let bump: Bump = Bump::new();
2954    /// let mut v = bump_vec![in &bump; 1, 2, 3];
2955    /// let u = bump.alloc_iter(v.drain(1..));
2956    /// assert_eq!(v, [1]);
2957    /// assert_eq!(u, [2, 3]);
2958    ///
2959    /// // A full range clears the vector, like `clear()` does
2960    /// v.drain(..);
2961    /// assert_eq!(v, []);
2962    /// ```
2963    pub fn drain<R>(&mut self, range: R) -> owned_slice::Drain<'_, T>
2964    where
2965        R: RangeBounds<usize>,
2966    {
2967        unsafe { self.fixed.cook_mut() }.drain(range)
2968    }
2969
2970    /// Creates an iterator which uses a closure to determine if an element should be removed.
2971    ///
2972    /// If the closure returns true, then the element is removed and yielded.
2973    /// If the closure returns false, the element will remain in the vector and will not be yielded
2974    /// by the iterator.
2975    ///
2976    /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating
2977    /// or the iteration short-circuits, then the remaining elements will be retained.
2978    /// Use [`retain`] with a negated predicate if you do not need the returned iterator.
2979    ///
2980    /// Using this method is equivalent to the following code:
2981    ///
2982    /// ```
2983    /// # use bump_scope::{Bump, bump_vec};
2984    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6 };
2985    /// # let bump: Bump = Bump::new();
2986    /// # let mut vec = bump_vec![in &bump; 1, 2, 3, 4, 5, 6];
2987    /// let mut i = 0;
2988    /// while i < vec.len() {
2989    ///     if some_predicate(&mut vec[i]) {
2990    ///         let val = vec.remove(i);
2991    ///         // your code here
2992    ///         # _ = val;
2993    ///     } else {
2994    ///         i += 1;
2995    ///     }
2996    /// }
2997    ///
2998    /// # assert_eq!(vec, [1, 4, 5]);
2999    /// ```
3000    ///
3001    /// But `extract_if` is easier to use. `extract_if` is also more efficient,
3002    /// because it can backshift the elements of the array in bulk.
3003    ///
3004    /// Note that `extract_if` also lets you mutate every element in the filter closure,
3005    /// regardless of whether you choose to keep or remove it.
3006    ///
3007    /// # Examples
3008    ///
3009    /// Splitting an array into evens and odds, reusing the original allocation:
3010    ///
3011    /// ```
3012    /// # use bump_scope::{Bump, bump_vec};
3013    /// # let bump: Bump = Bump::new();
3014    /// let mut numbers = bump_vec![in &bump; 1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
3015    ///
3016    /// let evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();
3017    /// let odds = numbers;
3018    ///
3019    /// assert_eq!(evens, [2, 4, 6, 8, 14]);
3020    /// assert_eq!(odds, [1, 3, 5, 9, 11, 13, 15]);
3021    /// ```
3022    ///
3023    /// [`retain`]: Self::retain
3024    pub fn extract_if<F>(&mut self, filter: F) -> owned_slice::ExtractIf<'_, T, F>
3025    where
3026        F: FnMut(&mut T) -> bool,
3027    {
3028        unsafe { self.fixed.cook_mut() }.extract_if(filter)
3029    }
3030
3031    /// Removes consecutive repeated elements in the vector according to the
3032    /// [`PartialEq`] trait implementation.
3033    ///
3034    /// If the vector is sorted, this removes all duplicates.
3035    ///
3036    /// # Examples
3037    ///
3038    /// ```
3039    /// # use bump_scope::{Bump, bump_vec};
3040    /// # let bump: Bump = Bump::new();
3041    /// let mut vec = bump_vec![in &bump; 1, 2, 2, 3, 2];
3042    ///
3043    /// vec.dedup();
3044    ///
3045    /// assert_eq!(vec, [1, 2, 3, 2]);
3046    /// ```
3047    #[inline]
3048    pub fn dedup(&mut self)
3049    where
3050        T: PartialEq,
3051    {
3052        unsafe { self.fixed.cook_mut() }.dedup();
3053    }
3054
3055    /// Removes all but the first of consecutive elements in the vector that resolve to the same
3056    /// key.
3057    ///
3058    /// If the vector is sorted, this removes all duplicates.
3059    ///
3060    /// # Examples
3061    ///
3062    /// ```
3063    /// # use bump_scope::{Bump, bump_vec};
3064    /// # let bump: Bump = Bump::new();
3065    /// let mut vec = bump_vec![in &bump; 10, 20, 21, 30, 20];
3066    ///
3067    /// vec.dedup_by_key(|i| *i / 10);
3068    ///
3069    /// assert_eq!(vec, [10, 20, 30, 20]);
3070    /// ```
3071    #[inline]
3072    pub fn dedup_by_key<F, K>(&mut self, key: F)
3073    where
3074        F: FnMut(&mut T) -> K,
3075        K: PartialEq,
3076    {
3077        unsafe { self.fixed.cook_mut() }.dedup_by_key(key);
3078    }
3079
3080    /// Removes all but the first of consecutive elements in the vector satisfying a given equality
3081    /// relation.
3082    ///
3083    /// The `same_bucket` function is passed references to two elements from the vector and
3084    /// must determine if the elements compare equal. The elements are passed in opposite order
3085    /// from their order in the vector, so if `same_bucket(a, b)` returns `true`, `a` is removed.
3086    ///
3087    /// If the vector is sorted, this removes all duplicates.
3088    ///
3089    /// # Examples
3090    ///
3091    /// ```
3092    /// # use bump_scope::{Bump, bump_vec};
3093    /// # let bump: Bump = Bump::new();
3094    /// let mut vec = bump_vec![in &bump; "foo", "bar", "Bar", "baz", "bar"];
3095    ///
3096    /// vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
3097    ///
3098    /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
3099    /// ```
3100    pub fn dedup_by<F>(&mut self, same_bucket: F)
3101    where
3102        F: FnMut(&mut T, &mut T) -> bool,
3103    {
3104        unsafe { self.fixed.cook_mut() }.dedup_by(same_bucket);
3105    }
3106
3107    /// Returns the remaining spare capacity of the vector as a slice of
3108    /// `MaybeUninit<T>`.
3109    ///
3110    /// The returned slice can be used to fill the vector with data (e.g. by
3111    /// reading from a file) before marking the data as initialized using the
3112    /// [`set_len`] method.
3113    ///
3114    /// [`set_len`]: Self::set_len
3115    ///
3116    /// # Examples
3117    ///
3118    /// ```
3119    /// # use bump_scope::{Bump, BumpVec};
3120    /// # let bump: Bump = Bump::new();
3121    /// // Allocate vector big enough for 10 elements.
3122    /// let mut v = BumpVec::with_capacity_in(10, &bump);
3123    ///
3124    /// // Fill in the first 3 elements.
3125    /// let uninit = v.spare_capacity_mut();
3126    /// uninit[0].write(0);
3127    /// uninit[1].write(1);
3128    /// uninit[2].write(2);
3129    ///
3130    /// // Mark the first 3 elements of the vector as being initialized.
3131    /// unsafe {
3132    ///     v.set_len(3);
3133    /// }
3134    ///
3135    /// assert_eq!(&v, &[0, 1, 2]);
3136    /// ```
3137    #[inline]
3138    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
3139        // Note:
3140        // This method is not implemented in terms of `split_at_spare_mut`,
3141        // to prevent invalidation of pointers to the buffer.
3142        unsafe {
3143            slice::from_raw_parts_mut(
3144                self.as_mut_ptr().add(self.len()).cast::<MaybeUninit<T>>(),
3145                self.capacity() - self.len(),
3146            )
3147        }
3148    }
3149
3150    /// Returns vector content as a slice of `T`, along with the remaining spare
3151    /// capacity of the vector as a slice of `MaybeUninit<T>`.
3152    ///
3153    /// The returned spare capacity slice can be used to fill the vector with data
3154    /// (e.g. by reading from a file) before marking the data as initialized using
3155    /// the [`set_len`] method.
3156    ///
3157    /// [`set_len`]: Self::set_len
3158    ///
3159    /// Note that this is a low-level API, which should be used with care for
3160    /// optimization purposes. If you need to append data to a `BumpVec`
3161    /// you can use [`push`], [`extend`], `extend_from_slice`[`_copy`](BumpVec::extend_from_slice_copy)`/`[`_clone`](BumpVec::extend_from_within_clone),
3162    /// `extend_from_within`[`_copy`](BumpVec::extend_from_within_copy)`/`[`_clone`](BumpVec::extend_from_within_clone), [`insert`], [`resize`] or
3163    /// [`resize_with`], depending on your exact needs.
3164    ///
3165    /// [`push`]: Self::push
3166    /// [`extend`]: Self::extend
3167    /// [`insert`]: Self::insert
3168    /// [`append`]: Self::append
3169    /// [`resize`]: Self::resize
3170    /// [`resize_with`]: Self::resize_with
3171    #[inline]
3172    pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
3173        let ptr = self.as_mut_ptr();
3174
3175        // SAFETY:
3176        // - `ptr` is guaranteed to be valid for `self.len` elements
3177        // - but the allocation extends out to `self.buf.capacity()` elements, possibly
3178        // uninitialized
3179        let spare_ptr = unsafe { ptr.add(self.len()) };
3180        let spare_ptr = spare_ptr.cast::<MaybeUninit<T>>();
3181        let spare_len = self.capacity() - self.len();
3182
3183        // SAFETY:
3184        // - `ptr` is guaranteed to be valid for `self.len` elements
3185        // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized`
3186        unsafe {
3187            let initialized = slice::from_raw_parts_mut(ptr, self.len());
3188            let spare = slice::from_raw_parts_mut(spare_ptr, spare_len);
3189
3190            (initialized, spare)
3191        }
3192    }
3193
3194    /// Returns a reference to the allocator.
3195    #[must_use]
3196    #[inline(always)]
3197    pub fn allocator(&self) -> &A {
3198        &self.allocator
3199    }
3200
3201    /// Returns a type which provides statistics about the memory usage of the bump allocator.
3202    ///
3203    /// This is equivalent to calling `.allocator().stats()`.
3204    /// This merely exists for api parity with `Mut*` collections which can't have a `allocator` method.
3205    #[must_use]
3206    #[inline(always)]
3207    pub fn allocator_stats(&self) -> A::TypedStats<'_> {
3208        self.allocator.typed_stats()
3209    }
3210}
3211
3212impl<'a, T, A: BumpAllocatorTypedScope<'a>> BumpVec<T, A> {
3213    /// Turns this `BumpVec<T>` into a `FixedBumpVec<T>`.
3214    ///
3215    /// This retains the unused capacity unlike <code>[into_](Self::into_slice)([boxed_](Self::into_boxed_slice))[slice](Self::into_slice)</code>.
3216    #[must_use]
3217    #[inline(always)]
3218    pub fn into_fixed_vec(self) -> FixedBumpVec<'a, T> {
3219        self.into_parts().0
3220    }
3221
3222    /// Turns this `BumpVec<T>` into a `BumpBox<[T]>`.
3223    #[must_use]
3224    #[inline(always)]
3225    pub fn into_boxed_slice(mut self) -> BumpBox<'a, [T]> {
3226        self.shrink_to_fit();
3227        self.into_fixed_vec().into_boxed_slice()
3228    }
3229
3230    /// Turns this `BumpVec<T>` into a `&[T]` that is live for this bump scope.
3231    ///
3232    /// This is only available for [`NoDrop`] types so you don't omit dropping a value for which it matters.
3233    ///
3234    /// `!NoDrop` types can still be turned into slices via <code>BumpBox::[leak](BumpBox::leak)(vec.[into_boxed_slice](Self::into_boxed_slice)())</code>.
3235    #[must_use]
3236    #[inline(always)]
3237    pub fn into_slice(self) -> &'a mut [T]
3238    where
3239        [T]: NoDrop,
3240    {
3241        self.into_boxed_slice().into_mut()
3242    }
3243
3244    /// Creates a `BumpVec<T>` from its parts.
3245    ///
3246    /// The provided `bump` does not have to be the one the `fixed_vec` was allocated in.
3247    ///
3248    /// ```
3249    /// # use bump_scope::{Bump, FixedBumpVec, BumpVec};
3250    /// # let bump: Bump = Bump::new();
3251    /// let mut fixed_vec = FixedBumpVec::with_capacity_in(3, &bump);
3252    /// fixed_vec.push(1);
3253    /// fixed_vec.push(2);
3254    /// fixed_vec.push(3);
3255    /// let mut vec = BumpVec::from_parts(fixed_vec, &bump);
3256    /// vec.push(4);
3257    /// vec.push(5);
3258    /// assert_eq!(vec, [1, 2, 3, 4, 5]);
3259    /// ```
3260    #[must_use]
3261    #[inline(always)]
3262    pub fn from_parts(vec: FixedBumpVec<'a, T>, allocator: A) -> Self {
3263        Self {
3264            fixed: unsafe { RawFixedBumpVec::from_cooked(vec) },
3265            allocator,
3266        }
3267    }
3268
3269    /// Turns this `BumpVec<T>` into its parts.
3270    /// ```
3271    /// # use bump_scope::{Bump, BumpVec};
3272    /// # let bump: Bump = Bump::new();
3273    /// let mut vec = BumpVec::new_in(&bump);
3274    /// vec.reserve(10);
3275    /// vec.push(1);
3276    /// let fixed_vec = vec.into_parts().0;
3277    /// assert_eq!(fixed_vec.capacity(), 10);
3278    /// assert_eq!(fixed_vec, [1]);
3279    /// ```
3280    #[must_use]
3281    #[inline(always)]
3282    pub fn into_parts(self) -> (FixedBumpVec<'a, T>, A) {
3283        destructure!(let Self { fixed, allocator } = self);
3284        (unsafe { fixed.cook() }, allocator)
3285    }
3286}
3287
3288impl<T, const N: usize, A: BumpAllocatorTyped> BumpVec<[T; N], A> {
3289    /// Takes a `BumpVec<[T; N]>` and flattens it into a `BumpVec<T>`.
3290    ///
3291    /// # Panics
3292    ///
3293    /// Panics if the length of the resulting vector would overflow a `usize`.
3294    ///
3295    /// This is only possible when flattening a vector of arrays of zero-sized
3296    /// types, and thus tends to be irrelevant in practice. If
3297    /// `size_of::<T>() > 0`, this will never panic.
3298    ///
3299    /// # Examples
3300    ///
3301    /// ```
3302    /// # use bump_scope::{Bump, bump_vec};
3303    /// # let bump: Bump = Bump::new();
3304    /// #
3305    /// let mut vec = bump_vec![in &bump; [1, 2, 3], [4, 5, 6], [7, 8, 9]];
3306    /// assert_eq!(vec.pop(), Some([7, 8, 9]));
3307    ///
3308    /// let mut flattened = vec.into_flattened();
3309    /// assert_eq!(flattened.pop(), Some(6));
3310    /// ```
3311    #[must_use]
3312    pub fn into_flattened(self) -> BumpVec<T, A> {
3313        destructure!(let Self { fixed, allocator } = self);
3314        let fixed = unsafe { RawFixedBumpVec::from_cooked(fixed.cook().into_flattened()) };
3315        BumpVec { fixed, allocator }
3316    }
3317}
3318
3319impl<T: Debug, A: BumpAllocatorTyped> Debug for BumpVec<T, A> {
3320    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
3321        Debug::fmt(self.as_slice(), f)
3322    }
3323}
3324
3325impl<T, A: BumpAllocatorTyped, I: SliceIndex<[T]>> Index<I> for BumpVec<T, A> {
3326    type Output = I::Output;
3327
3328    #[inline(always)]
3329    fn index(&self, index: I) -> &Self::Output {
3330        Index::index(self.as_slice(), index)
3331    }
3332}
3333
3334impl<T, A: BumpAllocatorTyped, I: SliceIndex<[T]>> IndexMut<I> for BumpVec<T, A> {
3335    #[inline(always)]
3336    fn index_mut(&mut self, index: I) -> &mut Self::Output {
3337        IndexMut::index_mut(self.as_mut_slice(), index)
3338    }
3339}
3340
3341#[cfg(feature = "panic-on-alloc")]
3342impl<T, A: BumpAllocatorTyped> Extend<T> for BumpVec<T, A> {
3343    #[inline]
3344    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
3345        let iter = iter.into_iter();
3346
3347        self.reserve(iter.size_hint().0);
3348
3349        for value in iter {
3350            self.push(value);
3351        }
3352    }
3353}
3354
3355#[cfg(feature = "panic-on-alloc")]
3356impl<'t, T: Clone + 't, A: BumpAllocatorTyped> Extend<&'t T> for BumpVec<T, A> {
3357    #[inline]
3358    fn extend<I: IntoIterator<Item = &'t T>>(&mut self, iter: I) {
3359        let iter = iter.into_iter();
3360
3361        self.reserve(iter.size_hint().0);
3362
3363        for value in iter {
3364            self.push(value.clone());
3365        }
3366    }
3367}
3368
3369impl<T, A: BumpAllocatorTyped> IntoIterator for BumpVec<T, A> {
3370    type Item = T;
3371    type IntoIter = IntoIter<T, A>;
3372
3373    #[inline]
3374    fn into_iter(self) -> Self::IntoIter {
3375        unsafe {
3376            destructure!(let Self { fixed, allocator } = self);
3377
3378            let (slice, cap) = fixed.into_raw_parts();
3379            let begin = slice.cast::<T>();
3380
3381            let end = if T::IS_ZST {
3382                non_null::wrapping_byte_add(begin, slice.len())
3383            } else {
3384                begin.add(slice.len())
3385            };
3386
3387            IntoIter {
3388                buf: begin,
3389                cap,
3390
3391                ptr: begin,
3392                end,
3393
3394                allocator,
3395                marker: PhantomData,
3396            }
3397        }
3398    }
3399}
3400
3401impl<'c, T, A: BumpAllocatorTyped> IntoIterator for &'c BumpVec<T, A> {
3402    type Item = &'c T;
3403    type IntoIter = slice::Iter<'c, T>;
3404
3405    #[inline(always)]
3406    fn into_iter(self) -> Self::IntoIter {
3407        self.as_slice().iter()
3408    }
3409}
3410
3411impl<'c, T, A: BumpAllocatorTyped> IntoIterator for &'c mut BumpVec<T, A> {
3412    type Item = &'c mut T;
3413    type IntoIter = slice::IterMut<'c, T>;
3414
3415    #[inline(always)]
3416    fn into_iter(self) -> Self::IntoIter {
3417        self.as_mut_slice().iter_mut()
3418    }
3419}
3420
3421impl<T, A: BumpAllocatorTyped> AsRef<[T]> for BumpVec<T, A> {
3422    #[inline(always)]
3423    fn as_ref(&self) -> &[T] {
3424        self
3425    }
3426}
3427
3428impl<T, A: BumpAllocatorTyped> AsMut<[T]> for BumpVec<T, A> {
3429    #[inline(always)]
3430    fn as_mut(&mut self) -> &mut [T] {
3431        self
3432    }
3433}
3434
3435impl<T, A: BumpAllocatorTyped> Borrow<[T]> for BumpVec<T, A> {
3436    #[inline(always)]
3437    fn borrow(&self) -> &[T] {
3438        self
3439    }
3440}
3441
3442impl<T, A: BumpAllocatorTyped> BorrowMut<[T]> for BumpVec<T, A> {
3443    #[inline(always)]
3444    fn borrow_mut(&mut self) -> &mut [T] {
3445        self
3446    }
3447}
3448
3449impl<T: Hash, A: BumpAllocatorTyped> Hash for BumpVec<T, A> {
3450    #[inline(always)]
3451    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
3452        self.as_slice().hash(state);
3453    }
3454}
3455
3456/// Returns [`ErrorKind::OutOfMemory`](std::io::ErrorKind::OutOfMemory) when allocations fail.
3457#[cfg(feature = "std")]
3458impl<A: BumpAllocatorTyped> std::io::Write for BumpVec<u8, A> {
3459    #[inline(always)]
3460    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
3461        if self.try_extend_from_slice_copy(buf).is_err() {
3462            return Err(std::io::ErrorKind::OutOfMemory.into());
3463        }
3464
3465        Ok(buf.len())
3466    }
3467
3468    #[inline(always)]
3469    fn flush(&mut self) -> std::io::Result<()> {
3470        Ok(())
3471    }
3472
3473    #[inline]
3474    fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result<usize> {
3475        let len = bufs.iter().map(|b| b.len()).sum();
3476        self.try_reserve(len).map_err(|_| std::io::ErrorKind::OutOfMemory)?;
3477        for buf in bufs {
3478            self.try_extend_from_slice_copy(buf)
3479                .map_err(|_| std::io::ErrorKind::OutOfMemory)?;
3480        }
3481        Ok(len)
3482    }
3483
3484    #[inline(always)]
3485    fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> {
3486        if self.try_extend_from_slice_copy(buf).is_err() {
3487            return Err(std::io::ErrorKind::OutOfMemory.into());
3488        }
3489
3490        Ok(())
3491    }
3492}
3493
3494#[cfg(feature = "panic-on-alloc")]
3495impl<T, A: BumpAllocatorTyped + Default> FromIterator<T> for BumpVec<T, A> {
3496    #[inline]
3497    #[track_caller]
3498    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
3499        Self::from_iter_in(iter, A::default())
3500    }
3501}