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