Skip to main content

smallvec/
lib.rs

1// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4// option. This file may not be copied, modified, or distributed
5// except according to those terms.
6
7//! Small vectors in various sizes. These store a certain number of elements
8//! inline, and fall back to the heap for larger allocations.  This can be a
9//! useful optimization for improving cache locality and reducing allocator
10//! traffic for workloads that fit within the inline buffer.
11//!
12//! ## `no_std` support
13//!
14//! By default, `smallvec` does not depend on `std`.  However, the optional
15//! `write` feature implements the `std::io::Write` trait for vectors of `u8`.
16//! When this feature is enabled, `smallvec` depends on `std`.
17//!
18//! ## Optional features
19//!
20//! ### `serde`
21//!
22//! When this optional dependency is enabled, `SmallVec` implements the
23//! `serde::Serialize` and `serde::Deserialize` traits.
24//!
25//! ### `write`
26//!
27//! When this feature is enabled, `SmallVec<[u8; _]>` implements the
28//! `std::io::Write` trait. This feature is not compatible with `#![no_std]`
29//! programs.
30//!
31//! ### `union`
32//!
33//! **This feature requires Rust 1.49.**
34//!
35//! When the `union` feature is enabled `smallvec` will track its state (inline
36//! or spilled) without the use of an enum tag, reducing the size of the
37//! `smallvec` by one machine word. This means that there is potentially no
38//! space overhead compared to `Vec`. Note that `smallvec` can still be larger
39//! than `Vec` if the inline buffer is larger than two machine words.
40//!
41//! To use this feature add `features = ["union"]` in the `smallvec` section of
42//! Cargo.toml. Note that this feature requires Rust 1.49.
43//!
44//! Tracking issue: [rust-lang/rust#55149](https://github.com/rust-lang/rust/issues/55149)
45//!
46//! ### `const_generics`
47//!
48//! **This feature requires Rust 1.51.**
49//!
50//! When this feature is enabled, `SmallVec` works with any arrays of any size,
51//! not just a fixed list of sizes.
52//!
53//! ### `const_new`
54//!
55//! **This feature requires Rust 1.51.**
56//!
57//! This feature exposes the functions [`SmallVec::new_const`],
58//! [`SmallVec::from_const`], and [`smallvec_inline`] which enables the
59//! `SmallVec` to be initialized from a const context. For details, see the
60//! [Rust Reference](https://doc.rust-lang.org/reference/const_eval.html#const-functions).
61//!
62//! ### `drain_filter`
63//!
64//! **This feature is unstable.** It may change to match the unstable
65//! `drain_filter` method in libstd.
66//!
67//! Enables the `drain_filter` method, which produces an iterator that calls a
68//! user-provided closure to determine which elements of the vector to remove
69//! and yield from the iterator.
70//!
71//! ### `drain_keep_rest`
72//!
73//! **This feature is unstable.** It may change to match the unstable
74//! `drain_keep_rest` method in libstd.
75//!
76//! Enables the `DrainFilter::keep_rest` method.
77//!
78//! ### `specialization`
79//!
80//! **This feature is unstable and requires a nightly build of the Rust
81//! toolchain.**
82//!
83//! When this feature is enabled, `SmallVec::from(slice)` has improved
84//! performance for slices of `Copy` types.  (Without this feature, you can use
85//! `SmallVec::from_slice` to get optimal performance for `Copy` types.)
86//!
87//! Tracking issue: [rust-lang/rust#31844](https://github.com/rust-lang/rust/issues/31844)
88//!
89//! ### `may_dangle`
90//!
91//! **This feature is unstable and requires a nightly build of the Rust
92//! toolchain.**
93//!
94//! This feature makes the Rust compiler less strict about use of vectors that
95//! contain borrowed references. For details, see the
96//! [Rustonomicon](https://doc.rust-lang.org/1.42.0/nomicon/dropck.html#an-escape-hatch).
97//!
98//! Tracking issue: [rust-lang/rust#34761](https://github.com/rust-lang/rust/issues/34761)
99
100#![no_std]
101#![cfg_attr(docsrs, feature(doc_cfg))]
102#![cfg_attr(feature = "specialization", allow(incomplete_features))]
103#![cfg_attr(feature = "specialization", feature(specialization))]
104#![cfg_attr(feature = "may_dangle", feature(dropck_eyepatch))]
105#![deny(missing_docs)]
106
107#[doc(hidden)]
108pub extern crate alloc;
109
110#[cfg(any(test, feature = "write"))]
111extern crate std;
112
113#[cfg(test)]
114mod tests;
115
116#[cfg(feature = "drain_keep_rest")]
117use core::mem::ManuallyDrop;
118#[cfg(feature = "malloc_size_of")]
119use malloc_size_of::{MallocShallowSizeOf, MallocSizeOf, MallocSizeOfOps};
120#[cfg(feature = "serde")]
121use serde::{
122    de::{Deserialize, Deserializer, SeqAccess, Visitor},
123    ser::{Serialize, SerializeSeq, Serializer},
124};
125#[cfg(feature = "write")]
126use std::io;
127#[allow(deprecated)]
128use {
129    alloc::{
130        alloc::{Layout, LayoutErr},
131        boxed::Box,
132        vec,
133        vec::Vec,
134    },
135    core::{
136        borrow::{Borrow, BorrowMut},
137        cmp, fmt,
138        hash::{Hash, Hasher},
139        hint::unreachable_unchecked,
140        iter::{repeat, FromIterator, FusedIterator, IntoIterator},
141        marker::PhantomData,
142        mem::{self, MaybeUninit},
143        ops::{self, Range, RangeBounds},
144        ptr::{self, NonNull},
145        slice::{self, SliceIndex},
146    },
147};
148
149/// Creates a [`SmallVec`] containing the arguments.
150///
151/// `smallvec!` allows `SmallVec`s to be defined with the same syntax as array
152/// expressions. There are two forms of this macro:
153///
154/// - Create a [`SmallVec`] containing a given list of elements:
155///
156/// ```
157/// # use smallvec::{smallvec, SmallVec};
158/// # fn main() {
159/// let v: SmallVec<[_; 128]> = smallvec![1, 2, 3];
160/// assert_eq!(v[0], 1);
161/// assert_eq!(v[1], 2);
162/// assert_eq!(v[2], 3);
163/// # }
164/// ```
165///
166/// - Create a [`SmallVec`] from a given element and size:
167///
168/// ```
169/// # use smallvec::{smallvec, SmallVec};
170/// # fn main() {
171/// let v: SmallVec<[_; 10]> = smallvec![1; 3];
172/// assert_eq!(v, SmallVec::from_buf([1, 1, 1]));
173/// # }
174/// ```
175///
176/// Note that unlike array expressions this syntax supports all elements
177/// which implement [`Clone`] and the number of elements doesn't have to be
178/// a constant.
179///
180/// This will use `clone` to duplicate an expression, so one should be careful
181/// using this with types having a nonstandard `Clone` implementation. For
182/// example, `smallvec![Rc::new(1); 5]` will create a vector of five references
183/// to the same boxed integer value, not five references pointing to
184/// independently boxed integers.
185#[macro_export]
186macro_rules! smallvec {
187    // count helper: transform any expression into 1
188    (@one $x:expr) => (1usize);
189    () => (
190        $crate::SmallVec::new()
191    );
192    ($elem:expr; $n:expr) => ({
193        $crate::SmallVec::from_elem($elem, $n)
194    });
195    ($($x:expr),+$(,)?) => ({
196        let count = 0usize $(+ $crate::smallvec!(@one $x))+;
197        let mut vec = $crate::SmallVec::new();
198        if count <= vec.inline_size() {
199            $(vec.push($x);)*
200            vec
201        } else {
202            $crate::SmallVec::from_vec($crate::alloc::vec![$($x,)+])
203        }
204    });
205}
206
207/// Creates an inline [`SmallVec`] containing the arguments. This macro is
208/// enabled by the feature `const_new`.
209///
210/// `smallvec_inline!` allows `SmallVec`s to be defined with the same syntax as
211/// array expressions in `const` contexts. The inline storage `A` will always be
212/// an array of the size specified by the arguments. There are two forms of this
213/// macro:
214///
215/// - Create a [`SmallVec`] containing a given list of elements:
216///
217/// ```
218/// # use smallvec::{smallvec_inline, SmallVec};
219/// # fn main() {
220/// const V: SmallVec<[i32; 3]> = smallvec_inline![1, 2, 3];
221/// assert_eq!(V[0], 1);
222/// assert_eq!(V[1], 2);
223/// assert_eq!(V[2], 3);
224/// # }
225/// ```
226///
227/// - Create a [`SmallVec`] from a given element and size:
228///
229/// ```
230/// # use smallvec::{smallvec_inline, SmallVec};
231/// # fn main() {
232/// const V: SmallVec<[i32; 3]> = smallvec_inline![1; 3];
233/// assert_eq!(V, SmallVec::from_buf([1, 1, 1]));
234/// # }
235/// ```
236///
237/// Note that the behavior mimics that of array expressions, in contrast to
238/// [`smallvec`].
239#[cfg(feature = "const_new")]
240#[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
241#[macro_export]
242macro_rules! smallvec_inline {
243    // count helper: transform any expression into 1
244    (@one $x:expr) => (1usize);
245    ($elem:expr; $n:expr) => ({
246        $crate::SmallVec::<[_; $n]>::from_const([$elem; $n])
247    });
248    ($($x:expr),+ $(,)?) => ({
249        const N: usize = 0usize $(+ $crate::smallvec_inline!(@one $x))*;
250        $crate::SmallVec::<[_; N]>::from_const([$($x,)*])
251    });
252}
253
254/// `panic!()` in debug builds, optimization hint in release.
255#[cfg(not(feature = "union"))]
256macro_rules! debug_unreachable {
257    () => {
258        debug_unreachable!("entered unreachable code")
259    };
260    ($e:expr) => {
261        if cfg!(debug_assertions) {
262            panic!($e);
263        } else {
264            unreachable_unchecked();
265        }
266    };
267}
268
269/// Trait to be implemented by a collection that can be extended from a slice
270///
271/// ## Example
272///
273/// ```rust
274/// use smallvec::{ExtendFromSlice, SmallVec};
275///
276/// fn initialize<V: ExtendFromSlice<u8>>(v: &mut V) {
277///     v.extend_from_slice(b"Test!");
278/// }
279///
280/// let mut vec = Vec::new();
281/// initialize(&mut vec);
282/// assert_eq!(&vec, b"Test!");
283///
284/// let mut small_vec = SmallVec::<[u8; 8]>::new();
285/// initialize(&mut small_vec);
286/// assert_eq!(&small_vec as &[_], b"Test!");
287/// ```
288#[doc(hidden)]
289#[deprecated]
290pub trait ExtendFromSlice<T> {
291    /// Extends a collection from a slice of its element type
292    fn extend_from_slice(&mut self, other: &[T]);
293}
294
295#[allow(deprecated)]
296impl<T: Clone> ExtendFromSlice<T> for Vec<T> {
297    fn extend_from_slice(&mut self, other: &[T]) {
298        Vec::extend_from_slice(self, other)
299    }
300}
301
302/// Error type for APIs with fallible heap allocation
303#[derive(Debug)]
304pub enum CollectionAllocErr {
305    /// Overflow `usize::MAX` or other error during size computation
306    CapacityOverflow,
307    /// The allocator return an error
308    AllocErr {
309        /// The layout that was passed to the allocator
310        layout: Layout,
311    },
312}
313
314impl fmt::Display for CollectionAllocErr {
315    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
316        write!(f, "Allocation error: {:?}", self)
317    }
318}
319
320#[allow(deprecated)]
321impl From<LayoutErr> for CollectionAllocErr {
322    fn from(_: LayoutErr) -> Self {
323        CollectionAllocErr::CapacityOverflow
324    }
325}
326
327fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
328    match result {
329        Ok(x) => x,
330        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
331        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
332    }
333}
334
335/// FIXME: use `Layout::array` when we require a Rust version where it’s stable
336/// <https://github.com/rust-lang/rust/issues/55724>
337fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
338    let size = mem::size_of::<T>()
339        .checked_mul(n)
340        .ok_or(CollectionAllocErr::CapacityOverflow)?;
341    let align = mem::align_of::<T>();
342    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
343}
344
345unsafe fn deallocate<T>(ptr: NonNull<T>, capacity: usize) {
346    // This unwrap should succeed since the same did when allocating.
347    let layout = layout_array::<T>(capacity).unwrap();
348    alloc::alloc::dealloc(ptr.as_ptr() as *mut u8, layout)
349}
350
351/// An iterator that removes the items from a `SmallVec` and yields them by
352/// value.
353///
354/// Returned from [`SmallVec::drain`][1].
355///
356/// [1]: struct.SmallVec.html#method.drain
357pub struct Drain<'a, T: 'a + Array> {
358    tail_start: usize,
359    tail_len: usize,
360    iter: slice::Iter<'a, T::Item>,
361    vec: NonNull<SmallVec<T>>,
362}
363
364impl<'a, T: 'a + Array> fmt::Debug for Drain<'a, T>
365where
366    T::Item: fmt::Debug,
367{
368    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
369        f.debug_tuple("Drain").field(&self.iter.as_slice()).finish()
370    }
371}
372
373unsafe impl<'a, T: Sync + Array> Sync for Drain<'a, T> {}
374unsafe impl<'a, T: Send + Array> Send for Drain<'a, T> {}
375
376impl<'a, T: 'a + Array> Iterator for Drain<'a, T> {
377    type Item = T::Item;
378
379    #[inline]
380    fn next(&mut self) -> Option<T::Item> {
381        self.iter
382            .next()
383            .map(|reference| unsafe { ptr::read(reference) })
384    }
385
386    #[inline]
387    fn size_hint(&self) -> (usize, Option<usize>) {
388        self.iter.size_hint()
389    }
390}
391
392impl<'a, T: 'a + Array> DoubleEndedIterator for Drain<'a, T> {
393    #[inline]
394    fn next_back(&mut self) -> Option<T::Item> {
395        self.iter
396            .next_back()
397            .map(|reference| unsafe { ptr::read(reference) })
398    }
399}
400
401impl<'a, T: Array> ExactSizeIterator for Drain<'a, T> {
402    #[inline]
403    fn len(&self) -> usize {
404        self.iter.len()
405    }
406}
407
408impl<'a, T: Array> FusedIterator for Drain<'a, T> {}
409
410impl<'a, T: 'a + Array> Drop for Drain<'a, T> {
411    fn drop(&mut self) {
412        self.for_each(drop);
413
414        if self.tail_len > 0 {
415            unsafe {
416                let source_vec = self.vec.as_mut();
417
418                // memmove back untouched tail, update to new length
419                let start = source_vec.len();
420                let tail = self.tail_start;
421                if tail != start {
422                    // as_mut_ptr creates a &mut, invalidating other pointers.
423                    // This pattern avoids calling it with a pointer already
424                    // present.
425                    let ptr = source_vec.as_mut_ptr();
426                    let src = ptr.add(tail);
427                    let dst = ptr.add(start);
428                    ptr::copy(src, dst, self.tail_len);
429                }
430                source_vec.set_len(start + self.tail_len);
431            }
432        }
433    }
434}
435
436#[cfg(feature = "drain_filter")]
437/// An iterator which uses a closure to determine if an element should be
438/// removed.
439///
440/// Returned from [`SmallVec::drain_filter`][1].
441///
442/// [1]: struct.SmallVec.html#method.drain_filter
443pub struct DrainFilter<'a, T, F>
444where
445    F: FnMut(&mut T::Item) -> bool,
446    T: Array,
447{
448    vec: &'a mut SmallVec<T>,
449    /// The index of the item that will be inspected by the next call to `next`.
450    idx: usize,
451    /// The number of items that have been drained (removed) thus far.
452    del: usize,
453    /// The original length of `vec` prior to draining.
454    old_len: usize,
455    /// The filter test predicate.
456    pred: F,
457    /// A flag that indicates a panic has occurred in the filter test predicate.
458    /// This is used as a hint in the drop implementation to prevent consumption
459    /// of the remainder of the `DrainFilter`. Any unprocessed items will be
460    /// backshifted in the `vec`, but no further items will be dropped or
461    /// tested by the filter predicate.
462    panic_flag: bool,
463}
464
465#[cfg(feature = "drain_filter")]
466impl<T, F> fmt::Debug for DrainFilter<'_, T, F>
467where
468    F: FnMut(&mut T::Item) -> bool,
469    T: Array,
470    T::Item: fmt::Debug,
471{
472    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
473        f.debug_tuple("DrainFilter")
474            .field(&self.vec.as_slice())
475            .finish()
476    }
477}
478
479#[cfg(feature = "drain_filter")]
480impl<T, F> Iterator for DrainFilter<'_, T, F>
481where
482    F: FnMut(&mut T::Item) -> bool,
483    T: Array,
484{
485    type Item = T::Item;
486
487    fn next(&mut self) -> Option<T::Item> {
488        unsafe {
489            while self.idx < self.old_len {
490                let i = self.idx;
491                let v = slice::from_raw_parts_mut(self.vec.as_mut_ptr(), self.old_len);
492                self.panic_flag = true;
493                let drained = (self.pred)(&mut v[i]);
494                self.panic_flag = false;
495                // Update the index *after* the predicate is called. If the
496                // index is updated prior and the predicate
497                // panics, the element at this index would be
498                // leaked.
499                self.idx += 1;
500                if drained {
501                    self.del += 1;
502                    return Some(ptr::read(&v[i]));
503                } else if self.del > 0 {
504                    let del = self.del;
505                    let src: *const Self::Item = &v[i];
506                    let dst: *mut Self::Item = &mut v[i - del];
507                    ptr::copy_nonoverlapping(src, dst, 1);
508                }
509            }
510            None
511        }
512    }
513
514    fn size_hint(&self) -> (usize, Option<usize>) {
515        (0, Some(self.old_len - self.idx))
516    }
517}
518
519#[cfg(feature = "drain_filter")]
520impl<T, F> Drop for DrainFilter<'_, T, F>
521where
522    F: FnMut(&mut T::Item) -> bool,
523    T: Array,
524{
525    fn drop(&mut self) {
526        struct BackshiftOnDrop<'a, 'b, T, F>
527        where
528            F: FnMut(&mut T::Item) -> bool,
529            T: Array,
530        {
531            drain: &'b mut DrainFilter<'a, T, F>,
532        }
533
534        impl<'a, 'b, T, F> Drop for BackshiftOnDrop<'a, 'b, T, F>
535        where
536            F: FnMut(&mut T::Item) -> bool,
537            T: Array,
538        {
539            fn drop(&mut self) {
540                unsafe {
541                    if self.drain.idx < self.drain.old_len && self.drain.del > 0 {
542                        // This is a pretty messed up state, and there isn't
543                        // really an obviously right
544                        // thing to do. We don't want to keep trying
545                        // to execute `pred`, so we just backshift all the
546                        // unprocessed elements and tell
547                        // the vec that they still exist. The backshift
548                        // is required to prevent a double-drop of the last
549                        // successfully drained item
550                        // prior to a panic in the predicate.
551                        let ptr = self.drain.vec.as_mut_ptr();
552                        let src = ptr.add(self.drain.idx);
553                        let dst = src.sub(self.drain.del);
554                        let tail_len = self.drain.old_len - self.drain.idx;
555                        src.copy_to(dst, tail_len);
556                    }
557                    self.drain.vec.set_len(self.drain.old_len - self.drain.del);
558                }
559            }
560        }
561
562        let backshift = BackshiftOnDrop { drain: self };
563
564        // Attempt to consume any remaining elements if the filter predicate
565        // has not yet panicked. We'll backshift any remaining elements
566        // whether we've already panicked or if the consumption here panics.
567        if !backshift.drain.panic_flag {
568            backshift.drain.for_each(drop);
569        }
570    }
571}
572
573#[cfg(feature = "drain_keep_rest")]
574impl<T, F> DrainFilter<'_, T, F>
575where
576    F: FnMut(&mut T::Item) -> bool,
577    T: Array,
578{
579    /// Keep unyielded elements in the source `Vec`.
580    ///
581    /// # Examples
582    ///
583    /// ```
584    /// # use smallvec::{smallvec, SmallVec};
585    ///
586    /// let mut vec: SmallVec<[char; 2]> = smallvec!['a', 'b', 'c'];
587    /// let mut drain = vec.drain_filter(|_| true);
588    ///
589    /// assert_eq!(drain.next().unwrap(), 'a');
590    ///
591    /// // This call keeps 'b' and 'c' in the vec.
592    /// drain.keep_rest();
593    ///
594    /// // If we wouldn't call `keep_rest()`,
595    /// // `vec` would be empty.
596    /// assert_eq!(vec, SmallVec::<[char; 2]>::from_slice(&['b', 'c']));
597    /// ```
598    pub fn keep_rest(self) {
599        // At this moment layout looks like this:
600        //
601        //  _____________________/-- old_len
602        // /                     \
603        // [kept] [yielded] [tail]
604        //        \_______/ ^-- idx
605        //                \-- del
606        //
607        // Normally `Drop` impl would drop [tail] (via .for_each(drop), ie still
608        // calling `pred`)
609        //
610        // 1. Move [tail] after [kept]
611        // 2. Update length of the original vec to `old_len - del` a. In case of
612        //    ZST, this is the only thing we want to do
613        // 3. Do *not* drop self, as everything is put in a consistent state
614        //    already, there is nothing to do
615        let mut this = ManuallyDrop::new(self);
616
617        unsafe {
618            // ZSTs have no identity, so we don't need to move them around.
619            let needs_move = mem::size_of::<T::Item>() != 0;
620
621            if needs_move && this.idx < this.old_len && this.del > 0 {
622                let ptr = this.vec.as_mut_ptr();
623                let src = ptr.add(this.idx);
624                let dst = src.sub(this.del);
625                let tail_len = this.old_len - this.idx;
626                src.copy_to(dst, tail_len);
627            }
628
629            let new_len = this.old_len - this.del;
630            this.vec.set_len(new_len);
631        }
632    }
633}
634
635#[cfg(feature = "union")]
636union SmallVecData<A: Array> {
637    inline: core::mem::ManuallyDrop<MaybeUninit<A>>,
638    heap: (NonNull<A::Item>, usize),
639}
640
641#[cfg(all(feature = "union", feature = "const_new"))]
642impl<T, const N: usize> SmallVecData<[T; N]> {
643    #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
644    #[inline]
645    const fn from_const(inline: MaybeUninit<[T; N]>) -> Self {
646        SmallVecData {
647            inline: core::mem::ManuallyDrop::new(inline),
648        }
649    }
650}
651
652#[cfg(feature = "union")]
653impl<A: Array> SmallVecData<A> {
654    #[inline]
655    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
656        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
657    }
658    #[inline]
659    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
660        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
661    }
662    #[inline]
663    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
664        SmallVecData {
665            inline: core::mem::ManuallyDrop::new(inline),
666        }
667    }
668    // Workaround for https://github.com/rust-lang/rust/issues/157743: when from_inline is
669    // called with MaybeUninit::uninit(), rustc 1.93+ GVN propagates const
670    // <uninit> into the ManuallyDrop::new() aggregate, causing LLVM to
671    // materialize a global constant that MemCpyOpt then collapses into a
672    // memset over the whole struct. Using assume_init() of a doubly-wrapped
673    // MaybeUninit produces Immediate::Uninit instead of const <uninit>,
674    // which codegen handles as undef without emitting any global. This
675    // function also avoids introducing an intermediate local that would
676    // inflate stack frames in debug builds.
677    #[inline]
678    fn empty() -> SmallVecData<A> {
679        // SAFETY: ManuallyDrop<MaybeUninit<A>> is valid for any bit pattern
680        // including uninitialized bytes, so assume_init() on a
681        // MaybeUninit of that type is sound.
682        SmallVecData {
683            inline: unsafe { MaybeUninit::uninit().assume_init() },
684        }
685    }
686    #[inline]
687    unsafe fn into_inline(self) -> MaybeUninit<A> {
688        core::mem::ManuallyDrop::into_inner(self.inline)
689    }
690    #[inline]
691    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
692        (ConstNonNull(self.heap.0), self.heap.1)
693    }
694    #[inline]
695    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
696        let h = &mut self.heap;
697        (h.0, &mut h.1)
698    }
699    #[inline]
700    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
701        SmallVecData { heap: (ptr, len) }
702    }
703}
704
705#[cfg(not(feature = "union"))]
706enum SmallVecData<A: Array> {
707    Inline(MaybeUninit<A>),
708    // Using NonNull and NonZero here allows to reduce size of `SmallVec`.
709    Heap {
710        // Since we never allocate on heap
711        // unless our capacity is bigger than inline capacity
712        // heap capacity cannot be less than 1.
713        // Therefore, pointer cannot be null too.
714        ptr: NonNull<A::Item>,
715        len: usize,
716    },
717}
718
719#[cfg(all(not(feature = "union"), feature = "const_new"))]
720impl<T, const N: usize> SmallVecData<[T; N]> {
721    #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
722    #[inline]
723    const fn from_const(inline: MaybeUninit<[T; N]>) -> Self {
724        SmallVecData::Inline(inline)
725    }
726}
727
728#[cfg(not(feature = "union"))]
729impl<A: Array> SmallVecData<A> {
730    #[inline]
731    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
732        match self {
733            SmallVecData::Inline(a) => ConstNonNull::new(a.as_ptr() as *const A::Item).unwrap(),
734            _ => debug_unreachable!(),
735        }
736    }
737    #[inline]
738    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
739        match self {
740            SmallVecData::Inline(a) => NonNull::new(a.as_mut_ptr() as *mut A::Item).unwrap(),
741            _ => debug_unreachable!(),
742        }
743    }
744    #[inline]
745    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
746        SmallVecData::Inline(inline)
747    }
748    // See the comment on the union variant's empty() for why this exists.
749    #[inline]
750    fn empty() -> SmallVecData<A> {
751        // SAFETY: MaybeUninit<A> is valid for any bit pattern including
752        // uninitialized bytes, so assume_init() on a MaybeUninit of
753        // that type is sound.
754        SmallVecData::Inline(unsafe { MaybeUninit::uninit().assume_init() })
755    }
756    #[inline]
757    unsafe fn into_inline(self) -> MaybeUninit<A> {
758        match self {
759            SmallVecData::Inline(a) => a,
760            _ => debug_unreachable!(),
761        }
762    }
763    #[inline]
764    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
765        match self {
766            SmallVecData::Heap { ptr, len } => (ConstNonNull(*ptr), *len),
767            _ => debug_unreachable!(),
768        }
769    }
770    #[inline]
771    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
772        match self {
773            SmallVecData::Heap { ptr, len } => (*ptr, len),
774            _ => debug_unreachable!(),
775        }
776    }
777    #[inline]
778    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
779        SmallVecData::Heap { ptr, len }
780    }
781}
782
783unsafe impl<A: Array + Send> Send for SmallVecData<A> {}
784unsafe impl<A: Array + Sync> Sync for SmallVecData<A> {}
785
786/// A `Vec`-like container that can store a small number of elements inline.
787///
788/// `SmallVec` acts like a vector, but can store a limited amount of data inline
789/// within the `SmallVec` struct rather than in a separate allocation.  If the
790/// data exceeds this limit, the `SmallVec` will "spill" its data onto the heap,
791/// allocating a new buffer to hold it.
792///
793/// The amount of data that a `SmallVec` can store inline depends on its backing
794/// store. The backing store can be any type that implements the `Array` trait;
795/// usually it is a small fixed-sized array.  For example a `SmallVec<[u64; 8]>`
796/// can hold up to eight 64-bit integers inline.
797///
798/// ## Example
799///
800/// ```rust
801/// use smallvec::SmallVec;
802/// let mut v = SmallVec::<[u8; 4]>::new(); // initialize an empty vector
803///
804/// // The vector can hold up to 4 items without spilling onto the heap.
805/// v.extend(0..4);
806/// assert_eq!(v.len(), 4);
807/// assert!(!v.spilled());
808///
809/// // Pushing another element will force the buffer to spill:
810/// v.push(4);
811/// assert_eq!(v.len(), 5);
812/// assert!(v.spilled());
813/// ```
814///
815/// References used by an element's destructor must outlive the vector, even
816/// with the `may_dangle` feature and no inline storage:
817///
818/// ```compile_fail,E0597
819/// use smallvec::SmallVec;
820///
821/// struct PrintOnDrop<'a>(&'a str);
822/// impl Drop for PrintOnDrop<'_> {
823///     fn drop(&mut self) {
824///         println!("{}", self.0);
825///     }
826/// }
827///
828/// let mut v = SmallVec::<[PrintOnDrop<'_>; 0]>::new();
829/// let text = String::from("borrowed");
830/// v.push(PrintOnDrop(&text));
831/// // `text` is dropped before `v`, whose elements still need it.
832/// ```
833pub struct SmallVec<A: Array> {
834    // The capacity field is used to determine which of the storage variants is active:
835    // If capacity <= Self::inline_capacity() then the inline variant is used and capacity holds
836    // the current length of the vector (number of elements actually in use). If capacity >
837    // Self::inline_capacity() then the heap variant is used and capacity holds the size of the
838    // memory allocation.
839    capacity: usize,
840    data: SmallVecData<A>,
841    // Own A::Item, including when A has length zero and all items are on the heap.
842    // This is required for sound drop checking with #[may_dangle].
843    _marker: PhantomData<A::Item>,
844}
845
846impl<A: Array> SmallVec<A> {
847    /// Construct an empty vector
848    #[inline]
849    pub fn new() -> SmallVec<A> {
850        // Try to detect invalid custom implementations of `Array`. Hopefully,
851        // this check should be optimized away entirely for valid ones.
852        assert!(
853            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
854                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
855        );
856        SmallVec {
857            capacity: 0,
858            data: SmallVecData::empty(),
859            _marker: PhantomData,
860        }
861    }
862
863    /// Construct an empty vector with enough capacity pre-allocated to store at
864    /// least `n` elements.
865    ///
866    /// Will create a heap allocation only if `n` is larger than the inline
867    /// capacity.
868    ///
869    /// ```
870    /// # use smallvec::SmallVec;
871    ///
872    /// let v: SmallVec<[u8; 3]> = SmallVec::with_capacity(100);
873    ///
874    /// assert!(v.is_empty());
875    /// assert!(v.capacity() >= 100);
876    /// ```
877    #[inline]
878    pub fn with_capacity(n: usize) -> Self {
879        let mut v = SmallVec::new();
880        v.reserve_exact(n);
881        v
882    }
883
884    /// Construct a new `SmallVec` from a `Vec<A::Item>`.
885    ///
886    /// Elements will be copied to the inline buffer if `vec.capacity() <=
887    /// Self::inline_capacity()`.
888    ///
889    /// ```rust
890    /// use smallvec::SmallVec;
891    ///
892    /// let vec = vec![1, 2, 3, 4, 5];
893    /// let small_vec: SmallVec<[_; 3]> = SmallVec::from_vec(vec);
894    ///
895    /// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
896    /// ```
897    #[inline]
898    pub fn from_vec(mut vec: Vec<A::Item>) -> SmallVec<A> {
899        if vec.capacity() <= Self::inline_capacity() {
900            // Cannot use Vec with smaller capacity
901            // because we use value of `Self::capacity` field as indicator.
902            unsafe {
903                let mut data = SmallVecData::<A>::empty();
904                let len = vec.len();
905                vec.set_len(0);
906                ptr::copy_nonoverlapping(vec.as_ptr(), data.inline_mut().as_ptr(), len);
907
908                SmallVec {
909                    capacity: len,
910                    data,
911                    _marker: PhantomData,
912                }
913            }
914        } else {
915            let (ptr, cap, len) = (vec.as_mut_ptr(), vec.capacity(), vec.len());
916            mem::forget(vec);
917            let ptr = NonNull::new(ptr)
918                // See docs: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.as_mut_ptr
919                .expect("Cannot be null by `Vec` invariant");
920
921            SmallVec {
922                capacity: cap,
923                data: SmallVecData::from_heap(ptr, len),
924                _marker: PhantomData,
925            }
926        }
927    }
928
929    /// Constructs a new `SmallVec` on the stack from an `A` without
930    /// copying elements.
931    ///
932    /// ```rust
933    /// use smallvec::SmallVec;
934    ///
935    /// let buf = [1, 2, 3, 4, 5];
936    /// let small_vec: SmallVec<_> = SmallVec::from_buf(buf);
937    ///
938    /// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
939    /// ```
940    #[inline]
941    pub fn from_buf(buf: A) -> SmallVec<A> {
942        SmallVec {
943            capacity: A::size(),
944            data: SmallVecData::from_inline(MaybeUninit::new(buf)),
945            _marker: PhantomData,
946        }
947    }
948
949    /// Constructs a new `SmallVec` on the stack from an `A` without
950    /// copying elements. Also sets the length, which must be less or
951    /// equal to the size of `buf`.
952    ///
953    /// ```rust
954    /// use smallvec::SmallVec;
955    ///
956    /// let buf = [1, 2, 3, 4, 5, 0, 0, 0];
957    /// let small_vec: SmallVec<_> = SmallVec::from_buf_and_len(buf, 5);
958    ///
959    /// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
960    /// ```
961    #[inline]
962    pub fn from_buf_and_len(buf: A, len: usize) -> SmallVec<A> {
963        assert!(len <= A::size());
964        unsafe { SmallVec::from_buf_and_len_unchecked(MaybeUninit::new(buf), len) }
965    }
966
967    /// Constructs a new `SmallVec` on the stack from an `A` without
968    /// copying elements. Also sets the length. The user is responsible
969    /// for ensuring that `len <= A::size()`.
970    ///
971    /// ```rust
972    /// use {smallvec::SmallVec, std::mem::MaybeUninit};
973    ///
974    /// let buf = [1, 2, 3, 4, 5, 0, 0, 0];
975    /// let small_vec: SmallVec<_> =
976    ///     unsafe { SmallVec::from_buf_and_len_unchecked(MaybeUninit::new(buf), 5) };
977    ///
978    /// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
979    /// ```
980    #[inline]
981    pub unsafe fn from_buf_and_len_unchecked(buf: MaybeUninit<A>, len: usize) -> SmallVec<A> {
982        SmallVec {
983            capacity: len,
984            data: SmallVecData::from_inline(buf),
985            _marker: PhantomData,
986        }
987    }
988
989    /// Sets the length of a vector.
990    ///
991    /// This will explicitly set the size of the vector, without actually
992    /// modifying its buffers, so it is up to the caller to ensure that the
993    /// vector is actually the specified size.
994    pub unsafe fn set_len(&mut self, new_len: usize) {
995        let (_, len_ptr, _) = self.triple_mut();
996        *len_ptr = new_len;
997    }
998
999    /// The maximum number of elements this vector can hold inline
1000    #[inline]
1001    fn inline_capacity() -> usize {
1002        if mem::size_of::<A::Item>() > 0 {
1003            A::size()
1004        } else {
1005            // For zero-size items code like `ptr.add(offset)` always returns
1006            // the same pointer. Therefore all items are at the same
1007            // address, and any array size has capacity for
1008            // infinitely many items. The capacity is limited by the
1009            // bit width of the length field.
1010            //
1011            // `Vec` also does this:
1012            // https://github.com/rust-lang/rust/blob/1.44.0/src/liballoc/raw_vec.rs#L186
1013            //
1014            // In our case, this also ensures that a smallvec of zero-size items
1015            // never spills, and we never try to allocate zero bytes
1016            // which `std::alloc::alloc` disallows.
1017            #[allow(deprecated)]
1018            core::usize::MAX
1019        }
1020    }
1021
1022    /// The maximum number of elements this vector can hold inline
1023    #[inline]
1024    pub fn inline_size(&self) -> usize {
1025        Self::inline_capacity()
1026    }
1027
1028    /// The number of elements stored in the vector
1029    #[inline]
1030    pub fn len(&self) -> usize {
1031        self.triple().1
1032    }
1033
1034    /// Returns `true` if the vector is empty
1035    #[inline]
1036    pub fn is_empty(&self) -> bool {
1037        self.len() == 0
1038    }
1039
1040    /// The number of items the vector can hold without reallocating
1041    #[inline]
1042    pub fn capacity(&self) -> usize {
1043        self.triple().2
1044    }
1045
1046    /// Returns a tuple with (data ptr, len, capacity)
1047    /// Useful to get all `SmallVec` properties with a single check of the
1048    /// current storage variant.
1049    #[inline]
1050    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
1051        unsafe {
1052            if self.spilled() {
1053                let (ptr, len) = self.data.heap();
1054                (ptr, len, self.capacity)
1055            } else {
1056                (self.data.inline(), self.capacity, Self::inline_capacity())
1057            }
1058        }
1059    }
1060
1061    /// Returns a tuple with (data ptr, len ptr, capacity)
1062    #[inline]
1063    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
1064        unsafe {
1065            if self.spilled() {
1066                let (ptr, len_ptr) = self.data.heap_mut();
1067                (ptr, len_ptr, self.capacity)
1068            } else {
1069                (
1070                    self.data.inline_mut(),
1071                    &mut self.capacity,
1072                    Self::inline_capacity(),
1073                )
1074            }
1075        }
1076    }
1077
1078    /// Returns `true` if the data has spilled into a separate heap-allocated
1079    /// buffer.
1080    #[inline]
1081    pub fn spilled(&self) -> bool {
1082        self.capacity > Self::inline_capacity()
1083    }
1084
1085    /// Creates a draining iterator that removes the specified range in the
1086    /// vector and yields the removed items.
1087    ///
1088    /// Note 1: The element range is removed even if the iterator is only
1089    /// partially consumed or not consumed at all.
1090    ///
1091    /// Note 2: It is unspecified how many elements are removed from the vector
1092    /// if the `Drain` value is leaked.
1093    ///
1094    /// # Panics
1095    ///
1096    /// Panics if the starting point is greater than the end point or if
1097    /// the end point is greater than the length of the vector.
1098    pub fn drain<R>(&mut self, range: R) -> Drain<'_, A>
1099    where
1100        R: RangeBounds<usize>,
1101    {
1102        use core::ops::Bound::*;
1103
1104        let len = self.len();
1105        let start = match range.start_bound() {
1106            Included(&n) => n,
1107            Excluded(&n) => n.checked_add(1).expect("Range start out of bounds"),
1108            Unbounded => 0,
1109        };
1110        let end = match range.end_bound() {
1111            Included(&n) => n.checked_add(1).expect("Range end out of bounds"),
1112            Excluded(&n) => n,
1113            Unbounded => len,
1114        };
1115
1116        assert!(start <= end);
1117        assert!(end <= len);
1118
1119        unsafe {
1120            self.set_len(start);
1121
1122            let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
1123
1124            Drain {
1125                tail_start: end,
1126                tail_len: len - end,
1127                iter: range_slice.iter(),
1128                // Since self is a &mut, passing it to a function would invalidate the slice
1129                // iterator.
1130                vec: NonNull::new_unchecked(self as *mut _),
1131            }
1132        }
1133    }
1134
1135    #[cfg(feature = "drain_filter")]
1136    /// Creates an iterator which uses a closure to determine if an element
1137    /// should be removed.
1138    ///
1139    /// If the closure returns true, the element is removed and yielded. If the
1140    /// closure returns false, the element will remain in the vector and
1141    /// will not be yielded by the iterator.
1142    ///
1143    /// Using this method is equivalent to the following code:
1144    /// ```
1145    /// # use smallvec::SmallVec;
1146    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6 };
1147    /// # let mut vec: SmallVec<[i32; 8]> = SmallVec::from_slice(&[1i32, 2, 3, 4, 5, 6]);
1148    /// let mut i = 0;
1149    /// while i < vec.len() {
1150    ///     if some_predicate(&mut vec[i]) {
1151    ///         let val = vec.remove(i);
1152    ///         // your code here
1153    ///     } else {
1154    ///         i += 1;
1155    ///     }
1156    /// }
1157    ///
1158    /// # assert_eq!(vec, SmallVec::<[i32; 8]>::from_slice(&[1i32, 4, 5]));
1159    /// ```
1160    /// ///
1161    /// But `drain_filter` is easier to use. `drain_filter` is also more
1162    /// efficient, because it can backshift the elements of the array in
1163    /// bulk.
1164    ///
1165    /// Note that `drain_filter` also lets you mutate every element in the
1166    /// filter closure, regardless of whether you choose to keep or remove
1167    /// it.
1168    ///
1169    /// # Examples
1170    ///
1171    /// Splitting an array into evens and odds, reusing the original allocation:
1172    ///
1173    /// ```
1174    /// # use smallvec::SmallVec;
1175    /// let mut numbers: SmallVec<[i32; 16]> =
1176    ///     SmallVec::from_slice(&[1i32, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15]);
1177    ///
1178    /// let evens = numbers
1179    ///     .drain_filter(|x| *x % 2 == 0)
1180    ///     .collect::<SmallVec<[i32; 16]>>();
1181    /// let odds = numbers;
1182    ///
1183    /// assert_eq!(
1184    ///     evens,
1185    ///     SmallVec::<[i32; 16]>::from_slice(&[2i32, 4, 6, 8, 14])
1186    /// );
1187    /// assert_eq!(
1188    ///     odds,
1189    ///     SmallVec::<[i32; 16]>::from_slice(&[1i32, 3, 5, 9, 11, 13, 15])
1190    /// );
1191    /// ```
1192    pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, A, F>
1193    where
1194        F: FnMut(&mut A::Item) -> bool,
1195    {
1196        let old_len = self.len();
1197
1198        // Guard against us getting leaked (leak amplification)
1199        unsafe {
1200            self.set_len(0);
1201        }
1202
1203        DrainFilter {
1204            vec: self,
1205            idx: 0,
1206            del: 0,
1207            old_len,
1208            pred: filter,
1209            panic_flag: false,
1210        }
1211    }
1212
1213    /// Append an item to the vector.
1214    #[inline]
1215    pub fn push(&mut self, value: A::Item) {
1216        unsafe {
1217            if self.spilled() {
1218                let (mut ptr, mut len_ptr) = self.data.heap_mut();
1219                if *len_ptr == self.capacity {
1220                    self.reserve_one_unchecked();
1221                    let (heap_ptr, heap_len) = self.data.heap_mut();
1222                    ptr = heap_ptr;
1223                    len_ptr = heap_len;
1224                }
1225                ptr::write(ptr.as_ptr().add(*len_ptr), value);
1226                *len_ptr += 1;
1227            } else {
1228                let mut ptr = self.data.inline_mut();
1229                let mut len_ptr = &mut self.capacity;
1230                if *len_ptr == Self::inline_capacity() {
1231                    self.reserve_one_unchecked();
1232                    let (heap_ptr, heap_len) = self.data.heap_mut();
1233                    ptr = heap_ptr;
1234                    len_ptr = heap_len;
1235                }
1236                ptr::write(ptr.as_ptr().add(*len_ptr), value);
1237                *len_ptr += 1;
1238            };
1239        }
1240    }
1241
1242    /// Remove an item from the end of the vector and return it, or None if
1243    /// empty.
1244    #[inline]
1245    pub fn pop(&mut self) -> Option<A::Item> {
1246        unsafe {
1247            let (ptr, len_ptr, _) = self.triple_mut();
1248            let ptr: *const _ = ptr.as_ptr();
1249            if *len_ptr == 0 {
1250                return None;
1251            }
1252            let last_index = *len_ptr - 1;
1253            *len_ptr = last_index;
1254            Some(ptr::read(ptr.add(last_index)))
1255        }
1256    }
1257
1258    /// Moves all the elements of `other` into `self`, leaving `other` empty.
1259    ///
1260    /// # Example
1261    ///
1262    /// ```
1263    /// # use smallvec::{SmallVec, smallvec};
1264    /// let mut v0: SmallVec<[u8; 16]> = smallvec![1, 2, 3];
1265    /// let mut v1: SmallVec<[u8; 32]> = smallvec![4, 5, 6];
1266    /// v0.append(&mut v1);
1267    /// assert_eq!(*v0, [1, 2, 3, 4, 5, 6]);
1268    /// assert_eq!(*v1, []);
1269    /// ```
1270    pub fn append<B>(&mut self, other: &mut SmallVec<B>)
1271    where
1272        B: Array<Item = A::Item>,
1273    {
1274        self.extend(other.drain(..))
1275    }
1276
1277    /// Re-allocate to set the capacity to `max(new_cap, inline_size())`.
1278    ///
1279    /// If `new_cap` is less than the vector's length, this is a no-op.
1280    /// Panics if the capacity computation overflows `usize`.
1281    pub fn grow(&mut self, new_cap: usize) {
1282        infallible(self.try_grow(new_cap))
1283    }
1284
1285    /// Re-allocate to set the capacity to `max(new_cap, inline_size())`.
1286    ///
1287    /// If `new_cap` is less than the vector's length, this is a no-op.
1288    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1289        unsafe {
1290            let unspilled = !self.spilled();
1291            let (ptr, &mut len, cap) = self.triple_mut();
1292            if new_cap < len {
1293                return Ok(());
1294            }
1295            if new_cap <= Self::inline_capacity() {
1296                if unspilled {
1297                    return Ok(());
1298                }
1299                self.data = SmallVecData::empty();
1300                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1301                self.capacity = len;
1302                deallocate(ptr, cap);
1303            } else if new_cap != cap {
1304                let layout = layout_array::<A::Item>(new_cap)?;
1305                debug_assert!(layout.size() > 0);
1306                let new_alloc;
1307                if unspilled {
1308                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1309                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1310                        .cast();
1311                    ptr::copy_nonoverlapping(ptr.as_ptr(), new_alloc.as_ptr(), len);
1312                } else {
1313                    // This should never fail since the same succeeded
1314                    // when previously allocating `ptr`.
1315                    let old_layout = layout_array::<A::Item>(cap)?;
1316
1317                    let new_ptr =
1318                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1319                    new_alloc = NonNull::new(new_ptr)
1320                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1321                        .cast();
1322                }
1323                self.data = SmallVecData::from_heap(new_alloc, len);
1324                self.capacity = new_cap;
1325            }
1326            Ok(())
1327        }
1328    }
1329
1330    /// Reserve capacity for `additional` more elements to be inserted.
1331    ///
1332    /// May reserve more space to avoid frequent reallocations.
1333    ///
1334    /// Panics if the capacity computation overflows `usize`.
1335    #[inline]
1336    pub fn reserve(&mut self, additional: usize) {
1337        infallible(self.try_reserve(additional))
1338    }
1339
1340    /// Internal method used to grow in push() and insert(), where we know
1341    /// already we have to grow.
1342    #[cold]
1343    fn reserve_one_unchecked(&mut self) {
1344        debug_assert_eq!(self.len(), self.capacity());
1345        let new_cap = self
1346            .len()
1347            .checked_add(1)
1348            .and_then(usize::checked_next_power_of_two)
1349            .expect("capacity overflow");
1350        infallible(self.try_grow(new_cap))
1351    }
1352
1353    /// Reserve capacity for `additional` more elements to be inserted.
1354    ///
1355    /// May reserve more space to avoid frequent reallocations.
1356    pub fn try_reserve(&mut self, additional: usize) -> Result<(), CollectionAllocErr> {
1357        // prefer triple_mut() even if triple() would work so that the optimizer
1358        // removes duplicated calls to it from callers.
1359        let (_, &mut len, cap) = self.triple_mut();
1360        if cap - len >= additional {
1361            return Ok(());
1362        }
1363        let new_cap = len
1364            .checked_add(additional)
1365            .and_then(usize::checked_next_power_of_two)
1366            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1367        self.try_grow(new_cap)
1368    }
1369
1370    /// Reserve the minimum capacity for `additional` more elements to be
1371    /// inserted.
1372    ///
1373    /// Panics if the new capacity overflows `usize`.
1374    pub fn reserve_exact(&mut self, additional: usize) {
1375        infallible(self.try_reserve_exact(additional))
1376    }
1377
1378    /// Reserve the minimum capacity for `additional` more elements to be
1379    /// inserted.
1380    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), CollectionAllocErr> {
1381        let (_, &mut len, cap) = self.triple_mut();
1382        if cap - len >= additional {
1383            return Ok(());
1384        }
1385        let new_cap = len
1386            .checked_add(additional)
1387            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1388        self.try_grow(new_cap)
1389    }
1390
1391    /// Shrink the capacity of the vector as much as possible.
1392    ///
1393    /// When possible, this will move data from an external heap buffer to the
1394    /// vector's inline storage.
1395    pub fn shrink_to_fit(&mut self) {
1396        if !self.spilled() {
1397            return;
1398        }
1399        let len = self.len();
1400        if self.inline_size() >= len {
1401            unsafe {
1402                let (ptr, len) = self.data.heap();
1403                self.data = SmallVecData::empty();
1404                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1405                deallocate(ptr.0, self.capacity);
1406                self.capacity = len;
1407            }
1408        } else if self.capacity() > len {
1409            self.grow(len);
1410        }
1411    }
1412
1413    /// Shorten the vector, keeping the first `len` elements and dropping the
1414    /// rest.
1415    ///
1416    /// If `len` is greater than or equal to the vector's current length, this
1417    /// has no effect.
1418    ///
1419    /// This does not re-allocate.  If you want the vector's capacity to shrink,
1420    /// call `shrink_to_fit` after truncating.
1421    pub fn truncate(&mut self, len: usize) {
1422        unsafe {
1423            let (ptr, len_ptr, _) = self.triple_mut();
1424            let ptr = ptr.as_ptr();
1425            while len < *len_ptr {
1426                let last_index = *len_ptr - 1;
1427                *len_ptr = last_index;
1428                ptr::drop_in_place(ptr.add(last_index));
1429            }
1430        }
1431    }
1432
1433    /// Extracts a slice containing the entire vector.
1434    ///
1435    /// Equivalent to `&s[..]`.
1436    pub fn as_slice(&self) -> &[A::Item] {
1437        self
1438    }
1439
1440    /// Extracts a mutable slice of the entire vector.
1441    ///
1442    /// Equivalent to `&mut s[..]`.
1443    pub fn as_mut_slice(&mut self) -> &mut [A::Item] {
1444        self
1445    }
1446
1447    /// Remove the element at position `index`, replacing it with the last
1448    /// element.
1449    ///
1450    /// This does not preserve ordering, but is O(1).
1451    ///
1452    /// Panics if `index` is out of bounds.
1453    #[inline]
1454    pub fn swap_remove(&mut self, index: usize) -> A::Item {
1455        let len = self.len();
1456        self.swap(len - 1, index);
1457        self.pop()
1458            .unwrap_or_else(|| unsafe { unreachable_unchecked() })
1459    }
1460
1461    /// Remove all elements from the vector.
1462    #[inline]
1463    pub fn clear(&mut self) {
1464        self.truncate(0);
1465    }
1466
1467    /// Remove and return the element at position `index`, shifting all elements
1468    /// after it to the left.
1469    ///
1470    /// Panics if `index` is out of bounds.
1471    pub fn remove(&mut self, index: usize) -> A::Item {
1472        unsafe {
1473            let (ptr, len_ptr, _) = self.triple_mut();
1474            let len = *len_ptr;
1475            assert!(index < len);
1476            *len_ptr = len - 1;
1477            let ptr = ptr.as_ptr().add(index);
1478            let item = ptr::read(ptr);
1479            ptr::copy(ptr.add(1), ptr, len - index - 1);
1480            item
1481        }
1482    }
1483
1484    /// Insert an element at position `index`, shifting all elements after it to
1485    /// the right.
1486    ///
1487    /// Panics if `index > len`.
1488    pub fn insert(&mut self, index: usize, element: A::Item) {
1489        unsafe {
1490            let (mut ptr, mut len_ptr, cap) = self.triple_mut();
1491            if *len_ptr == cap {
1492                self.reserve_one_unchecked();
1493                let (heap_ptr, heap_len_ptr) = self.data.heap_mut();
1494                ptr = heap_ptr;
1495                len_ptr = heap_len_ptr;
1496            }
1497            let mut ptr = ptr.as_ptr();
1498            let len = *len_ptr;
1499            if index > len {
1500                panic!("index exceeds length");
1501            }
1502            // SAFETY: add is UB if index > len, but we panicked first
1503            ptr = ptr.add(index);
1504            if index < len {
1505                // Shift element to the right of `index`.
1506                ptr::copy(ptr, ptr.add(1), len - index);
1507            }
1508            *len_ptr = len + 1;
1509            ptr::write(ptr, element);
1510        }
1511    }
1512
1513    /// Insert multiple elements at position `index`, shifting all following
1514    /// elements toward the back.
1515    pub fn insert_many<I: IntoIterator<Item = A::Item>>(&mut self, index: usize, iterable: I) {
1516        let mut iter = iterable.into_iter();
1517        if index == self.len() {
1518            return self.extend(iter);
1519        }
1520
1521        let (lower_size_bound, _) = iter.size_hint();
1522        #[allow(deprecated)]
1523        {
1524            assert!(lower_size_bound <= core::isize::MAX as usize)
1525        } // Ensure offset is indexable
1526        assert!(index + lower_size_bound >= index); // Protect against overflow
1527
1528        let mut num_added = 0;
1529        let old_len = self.len();
1530        assert!(index <= old_len);
1531
1532        unsafe {
1533            // Reserve space for `lower_size_bound` elements.
1534            self.reserve(lower_size_bound);
1535            let start = self.as_mut_ptr();
1536            let ptr = start.add(index);
1537
1538            // Move the trailing elements.
1539            ptr::copy(ptr, ptr.add(lower_size_bound), old_len - index);
1540
1541            // In case the iterator panics, don't double-drop the items we just
1542            // copied above.
1543            self.set_len(0);
1544            let mut guard = DropOnPanic {
1545                start,
1546                skip: index..(index + lower_size_bound),
1547                len: old_len + lower_size_bound,
1548            };
1549
1550            // The set_len above invalidates the previous pointers, so we must
1551            // re-create them.
1552            let start = self.as_mut_ptr();
1553            let ptr = start.add(index);
1554
1555            while num_added < lower_size_bound {
1556                let element = match iter.next() {
1557                    Some(x) => x,
1558                    None => break,
1559                };
1560                let cur = ptr.add(num_added);
1561                ptr::write(cur, element);
1562                guard.skip.start += 1;
1563                num_added += 1;
1564            }
1565
1566            if num_added < lower_size_bound {
1567                // Iterator provided fewer elements than the hint. Move the tail
1568                // backward.
1569                ptr::copy(
1570                    ptr.add(lower_size_bound),
1571                    ptr.add(num_added),
1572                    old_len - index,
1573                );
1574            }
1575            // There are no more duplicate or uninitialized slots, so the guard
1576            // is not needed.
1577            self.set_len(old_len + num_added);
1578            mem::forget(guard);
1579        }
1580
1581        // Insert any remaining elements one-by-one.
1582        for element in iter {
1583            self.insert(index + num_added, element);
1584            num_added += 1;
1585        }
1586
1587        struct DropOnPanic<T> {
1588            start: *mut T,
1589            skip: Range<usize>, // Space we copied-out-of, but haven't written-to yet.
1590            len: usize,
1591        }
1592
1593        impl<T> Drop for DropOnPanic<T> {
1594            fn drop(&mut self) {
1595                for i in 0..self.len {
1596                    if !self.skip.contains(&i) {
1597                        unsafe {
1598                            ptr::drop_in_place(self.start.add(i));
1599                        }
1600                    }
1601                }
1602            }
1603        }
1604    }
1605
1606    /// Convert a `SmallVec` to a `Vec`, without reallocating if the `SmallVec`
1607    /// has already spilled onto the heap.
1608    pub fn into_vec(mut self) -> Vec<A::Item> {
1609        if self.spilled() {
1610            unsafe {
1611                let (ptr, &mut len) = self.data.heap_mut();
1612                let v = Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity);
1613                mem::forget(self);
1614                v
1615            }
1616        } else {
1617            self.into_iter().collect()
1618        }
1619    }
1620
1621    /// Converts a `SmallVec` into a `Box<[T]>` without reallocating if the
1622    /// `SmallVec` has already spilled onto the heap.
1623    ///
1624    /// Note that this will drop any excess capacity.
1625    pub fn into_boxed_slice(self) -> Box<[A::Item]> {
1626        self.into_vec().into_boxed_slice()
1627    }
1628
1629    /// Convert the `SmallVec` into an `A` if possible. Otherwise return
1630    /// `Err(Self)`.
1631    ///
1632    /// This method returns `Err(Self)` if the `SmallVec` is too short (and the
1633    /// `A` contains uninitialized elements), or if the `SmallVec` is too
1634    /// long (and all the elements were spilled to the heap).
1635    pub fn into_inner(self) -> Result<A, Self> {
1636        if self.spilled() || self.len() != A::size() {
1637            // Note: A::size, not Self::inline_capacity
1638            Err(self)
1639        } else {
1640            unsafe {
1641                let data = ptr::read(&self.data);
1642                mem::forget(self);
1643                Ok(data.into_inline().assume_init())
1644            }
1645        }
1646    }
1647
1648    /// Retains only the elements specified by the predicate.
1649    ///
1650    /// In other words, remove all elements `e` such that `f(&e)` returns
1651    /// `false`. This method operates in place and preserves the order of
1652    /// the retained elements.
1653    pub fn retain<F: FnMut(&mut A::Item) -> bool>(&mut self, mut f: F) {
1654        let original_len = self.len();
1655
1656        if original_len == 0 {
1657            // Empty case: explicit return allows better optimization, vs
1658            // letting compiler infer it
1659            return;
1660        }
1661
1662        // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked]
1663        //      |            ^- write                ^- read             |
1664        //      |<-              original_len                          ->|
1665        // Kept: Elements which predicate returns true on.
1666        // Hole: Moved or dropped element slot.
1667        // Unchecked: Unchecked valid elements.
1668        //
1669        // This drop guard will be invoked when predicate or `drop` of element
1670        // panicked. It shifts unchecked elements to cover holes and
1671        // `set_len` to the correct length. In cases when predicate and
1672        // `drop` never panic, it will be optimized out.
1673        struct PanicGuard<'a, A: Array> {
1674            v: &'a mut SmallVec<A>,
1675            read: usize,
1676            write: usize,
1677            original_len: usize,
1678        }
1679
1680        impl<A: Array> Drop for PanicGuard<'_, A> {
1681            #[cold]
1682            fn drop(&mut self) {
1683                let remaining = self.original_len - self.read;
1684                // SAFETY: Trailing unchecked items must be valid since we never
1685                // touch them.
1686                unsafe {
1687                    let ptr = self.v.as_mut_ptr();
1688                    ptr::copy(ptr.add(self.read), ptr.add(self.write), remaining);
1689                }
1690                // SAFETY: After filling holes, all items are in contiguous
1691                // memory.
1692                unsafe {
1693                    self.v.set_len(self.write + remaining);
1694                }
1695            }
1696        }
1697
1698        let mut read = 0;
1699        loop {
1700            // SAFETY: read < original_len
1701            let cur = unsafe { self.get_unchecked_mut(read) };
1702            if !f(cur) {
1703                break;
1704            }
1705            read += 1;
1706            if read == original_len {
1707                // All elements are kept, return early.
1708                return;
1709            }
1710        }
1711
1712        // Critical section starts here and at least one element is going to be
1713        // removed. Advance `g.read` early to avoid double drop if
1714        // `drop_in_place` panicked.
1715        let mut g = PanicGuard {
1716            v: self,
1717            read: read + 1,
1718            write: read,
1719            original_len,
1720        };
1721        // SAFETY: previous `read` is always less than original_len.
1722        unsafe { ptr::drop_in_place(g.v.as_mut_ptr().add(read)) }
1723
1724        let ptr = g.v.as_mut_ptr();
1725        while g.read < g.original_len {
1726            // SAFETY: `read` is always less than original_len.
1727            let cur = unsafe { &mut *ptr.add(g.read) };
1728            if !f(cur) {
1729                // Advance `read` early to avoid double drop if `drop_in_place`
1730                // panicked.
1731                g.read += 1;
1732                // SAFETY: We never touch this element again after dropped.
1733                unsafe { ptr::drop_in_place(cur) };
1734            } else {
1735                // SAFETY: `read` > `write`, so the slots don't overlap.
1736                // We use copy for move, and never touch the source element
1737                // again.
1738                unsafe {
1739                    let hole = ptr.add(g.write);
1740                    ptr::copy_nonoverlapping(cur, hole, 1);
1741                }
1742                g.write += 1;
1743                g.read += 1;
1744            }
1745        }
1746
1747        // We are leaving the critical section and no panic happened,
1748        // Commit the length change and forget the guard.
1749        // SAFETY: `write` is always less than or equal to original_len.
1750        unsafe { g.v.set_len(g.write) };
1751        core::mem::forget(g);
1752    }
1753
1754    /// Retains only the elements specified by the predicate.
1755    ///
1756    /// This method is identical in behaviour to [`SmallVec::retain`]; it is
1757    /// included only to maintain api-compatibility with `std::Vec`, where
1758    /// the methods are separate for historical reasons.
1759    pub fn retain_mut<F: FnMut(&mut A::Item) -> bool>(&mut self, f: F) {
1760        self.retain(f)
1761    }
1762
1763    /// Removes consecutive duplicate elements.
1764    pub fn dedup(&mut self)
1765    where
1766        A::Item: PartialEq<A::Item>,
1767    {
1768        self.dedup_by(|a, b| a == b);
1769    }
1770
1771    /// Removes consecutive duplicate elements using the given equality
1772    /// relation.
1773    pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1774    where
1775        F: FnMut(&mut A::Item, &mut A::Item) -> bool,
1776    {
1777        // See the implementation of Vec::dedup_by in the
1778        // standard library for an explanation of this algorithm.
1779        let len = self.len();
1780        if len <= 1 {
1781            return;
1782        }
1783
1784        let ptr = self.as_mut_ptr();
1785        let mut w: usize = 1;
1786
1787        unsafe {
1788            for r in 1..len {
1789                let p_r = ptr.add(r);
1790                let p_wm1 = ptr.add(w - 1);
1791                if !same_bucket(&mut *p_r, &mut *p_wm1) {
1792                    if r != w {
1793                        let p_w = p_wm1.add(1);
1794                        mem::swap(&mut *p_r, &mut *p_w);
1795                    }
1796                    w += 1;
1797                }
1798            }
1799        }
1800
1801        self.truncate(w);
1802    }
1803
1804    /// Removes consecutive elements that map to the same key.
1805    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1806    where
1807        F: FnMut(&mut A::Item) -> K,
1808        K: PartialEq<K>,
1809    {
1810        self.dedup_by(|a, b| key(a) == key(b));
1811    }
1812
1813    /// Resizes the `SmallVec` in-place so that `len` is equal to `new_len`.
1814    ///
1815    /// If `new_len` is greater than `len`, the `SmallVec` is extended by the
1816    /// difference, with each additional slot filled with the result of
1817    /// calling the closure `f`. The return values from `f` will end up in
1818    /// the `SmallVec` in the order they have been generated.
1819    ///
1820    /// If `new_len` is less than `len`, the `SmallVec` is simply truncated.
1821    ///
1822    /// This method uses a closure to create new values on every push. If you'd
1823    /// rather `Clone` a given value, use `resize`. If you want to use the
1824    /// `Default` trait to generate values, you can pass
1825    /// `Default::default()` as the second argument.
1826    ///
1827    /// Added for `std::vec::Vec` compatibility (added in Rust 1.33.0)
1828    ///
1829    /// ```
1830    /// # use smallvec::{smallvec, SmallVec};
1831    /// let mut vec: SmallVec<[_; 4]> = smallvec![1, 2, 3];
1832    /// vec.resize_with(5, Default::default);
1833    /// assert_eq!(&*vec, &[1, 2, 3, 0, 0]);
1834    ///
1835    /// let mut vec: SmallVec<[_; 4]> = smallvec![];
1836    /// let mut p = 1;
1837    /// vec.resize_with(4, || {
1838    ///     p *= 2;
1839    ///     p
1840    /// });
1841    /// assert_eq!(&*vec, &[2, 4, 8, 16]);
1842    /// ```
1843    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
1844    where
1845        F: FnMut() -> A::Item,
1846    {
1847        let old_len = self.len();
1848        if old_len < new_len {
1849            let mut f = f;
1850            let additional = new_len - old_len;
1851            self.reserve(additional);
1852            for _ in 0..additional {
1853                self.push(f());
1854            }
1855        } else if old_len > new_len {
1856            self.truncate(new_len);
1857        }
1858    }
1859
1860    /// Creates a `SmallVec` directly from the raw components of another
1861    /// `SmallVec`.
1862    ///
1863    /// # Safety
1864    ///
1865    /// This is highly unsafe, due to the number of invariants that aren't
1866    /// checked:
1867    ///
1868    /// * `ptr` needs to have been previously allocated via `SmallVec` for its
1869    ///   spilled storage (at least, it's highly likely to be incorrect if it
1870    ///   wasn't).
1871    /// * `ptr`'s `A::Item` type needs to be the same size and alignment that it
1872    ///   was allocated with
1873    /// * `length` needs to be less than or equal to `capacity`.
1874    /// * `capacity` needs to be the capacity that the pointer was allocated
1875    ///   with.
1876    ///
1877    /// Violating these may cause problems like corrupting the allocator's
1878    /// internal data structures.
1879    ///
1880    /// Additionally, `capacity` must be greater than the amount of inline
1881    /// storage `A` has; that is, the new `SmallVec` must need to spill over
1882    /// into heap allocated storage. This condition is asserted against.
1883    ///
1884    /// The ownership of `ptr` is effectively transferred to the
1885    /// `SmallVec` which may then deallocate, reallocate or change the
1886    /// contents of memory pointed to by the pointer at will. Ensure
1887    /// that nothing else uses the pointer after calling this
1888    /// function.
1889    ///
1890    /// # Examples
1891    ///
1892    /// ```
1893    /// # use smallvec::{smallvec, SmallVec};
1894    /// use std::mem;
1895    /// use std::ptr;
1896    ///
1897    /// fn main() {
1898    ///     let mut v: SmallVec<[_; 1]> = smallvec![1, 2, 3];
1899    ///
1900    ///     // Pull out the important parts of `v`.
1901    ///     let p = v.as_mut_ptr();
1902    ///     let len = v.len();
1903    ///     let cap = v.capacity();
1904    ///     let spilled = v.spilled();
1905    ///
1906    ///     unsafe {
1907    ///         // Forget all about `v`. The heap allocation that stored the
1908    ///         // three values won't be deallocated.
1909    ///         mem::forget(v);
1910    ///
1911    ///         // Overwrite memory with [4, 5, 6].
1912    ///         //
1913    ///         // This is only safe if `spilled` is true! Otherwise, we are
1914    ///         // writing into the old `SmallVec`'s inline storage on the
1915    ///         // stack.
1916    ///         assert!(spilled);
1917    ///         for i in 0..len {
1918    ///             ptr::write(p.add(i), 4 + i);
1919    ///         }
1920    ///
1921    ///         // Put everything back together into a SmallVec with a different
1922    ///         // amount of inline storage, but which is still less than `cap`.
1923    ///         let rebuilt = SmallVec::<[_; 2]>::from_raw_parts(p, len, cap);
1924    ///         assert_eq!(&*rebuilt, &[4, 5, 6]);
1925    ///     }
1926    /// }
1927    #[inline]
1928    pub unsafe fn from_raw_parts(ptr: *mut A::Item, length: usize, capacity: usize) -> SmallVec<A> {
1929        // SAFETY: We require caller to provide same ptr as we alloc
1930        // and we never alloc null pointer.
1931        let ptr = unsafe {
1932            debug_assert!(!ptr.is_null(), "Called `from_raw_parts` with null pointer.");
1933            NonNull::new_unchecked(ptr)
1934        };
1935        assert!(capacity > Self::inline_capacity());
1936        SmallVec {
1937            capacity,
1938            data: SmallVecData::from_heap(ptr, length),
1939            _marker: PhantomData,
1940        }
1941    }
1942
1943    /// Returns a raw pointer to the vector's buffer.
1944    pub fn as_ptr(&self) -> *const A::Item {
1945        // We shadow the slice method of the same name to avoid going through
1946        // `deref`, which creates an intermediate reference that may place
1947        // additional safety constraints on the contents of the slice.
1948        self.triple().0.as_ptr()
1949    }
1950
1951    /// Returns a raw mutable pointer to the vector's buffer.
1952    pub fn as_mut_ptr(&mut self) -> *mut A::Item {
1953        // We shadow the slice method of the same name to avoid going through
1954        // `deref_mut`, which creates an intermediate reference that may place
1955        // additional safety constraints on the contents of the slice.
1956        self.triple_mut().0.as_ptr()
1957    }
1958}
1959
1960impl<A: Array> SmallVec<A>
1961where
1962    A::Item: Copy,
1963{
1964    /// Copy the elements from a slice into a new `SmallVec`.
1965    ///
1966    /// For slices of `Copy` types, this is more efficient than
1967    /// `SmallVec::from(slice)`.
1968    pub fn from_slice(slice: &[A::Item]) -> Self {
1969        let len = slice.len();
1970        if len <= Self::inline_capacity() {
1971            SmallVec {
1972                capacity: len,
1973                data: SmallVecData::from_inline(unsafe {
1974                    let mut data: MaybeUninit<A> = MaybeUninit::uninit();
1975                    ptr::copy_nonoverlapping(
1976                        slice.as_ptr(),
1977                        data.as_mut_ptr() as *mut A::Item,
1978                        len,
1979                    );
1980                    data
1981                }),
1982                _marker: PhantomData,
1983            }
1984        } else {
1985            let mut b = slice.to_vec();
1986            let cap = b.capacity();
1987            let ptr = NonNull::new(b.as_mut_ptr()).expect("Vec always contain non null pointers.");
1988            mem::forget(b);
1989            SmallVec {
1990                capacity: cap,
1991                data: SmallVecData::from_heap(ptr, len),
1992                _marker: PhantomData,
1993            }
1994        }
1995    }
1996
1997    /// Copy elements from a slice into the vector at position `index`, shifting
1998    /// any following elements toward the back.
1999    ///
2000    /// For slices of `Copy` types, this is more efficient than `insert`.
2001    #[inline]
2002    pub fn insert_from_slice(&mut self, index: usize, slice: &[A::Item]) {
2003        self.reserve(slice.len());
2004
2005        let len = self.len();
2006        assert!(index <= len);
2007
2008        unsafe {
2009            let slice_ptr = slice.as_ptr();
2010            let ptr = self.as_mut_ptr().add(index);
2011            ptr::copy(ptr, ptr.add(slice.len()), len - index);
2012            ptr::copy_nonoverlapping(slice_ptr, ptr, slice.len());
2013            self.set_len(len + slice.len());
2014        }
2015    }
2016
2017    /// Copy elements from a slice and append them to the vector.
2018    ///
2019    /// For slices of `Copy` types, this is more efficient than `extend`.
2020    #[inline]
2021    pub fn extend_from_slice(&mut self, slice: &[A::Item]) {
2022        let len = self.len();
2023        self.insert_from_slice(len, slice);
2024    }
2025}
2026
2027impl<A: Array> SmallVec<A>
2028where
2029    A::Item: Clone,
2030{
2031    /// Resizes the vector so that its length is equal to `len`.
2032    ///
2033    /// If `len` is less than the current length, the vector simply truncated.
2034    ///
2035    /// If `len` is greater than the current length, `value` is appended to the
2036    /// vector until its length equals `len`.
2037    pub fn resize(&mut self, len: usize, value: A::Item) {
2038        let old_len = self.len();
2039
2040        if len > old_len {
2041            self.extend(repeat(value).take(len - old_len));
2042        } else {
2043            self.truncate(len);
2044        }
2045    }
2046
2047    /// Creates a `SmallVec` with `n` copies of `elem`.
2048    /// ```
2049    /// use smallvec::SmallVec;
2050    ///
2051    /// let v = SmallVec::<[char; 128]>::from_elem('d', 2);
2052    /// assert_eq!(v, SmallVec::from_buf(['d', 'd']));
2053    /// ```
2054    pub fn from_elem(elem: A::Item, n: usize) -> Self {
2055        if n > Self::inline_capacity() {
2056            vec![elem; n].into()
2057        } else {
2058            let mut v = SmallVec::<A>::new();
2059            unsafe {
2060                let (ptr, len_ptr, _) = v.triple_mut();
2061                let ptr = ptr.as_ptr();
2062                let mut local_len = SetLenOnDrop::new(len_ptr);
2063
2064                for i in 0..n {
2065                    ::core::ptr::write(ptr.add(i), elem.clone());
2066                    local_len.increment_len(1);
2067                }
2068            }
2069            v
2070        }
2071    }
2072}
2073
2074impl<A: Array> ops::Deref for SmallVec<A> {
2075    type Target = [A::Item];
2076    #[inline]
2077    fn deref(&self) -> &[A::Item] {
2078        unsafe {
2079            let (ptr, len, _) = self.triple();
2080            slice::from_raw_parts(ptr.as_ptr(), len)
2081        }
2082    }
2083}
2084
2085impl<A: Array> ops::DerefMut for SmallVec<A> {
2086    #[inline]
2087    fn deref_mut(&mut self) -> &mut [A::Item] {
2088        unsafe {
2089            let (ptr, &mut len, _) = self.triple_mut();
2090            slice::from_raw_parts_mut(ptr.as_ptr(), len)
2091        }
2092    }
2093}
2094
2095impl<A: Array> AsRef<[A::Item]> for SmallVec<A> {
2096    #[inline]
2097    fn as_ref(&self) -> &[A::Item] {
2098        self
2099    }
2100}
2101
2102impl<A: Array> AsMut<[A::Item]> for SmallVec<A> {
2103    #[inline]
2104    fn as_mut(&mut self) -> &mut [A::Item] {
2105        self
2106    }
2107}
2108
2109impl<A: Array> Borrow<[A::Item]> for SmallVec<A> {
2110    #[inline]
2111    fn borrow(&self) -> &[A::Item] {
2112        self
2113    }
2114}
2115
2116impl<A: Array> BorrowMut<[A::Item]> for SmallVec<A> {
2117    #[inline]
2118    fn borrow_mut(&mut self) -> &mut [A::Item] {
2119        self
2120    }
2121}
2122
2123#[cfg(feature = "write")]
2124#[cfg_attr(docsrs, doc(cfg(feature = "write")))]
2125impl<A: Array<Item = u8>> io::Write for SmallVec<A> {
2126    #[inline]
2127    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
2128        self.extend_from_slice(buf);
2129        Ok(buf.len())
2130    }
2131
2132    #[inline]
2133    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
2134        self.extend_from_slice(buf);
2135        Ok(())
2136    }
2137
2138    #[inline]
2139    fn flush(&mut self) -> io::Result<()> {
2140        Ok(())
2141    }
2142}
2143
2144#[cfg(feature = "serde")]
2145#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2146impl<A: Array> Serialize for SmallVec<A>
2147where
2148    A::Item: Serialize,
2149{
2150    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2151        let mut state = serializer.serialize_seq(Some(self.len()))?;
2152        for item in self {
2153            state.serialize_element(&item)?;
2154        }
2155        state.end()
2156    }
2157}
2158
2159#[cfg(feature = "serde")]
2160#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2161impl<'de, A: Array> Deserialize<'de> for SmallVec<A>
2162where
2163    A::Item: Deserialize<'de>,
2164{
2165    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2166        deserializer.deserialize_seq(SmallVecVisitor {
2167            phantom: PhantomData,
2168        })
2169    }
2170}
2171
2172#[cfg(feature = "serde")]
2173struct SmallVecVisitor<A> {
2174    phantom: PhantomData<A>,
2175}
2176
2177#[cfg(feature = "serde")]
2178impl<'de, A: Array> Visitor<'de> for SmallVecVisitor<A>
2179where
2180    A::Item: Deserialize<'de>,
2181{
2182    type Value = SmallVec<A>;
2183
2184    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
2185        formatter.write_str("a sequence")
2186    }
2187
2188    fn visit_seq<B>(self, mut seq: B) -> Result<Self::Value, B::Error>
2189    where
2190        B: SeqAccess<'de>,
2191    {
2192        use serde::de::Error;
2193        let len = seq.size_hint().unwrap_or(0);
2194        let mut values = SmallVec::new();
2195        values.try_reserve(len).map_err(B::Error::custom)?;
2196
2197        while let Some(value) = seq.next_element()? {
2198            values.push(value);
2199        }
2200
2201        Ok(values)
2202    }
2203}
2204
2205#[cfg(feature = "malloc_size_of")]
2206impl<A: Array> MallocShallowSizeOf for SmallVec<A> {
2207    fn shallow_size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
2208        if self.spilled() {
2209            unsafe { ops.malloc_size_of(self.as_ptr()) }
2210        } else {
2211            0
2212        }
2213    }
2214}
2215
2216#[cfg(feature = "malloc_size_of")]
2217impl<A> MallocSizeOf for SmallVec<A>
2218where
2219    A: Array,
2220    A::Item: MallocSizeOf,
2221{
2222    fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
2223        let mut n = self.shallow_size_of(ops);
2224        for elem in self.iter() {
2225            n += elem.size_of(ops);
2226        }
2227        n
2228    }
2229}
2230
2231#[cfg(feature = "specialization")]
2232trait SpecFrom<A: Array, S> {
2233    fn spec_from(slice: S) -> SmallVec<A>;
2234}
2235
2236#[cfg(feature = "specialization")]
2237mod specialization;
2238
2239#[cfg(feature = "arbitrary")]
2240mod arbitrary;
2241
2242#[cfg(feature = "specialization")]
2243impl<'a, A: Array> SpecFrom<A, &'a [A::Item]> for SmallVec<A>
2244where
2245    A::Item: Copy,
2246{
2247    #[inline]
2248    fn spec_from(slice: &'a [A::Item]) -> SmallVec<A> {
2249        SmallVec::from_slice(slice)
2250    }
2251}
2252
2253impl<'a, A: Array> From<&'a [A::Item]> for SmallVec<A>
2254where
2255    A::Item: Clone,
2256{
2257    #[cfg(not(feature = "specialization"))]
2258    #[inline]
2259    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2260        slice.iter().cloned().collect()
2261    }
2262
2263    #[cfg(feature = "specialization")]
2264    #[inline]
2265    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2266        SmallVec::spec_from(slice)
2267    }
2268}
2269
2270impl<A: Array> From<Vec<A::Item>> for SmallVec<A> {
2271    #[inline]
2272    fn from(vec: Vec<A::Item>) -> SmallVec<A> {
2273        SmallVec::from_vec(vec)
2274    }
2275}
2276
2277impl<A: Array> From<A> for SmallVec<A> {
2278    #[inline]
2279    fn from(array: A) -> SmallVec<A> {
2280        SmallVec::from_buf(array)
2281    }
2282}
2283
2284impl<A: Array, I: SliceIndex<[A::Item]>> ops::Index<I> for SmallVec<A> {
2285    type Output = I::Output;
2286
2287    fn index(&self, index: I) -> &I::Output {
2288        &(**self)[index]
2289    }
2290}
2291
2292impl<A: Array, I: SliceIndex<[A::Item]>> ops::IndexMut<I> for SmallVec<A> {
2293    fn index_mut(&mut self, index: I) -> &mut I::Output {
2294        &mut (&mut **self)[index]
2295    }
2296}
2297
2298#[allow(deprecated)]
2299impl<A: Array> ExtendFromSlice<A::Item> for SmallVec<A>
2300where
2301    A::Item: Copy,
2302{
2303    fn extend_from_slice(&mut self, other: &[A::Item]) {
2304        SmallVec::extend_from_slice(self, other)
2305    }
2306}
2307
2308impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
2309    #[inline]
2310    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2311        let mut v = SmallVec::new();
2312        v.extend(iterable);
2313        v
2314    }
2315}
2316
2317impl<A: Array> Extend<A::Item> for SmallVec<A> {
2318    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2319        let mut iter = iterable.into_iter();
2320        let (lower_size_bound, _) = iter.size_hint();
2321        self.reserve(lower_size_bound);
2322
2323        unsafe {
2324            let (ptr, len_ptr, cap) = self.triple_mut();
2325            let ptr = ptr.as_ptr();
2326            let mut len = SetLenOnDrop::new(len_ptr);
2327            while len.get() < cap {
2328                if let Some(out) = iter.next() {
2329                    ptr::write(ptr.add(len.get()), out);
2330                    len.increment_len(1);
2331                } else {
2332                    return;
2333                }
2334            }
2335        }
2336
2337        for elem in iter {
2338            self.push(elem);
2339        }
2340    }
2341}
2342
2343impl<A: Array> fmt::Debug for SmallVec<A>
2344where
2345    A::Item: fmt::Debug,
2346{
2347    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2348        f.debug_list().entries(self.iter()).finish()
2349    }
2350}
2351
2352impl<A: Array> Default for SmallVec<A> {
2353    #[inline]
2354    fn default() -> SmallVec<A> {
2355        SmallVec::new()
2356    }
2357}
2358
2359#[cfg(feature = "may_dangle")]
2360unsafe impl<#[may_dangle] A: Array> Drop for SmallVec<A> {
2361    fn drop(&mut self) {
2362        unsafe {
2363            if self.spilled() {
2364                let (ptr, &mut len) = self.data.heap_mut();
2365                Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity);
2366            } else {
2367                ptr::drop_in_place(&mut self[..]);
2368            }
2369        }
2370    }
2371}
2372
2373#[cfg(not(feature = "may_dangle"))]
2374impl<A: Array> Drop for SmallVec<A> {
2375    fn drop(&mut self) {
2376        unsafe {
2377            if self.spilled() {
2378                let (ptr, &mut len) = self.data.heap_mut();
2379                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2380            } else {
2381                ptr::drop_in_place(&mut self[..]);
2382            }
2383        }
2384    }
2385}
2386
2387impl<A: Array> Clone for SmallVec<A>
2388where
2389    A::Item: Clone,
2390{
2391    #[inline]
2392    fn clone(&self) -> SmallVec<A> {
2393        SmallVec::from(self.as_slice())
2394    }
2395
2396    fn clone_from(&mut self, source: &Self) {
2397        // Inspired from `impl Clone for Vec`.
2398
2399        // drop anything that will not be overwritten
2400        self.truncate(source.len());
2401
2402        // self.len <= other.len due to the truncate above, so the
2403        // slices here are always in-bounds.
2404        let (init, tail) = source.split_at(self.len());
2405
2406        // reuse the contained values' allocations/resources.
2407        self.clone_from_slice(init);
2408        self.extend(tail.iter().cloned());
2409    }
2410}
2411
2412impl<A: Array, B: Array> PartialEq<SmallVec<B>> for SmallVec<A>
2413where
2414    A::Item: PartialEq<B::Item>,
2415{
2416    #[inline]
2417    fn eq(&self, other: &SmallVec<B>) -> bool {
2418        self[..] == other[..]
2419    }
2420}
2421
2422impl<A: Array> Eq for SmallVec<A> where A::Item: Eq {}
2423
2424impl<A: Array> PartialOrd for SmallVec<A>
2425where
2426    A::Item: PartialOrd,
2427{
2428    #[inline]
2429    fn partial_cmp(&self, other: &SmallVec<A>) -> Option<cmp::Ordering> {
2430        PartialOrd::partial_cmp(&**self, &**other)
2431    }
2432}
2433
2434impl<A: Array> Ord for SmallVec<A>
2435where
2436    A::Item: Ord,
2437{
2438    #[inline]
2439    fn cmp(&self, other: &SmallVec<A>) -> cmp::Ordering {
2440        Ord::cmp(&**self, &**other)
2441    }
2442}
2443
2444impl<A: Array> Hash for SmallVec<A>
2445where
2446    A::Item: Hash,
2447{
2448    fn hash<H: Hasher>(&self, state: &mut H) {
2449        (**self).hash(state)
2450    }
2451}
2452
2453unsafe impl<A: Array> Send for SmallVec<A> where A::Item: Send {}
2454
2455/// An iterator that consumes a `SmallVec` and yields its items by value.
2456///
2457/// Returned from [`SmallVec::into_iter`][1].
2458///
2459/// [1]: struct.SmallVec.html#method.into_iter
2460pub struct IntoIter<A: Array> {
2461    data: SmallVec<A>,
2462    current: usize,
2463    end: usize,
2464}
2465
2466impl<A: Array> fmt::Debug for IntoIter<A>
2467where
2468    A::Item: fmt::Debug,
2469{
2470    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2471        f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
2472    }
2473}
2474
2475impl<A: Array + Clone> Clone for IntoIter<A>
2476where
2477    A::Item: Clone,
2478{
2479    fn clone(&self) -> IntoIter<A> {
2480        SmallVec::from(self.as_slice()).into_iter()
2481    }
2482}
2483
2484impl<A: Array> Drop for IntoIter<A> {
2485    fn drop(&mut self) {
2486        for _ in self {}
2487    }
2488}
2489
2490impl<A: Array> Iterator for IntoIter<A> {
2491    type Item = A::Item;
2492
2493    #[inline]
2494    fn next(&mut self) -> Option<A::Item> {
2495        if self.current == self.end {
2496            None
2497        } else {
2498            unsafe {
2499                let current = self.current;
2500                self.current += 1;
2501                Some(ptr::read(self.data.as_ptr().add(current)))
2502            }
2503        }
2504    }
2505
2506    #[inline]
2507    fn size_hint(&self) -> (usize, Option<usize>) {
2508        let size = self.end - self.current;
2509        (size, Some(size))
2510    }
2511}
2512
2513impl<A: Array> DoubleEndedIterator for IntoIter<A> {
2514    #[inline]
2515    fn next_back(&mut self) -> Option<A::Item> {
2516        if self.current == self.end {
2517            None
2518        } else {
2519            unsafe {
2520                self.end -= 1;
2521                Some(ptr::read(self.data.as_ptr().add(self.end)))
2522            }
2523        }
2524    }
2525}
2526
2527impl<A: Array> ExactSizeIterator for IntoIter<A> {}
2528impl<A: Array> FusedIterator for IntoIter<A> {}
2529
2530impl<A: Array> IntoIter<A> {
2531    /// Returns the remaining items of this iterator as a slice.
2532    pub fn as_slice(&self) -> &[A::Item] {
2533        let len = self.end - self.current;
2534        unsafe { core::slice::from_raw_parts(self.data.as_ptr().add(self.current), len) }
2535    }
2536
2537    /// Returns the remaining items of this iterator as a mutable slice.
2538    pub fn as_mut_slice(&mut self) -> &mut [A::Item] {
2539        let len = self.end - self.current;
2540        unsafe { core::slice::from_raw_parts_mut(self.data.as_mut_ptr().add(self.current), len) }
2541    }
2542}
2543
2544impl<A: Array> IntoIterator for SmallVec<A> {
2545    type IntoIter = IntoIter<A>;
2546    type Item = A::Item;
2547    fn into_iter(mut self) -> Self::IntoIter {
2548        unsafe {
2549            // Set SmallVec len to zero as `IntoIter` drop handles dropping of
2550            // the elements
2551            let len = self.len();
2552            self.set_len(0);
2553            IntoIter {
2554                data: self,
2555                current: 0,
2556                end: len,
2557            }
2558        }
2559    }
2560}
2561
2562impl<'a, A: Array> IntoIterator for &'a SmallVec<A> {
2563    type IntoIter = slice::Iter<'a, A::Item>;
2564    type Item = &'a A::Item;
2565    fn into_iter(self) -> Self::IntoIter {
2566        self.iter()
2567    }
2568}
2569
2570impl<'a, A: Array> IntoIterator for &'a mut SmallVec<A> {
2571    type IntoIter = slice::IterMut<'a, A::Item>;
2572    type Item = &'a mut A::Item;
2573    fn into_iter(self) -> Self::IntoIter {
2574        self.iter_mut()
2575    }
2576}
2577
2578/// Types that can be used as the backing store for a [`SmallVec`].
2579pub unsafe trait Array {
2580    /// The type of the array's elements.
2581    type Item;
2582    /// Returns the number of items the array can hold.
2583    fn size() -> usize;
2584}
2585
2586/// Set the length of the vec when the `SetLenOnDrop` value goes out of scope.
2587///
2588/// Copied from <https://github.com/rust-lang/rust/pull/36355>
2589struct SetLenOnDrop<'a> {
2590    len: &'a mut usize,
2591    local_len: usize,
2592}
2593
2594impl<'a> SetLenOnDrop<'a> {
2595    #[inline]
2596    fn new(len: &'a mut usize) -> Self {
2597        SetLenOnDrop {
2598            local_len: *len,
2599            len,
2600        }
2601    }
2602
2603    #[inline]
2604    fn get(&self) -> usize {
2605        self.local_len
2606    }
2607
2608    #[inline]
2609    fn increment_len(&mut self, increment: usize) {
2610        self.local_len += increment;
2611    }
2612}
2613
2614impl<'a> Drop for SetLenOnDrop<'a> {
2615    #[inline]
2616    fn drop(&mut self) {
2617        *self.len = self.local_len;
2618    }
2619}
2620
2621#[cfg(feature = "const_new")]
2622impl<T, const N: usize> SmallVec<[T; N]> {
2623    /// Construct an empty vector.
2624    ///
2625    /// This is a `const` version of [`SmallVec::new`] that is enabled by the
2626    /// feature `const_new`, with the limitation that it only works for arrays.
2627    #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2628    #[inline]
2629    pub const fn new_const() -> Self {
2630        SmallVec {
2631            capacity: 0,
2632            data: SmallVecData::from_const(MaybeUninit::uninit()),
2633            _marker: PhantomData,
2634        }
2635    }
2636
2637    /// The array passed as an argument is moved to be an inline version of
2638    /// `SmallVec`.
2639    ///
2640    /// This is a `const` version of [`SmallVec::from_buf`] that is enabled by
2641    /// the feature `const_new`, with the limitation that it only works for
2642    /// arrays.
2643    #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2644    #[inline]
2645    pub const fn from_const(items: [T; N]) -> Self {
2646        SmallVec {
2647            capacity: N,
2648            data: SmallVecData::from_const(MaybeUninit::new(items)),
2649            _marker: PhantomData,
2650        }
2651    }
2652
2653    /// Constructs a new `SmallVec` on the stack from an array without
2654    /// copying elements. Also sets the length. The user is responsible
2655    /// for ensuring that `len <= N`.
2656    ///
2657    /// This is a `const` version of [`SmallVec::from_buf_and_len_unchecked`]
2658    /// that is enabled by the feature `const_new`, with the limitation that it
2659    /// only works for arrays.
2660    #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2661    #[inline]
2662    pub const unsafe fn from_const_with_len_unchecked(items: [T; N], len: usize) -> Self {
2663        SmallVec {
2664            capacity: len,
2665            data: SmallVecData::from_const(MaybeUninit::new(items)),
2666            _marker: PhantomData,
2667        }
2668    }
2669}
2670
2671#[cfg(feature = "const_generics")]
2672#[cfg_attr(docsrs, doc(cfg(feature = "const_generics")))]
2673unsafe impl<T, const N: usize> Array for [T; N] {
2674    type Item = T;
2675    #[inline]
2676    fn size() -> usize {
2677        N
2678    }
2679}
2680
2681#[cfg(not(feature = "const_generics"))]
2682macro_rules! impl_array(
2683    ($($size:expr),+) => {
2684        $(
2685            unsafe impl<T> Array for [T; $size] {
2686                type Item = T;
2687                #[inline]
2688                fn size() -> usize { $size }
2689            }
2690        )+
2691    }
2692);
2693
2694#[cfg(not(feature = "const_generics"))]
2695impl_array!(
2696    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2697    26, 27, 28, 29, 30, 31, 32, 36, 0x40, 0x60, 0x80, 0x100, 0x200, 0x400, 0x600, 0x800, 0x1000,
2698    0x2000, 0x4000, 0x6000, 0x8000, 0x10000, 0x20000, 0x40000, 0x60000, 0x80000, 0x10_0000
2699);
2700
2701/// Convenience trait for constructing a `SmallVec`
2702pub trait ToSmallVec<A: Array> {
2703    /// Construct a new `SmallVec` from a slice.
2704    fn to_smallvec(&self) -> SmallVec<A>;
2705}
2706
2707impl<A: Array> ToSmallVec<A> for [A::Item]
2708where
2709    A::Item: Copy,
2710{
2711    #[inline]
2712    fn to_smallvec(&self) -> SmallVec<A> {
2713        SmallVec::from_slice(self)
2714    }
2715}
2716
2717// Immutable counterpart for `NonNull<T>`.
2718#[repr(transparent)]
2719struct ConstNonNull<T>(NonNull<T>);
2720
2721impl<T> ConstNonNull<T> {
2722    #[inline]
2723    fn new(ptr: *const T) -> Option<Self> {
2724        NonNull::new(ptr as *mut T).map(Self)
2725    }
2726    #[inline]
2727    fn as_ptr(self) -> *const T {
2728        self.0.as_ptr()
2729    }
2730}
2731
2732impl<T> Clone for ConstNonNull<T> {
2733    #[inline]
2734    fn clone(&self) -> Self {
2735        *self
2736    }
2737}
2738
2739impl<T> Copy for ConstNonNull<T> {}
2740
2741#[cfg(feature = "impl_bincode")]
2742use bincode::{
2743    de::{read::Reader, BorrowDecoder, Decode, Decoder},
2744    enc::{write::Writer, Encode, Encoder},
2745    error::{DecodeError, EncodeError},
2746    BorrowDecode,
2747};
2748
2749#[cfg(feature = "impl_bincode")]
2750impl<A, Context> Decode<Context> for SmallVec<A>
2751where
2752    A: Array,
2753    A::Item: Decode<Context>,
2754{
2755    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
2756        use core::convert::TryInto;
2757        let len = u64::decode(decoder)?;
2758        let len = len
2759            .try_into()
2760            .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
2761        decoder.claim_container_read::<A::Item>(len)?;
2762
2763        let mut vec = SmallVec::with_capacity(len);
2764        if unty::type_equal::<A::Item, u8>() {
2765            // Initialize the smallvec's buffer.  Note that we need to do this
2766            // through the raw pointer as we cannot name the type
2767            // [u8; N] even though A::Item is u8.
2768            let ptr = vec.as_mut_ptr();
2769            // SAFETY: A::Item is u8 and the smallvec has been allocated with
2770            // enough capacity
2771            unsafe {
2772                core::ptr::write_bytes(ptr, 0, len);
2773                vec.set_len(len);
2774            }
2775            // Read the data into the smallvec's buffer.
2776            let slice = vec.as_mut_slice();
2777            // SAFETY: A::Item is u8
2778            let slice = unsafe { core::mem::transmute::<&mut [A::Item], &mut [u8]>(slice) };
2779            decoder.reader().read(slice)?;
2780        } else {
2781            for _ in 0..len {
2782                decoder.unclaim_bytes_read(core::mem::size_of::<A::Item>());
2783                vec.push(A::Item::decode(decoder)?);
2784            }
2785        }
2786        Ok(vec)
2787    }
2788}
2789
2790#[cfg(feature = "impl_bincode")]
2791impl<'de, A, Context> BorrowDecode<'de, Context> for SmallVec<A>
2792where
2793    A: Array,
2794    A::Item: BorrowDecode<'de, Context>,
2795{
2796    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
2797        decoder: &mut D,
2798    ) -> Result<Self, DecodeError> {
2799        use core::convert::TryInto;
2800        let len = u64::decode(decoder)?;
2801        let len = len
2802            .try_into()
2803            .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
2804        decoder.claim_container_read::<A::Item>(len)?;
2805
2806        let mut vec = SmallVec::with_capacity(len);
2807        if unty::type_equal::<A::Item, u8>() {
2808            // Initialize the smallvec's buffer.  Note that we need to do this
2809            // through the raw pointer as we cannot name the type
2810            // [u8; N] even though A::Item is u8.
2811            let ptr = vec.as_mut_ptr();
2812            // SAFETY: A::Item is u8 and the smallvec has been allocated with
2813            // enough capacity
2814            unsafe {
2815                core::ptr::write_bytes(ptr, 0, len);
2816                vec.set_len(len);
2817            }
2818            // Read the data into the smallvec's buffer.
2819            let slice = vec.as_mut_slice();
2820            // SAFETY: A::Item is u8
2821            let slice = unsafe { core::mem::transmute::<&mut [A::Item], &mut [u8]>(slice) };
2822            decoder.reader().read(slice)?;
2823        } else {
2824            for _ in 0..len {
2825                decoder.unclaim_bytes_read(core::mem::size_of::<A::Item>());
2826                vec.push(A::Item::borrow_decode(decoder)?);
2827            }
2828        }
2829        Ok(vec)
2830    }
2831}
2832
2833#[cfg(feature = "impl_bincode")]
2834impl<A> Encode for SmallVec<A>
2835where
2836    A: Array,
2837    A::Item: Encode,
2838{
2839    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
2840        (self.len() as u64).encode(encoder)?;
2841        if unty::type_equal::<A::Item, u8>() {
2842            // Safety: A::Item is u8
2843            let slice: &[u8] = unsafe { core::mem::transmute(self.as_slice()) };
2844            encoder.writer().write(slice)?;
2845        } else {
2846            for item in self.iter() {
2847                item.encode(encoder)?;
2848            }
2849        }
2850        Ok(())
2851    }
2852}