Coverage Report

Created: 2025-12-31 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.15.1/src/lib.rs
Line
Count
Source
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)]
105
pub extern crate alloc;
106
107
#[cfg(any(test, feature = "write"))]
108
extern crate std;
109
110
#[cfg(test)]
111
mod tests;
112
113
#[allow(deprecated)]
114
use alloc::alloc::{Layout, LayoutErr};
115
use alloc::boxed::Box;
116
use alloc::{vec, vec::Vec};
117
use core::borrow::{Borrow, BorrowMut};
118
use core::cmp;
119
use core::fmt;
120
use core::hash::{Hash, Hasher};
121
use core::hint::unreachable_unchecked;
122
use core::iter::{repeat, FromIterator, FusedIterator, IntoIterator};
123
use core::mem;
124
use core::mem::MaybeUninit;
125
use core::ops::{self, Range, RangeBounds};
126
use core::ptr::{self, NonNull};
127
use core::slice::{self, SliceIndex};
128
129
#[cfg(feature = "malloc_size_of")]
130
use malloc_size_of::{MallocShallowSizeOf, MallocSizeOf, MallocSizeOfOps};
131
132
#[cfg(feature = "serde")]
133
use serde::{
134
    de::{Deserialize, Deserializer, SeqAccess, Visitor},
135
    ser::{Serialize, SerializeSeq, Serializer},
136
};
137
138
#[cfg(feature = "serde")]
139
use core::marker::PhantomData;
140
141
#[cfg(feature = "write")]
142
use std::io;
143
144
#[cfg(feature = "drain_keep_rest")]
145
use 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]
184
macro_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]
237
macro_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"))]
251
macro_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]
285
pub 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)]
291
impl<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)]
299
pub 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
309
impl 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)]
316
impl From<LayoutErr> for CollectionAllocErr {
317
    fn from(_: LayoutErr) -> Self {
318
        CollectionAllocErr::CapacityOverflow
319
    }
320
}
321
322
18.2M
fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
323
0
    match result {
324
18.2M
        Ok(x) => x,
325
0
        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
326
0
        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
327
    }
328
18.2M
}
smallvec::infallible::<()>
Line
Count
Source
322
3.59k
fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
323
0
    match result {
324
3.59k
        Ok(x) => x,
325
0
        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
326
0
        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
327
    }
328
3.59k
}
smallvec::infallible::<()>
Line
Count
Source
322
18.1M
fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
323
0
    match result {
324
18.1M
        Ok(x) => x,
325
0
        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
326
0
        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
327
    }
328
18.1M
}
smallvec::infallible::<()>
Line
Count
Source
322
143k
fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
323
0
    match result {
324
143k
        Ok(x) => x,
325
0
        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
326
0
        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
327
    }
328
143k
}
smallvec::infallible::<()>
Line
Count
Source
322
2.36k
fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
323
0
    match result {
324
2.36k
        Ok(x) => x,
325
0
        Err(CollectionAllocErr::CapacityOverflow) => panic!("capacity overflow"),
326
0
        Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
327
    }
328
2.36k
}
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>
332
297k
fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
333
297k
    let size = mem::size_of::<T>()
334
297k
        .checked_mul(n)
335
297k
        .ok_or(CollectionAllocErr::CapacityOverflow)?;
336
297k
    let align = mem::align_of::<T>();
337
297k
    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
338
297k
}
smallvec::layout_array::<quiche::frame::Frame>
Line
Count
Source
332
1.83k
fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
333
1.83k
    let size = mem::size_of::<T>()
334
1.83k
        .checked_mul(n)
335
1.83k
        .ok_or(CollectionAllocErr::CapacityOverflow)?;
336
1.83k
    let align = mem::align_of::<T>();
337
1.83k
    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
338
1.83k
}
Unexecuted instantiation: smallvec::layout_array::<(u64, u64)>
Unexecuted instantiation: smallvec::layout_array::<u64>
smallvec::layout_array::<quiche::frame::Frame>
Line
Count
Source
332
251k
fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
333
251k
    let size = mem::size_of::<T>()
334
251k
        .checked_mul(n)
335
251k
        .ok_or(CollectionAllocErr::CapacityOverflow)?;
336
251k
    let align = mem::align_of::<T>();
337
251k
    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
338
251k
}
Unexecuted instantiation: smallvec::layout_array::<(u64, u64)>
Unexecuted instantiation: smallvec::layout_array::<u64>
smallvec::layout_array::<quiche::frame::Frame>
Line
Count
Source
332
43.0k
fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
333
43.0k
    let size = mem::size_of::<T>()
334
43.0k
        .checked_mul(n)
335
43.0k
        .ok_or(CollectionAllocErr::CapacityOverflow)?;
336
43.0k
    let align = mem::align_of::<T>();
337
43.0k
    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
338
43.0k
}
Unexecuted instantiation: smallvec::layout_array::<(u64, usize)>
Unexecuted instantiation: smallvec::layout_array::<(u64, u64)>
Unexecuted instantiation: smallvec::layout_array::<u64>
smallvec::layout_array::<quiche::frame::Frame>
Line
Count
Source
332
1.43k
fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
333
1.43k
    let size = mem::size_of::<T>()
334
1.43k
        .checked_mul(n)
335
1.43k
        .ok_or(CollectionAllocErr::CapacityOverflow)?;
336
1.43k
    let align = mem::align_of::<T>();
337
1.43k
    Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
338
1.43k
}
Unexecuted instantiation: smallvec::layout_array::<(u64, u64)>
Unexecuted instantiation: smallvec::layout_array::<u64>
339
340
0
unsafe fn deallocate<T>(ptr: NonNull<T>, capacity: usize) {
341
    // This unwrap should succeed since the same did when allocating.
342
0
    let layout = layout_array::<T>(capacity).unwrap();
343
0
    alloc::alloc::dealloc(ptr.as_ptr() as *mut u8, layout)
344
0
}
Unexecuted instantiation: smallvec::deallocate::<quiche::frame::Frame>
Unexecuted instantiation: smallvec::deallocate::<(u64, u64)>
Unexecuted instantiation: smallvec::deallocate::<u64>
Unexecuted instantiation: smallvec::deallocate::<quiche::frame::Frame>
Unexecuted instantiation: smallvec::deallocate::<(u64, u64)>
Unexecuted instantiation: smallvec::deallocate::<u64>
Unexecuted instantiation: smallvec::deallocate::<quiche::frame::Frame>
Unexecuted instantiation: smallvec::deallocate::<(u64, usize)>
Unexecuted instantiation: smallvec::deallocate::<(u64, u64)>
Unexecuted instantiation: smallvec::deallocate::<u64>
Unexecuted instantiation: smallvec::deallocate::<quiche::frame::Frame>
Unexecuted instantiation: smallvec::deallocate::<(u64, u64)>
Unexecuted instantiation: smallvec::deallocate::<u64>
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
351
pub 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
358
impl<'a, T: 'a + Array> fmt::Debug for Drain<'a, T>
359
where
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
367
unsafe impl<'a, T: Sync + Array> Sync for Drain<'a, T> {}
368
unsafe impl<'a, T: Send + Array> Send for Drain<'a, T> {}
369
370
impl<'a, T: 'a + Array> Iterator for Drain<'a, T> {
371
    type Item = T::Item;
372
373
    #[inline]
374
759k
    fn next(&mut self) -> Option<T::Item> {
375
759k
        self.iter
376
759k
            .next()
377
759k
            .map(|reference| unsafe { ptr::read(reference) })
378
759k
    }
379
380
    #[inline]
381
11.2k
    fn size_hint(&self) -> (usize, Option<usize>) {
382
11.2k
        self.iter.size_hint()
383
11.2k
    }
384
}
385
386
impl<'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
395
impl<'a, T: Array> ExactSizeIterator for Drain<'a, T> {
396
    #[inline]
397
    fn len(&self) -> usize {
398
        self.iter.len()
399
    }
400
}
401
402
impl<'a, T: Array> FusedIterator for Drain<'a, T> {}
403
404
impl<'a, T: 'a + Array> Drop for Drain<'a, T> {
405
233k
    fn drop(&mut self) {
406
233k
        self.for_each(drop);
407
408
233k
        if self.tail_len > 0 {
409
            unsafe {
410
0
                let source_vec = self.vec.as_mut();
411
412
                // memmove back untouched tail, update to new length
413
0
                let start = source_vec.len();
414
0
                let tail = self.tail_start;
415
0
                if tail != start {
416
0
                    // as_mut_ptr creates a &mut, invalidating other pointers.
417
0
                    // This pattern avoids calling it with a pointer already present.
418
0
                    let ptr = source_vec.as_mut_ptr();
419
0
                    let src = ptr.add(tail);
420
0
                    let dst = ptr.add(start);
421
0
                    ptr::copy(src, dst, self.tail_len);
422
0
                }
423
0
                source_vec.set_len(start + self.tail_len);
424
            }
425
233k
        }
426
233k
    }
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
435
pub struct DrainFilter<'a, T, F>
436
where
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")]
458
impl <T, F> fmt::Debug for DrainFilter<'_, T, F>
459
where
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")]
470
impl <T, F> Iterator for DrainFilter<'_, T, F>
471
where
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")]
510
impl <T, F> Drop for DrainFilter<'_, T, F>
511
where
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")]
561
impl <T, F> DrainFilter<'_, T, F>
562
where
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")]
622
union 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"))]
628
impl<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")]
639
impl<A: Array> SmallVecData<A> {
640
    #[inline]
641
52.2M
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
52.2M
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
52.2M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline
Line
Count
Source
641
6.77k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
6.77k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
6.77k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline
Line
Count
Source
641
1.72k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
1.72k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
1.72k
    }
<smallvec::SmallVecData<[u64; 8]>>::inline
Line
Count
Source
641
764
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
764
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
764
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::inline
Line
Count
Source
641
7.85k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
7.85k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
7.85k
    }
<smallvec::SmallVecData<[u64; 8]>>::inline
Line
Count
Source
641
23.7M
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
23.7M
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
23.7M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline
Line
Count
Source
641
23.8M
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
23.8M
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
23.8M
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::inline
Line
Count
Source
641
34.8k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
34.8k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
34.8k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline
Line
Count
Source
641
53.0k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
53.0k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
53.0k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline
Line
Count
Source
641
3.86M
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
3.86M
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
3.86M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline
Line
Count
Source
641
711k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
711k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
711k
    }
<smallvec::SmallVecData<[u64; 8]>>::inline
Line
Count
Source
641
43.0k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
43.0k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::inline
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::inline
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline
Line
Count
Source
641
3.68k
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
3.68k
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
3.68k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline
Line
Count
Source
641
930
    unsafe fn inline(&self) -> ConstNonNull<A::Item> {
642
930
        ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
643
930
    }
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::inline
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::inline
644
    #[inline]
645
75.2M
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
75.2M
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
75.2M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
13.8k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
13.8k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
13.8k
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::inline_mut
Line
Count
Source
645
14.2k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
14.2k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
14.2k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
327k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
327k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
327k
    }
<smallvec::SmallVecData<[u64; 8]>>::inline_mut
Line
Count
Source
645
2.29k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
2.29k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
2.29k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
16.4M
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
16.4M
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
16.4M
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::inline_mut
Line
Count
Source
645
63.3k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
63.3k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
63.3k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
252k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
252k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
252k
    }
<smallvec::SmallVecData<[u64; 8]>>::inline_mut
Line
Count
Source
645
53.6M
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
53.6M
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
53.6M
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::inline_mut
Line
Count
Source
645
3.94k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
3.94k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
3.94k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
1.91M
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
1.91M
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
1.91M
    }
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::inline_mut
<smallvec::SmallVecData<[u64; 8]>>::inline_mut
Line
Count
Source
645
129k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
129k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
129k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
1.14M
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
1.14M
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
1.14M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
440k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
440k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
440k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
104k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
104k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
104k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
11.0k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
11.0k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
11.0k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::inline_mut
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
47.5k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
47.5k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
47.5k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::inline_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::inline_mut
Line
Count
Source
645
494k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
494k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
494k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::inline_mut
Line
Count
Source
645
175k
    unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
646
175k
        NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
647
175k
    }
648
    #[inline]
649
34.0M
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
34.0M
        SmallVecData {
651
34.0M
            inline: core::mem::ManuallyDrop::new(inline),
652
34.0M
        }
653
34.0M
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::from_inline
Line
Count
Source
649
7.11k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
7.11k
        SmallVecData {
651
7.11k
            inline: core::mem::ManuallyDrop::new(inline),
652
7.11k
        }
653
7.11k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_inline
Line
Count
Source
649
4.61k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
4.61k
        SmallVecData {
651
4.61k
            inline: core::mem::ManuallyDrop::new(inline),
652
4.61k
        }
653
4.61k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::from_inline
Line
Count
Source
649
1.36k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
1.36k
        SmallVecData {
651
1.36k
            inline: core::mem::ManuallyDrop::new(inline),
652
1.36k
        }
653
1.36k
    }
<smallvec::SmallVecData<[u64; 8]>>::from_inline
Line
Count
Source
649
764
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
764
        SmallVecData {
651
764
            inline: core::mem::ManuallyDrop::new(inline),
652
764
        }
653
764
    }
<smallvec::SmallVecData<[u64; 8]>>::from_inline
Line
Count
Source
649
17.8M
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
17.8M
        SmallVecData {
651
17.8M
            inline: core::mem::ManuallyDrop::new(inline),
652
17.8M
        }
653
17.8M
    }
<smallvec::SmallVecData<[(u64, usize); 1]>>::from_inline
Line
Count
Source
649
31.6k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
31.6k
        SmallVecData {
651
31.6k
            inline: core::mem::ManuallyDrop::new(inline),
652
31.6k
        }
653
31.6k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_inline
Line
Count
Source
649
14.8M
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
14.8M
        SmallVecData {
651
14.8M
            inline: core::mem::ManuallyDrop::new(inline),
652
14.8M
        }
653
14.8M
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::from_inline
Line
Count
Source
649
30.6k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
30.6k
        SmallVecData {
651
30.6k
            inline: core::mem::ManuallyDrop::new(inline),
652
30.6k
        }
653
30.6k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::from_inline
Line
Count
Source
649
1.01M
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
1.01M
        SmallVecData {
651
1.01M
            inline: core::mem::ManuallyDrop::new(inline),
652
1.01M
        }
653
1.01M
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_inline
Line
Count
Source
649
223k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
223k
        SmallVecData {
651
223k
            inline: core::mem::ManuallyDrop::new(inline),
652
223k
        }
653
223k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::from_inline
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::from_inline
<smallvec::SmallVecData<[u64; 8]>>::from_inline
Line
Count
Source
649
43.0k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
43.0k
        SmallVecData {
651
43.0k
            inline: core::mem::ManuallyDrop::new(inline),
652
43.0k
        }
653
43.0k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_inline
Line
Count
Source
649
3.68k
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
3.68k
        SmallVecData {
651
3.68k
            inline: core::mem::ManuallyDrop::new(inline),
652
3.68k
        }
653
3.68k
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::from_inline
Line
Count
Source
649
930
    fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
650
930
        SmallVecData {
651
930
            inline: core::mem::ManuallyDrop::new(inline),
652
930
        }
653
930
    }
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::from_inline
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::from_inline
654
    #[inline]
655
42.3k
    unsafe fn into_inline(self) -> MaybeUninit<A> {
656
42.3k
        core::mem::ManuallyDrop::into_inner(self.inline)
657
42.3k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::into_inline
<smallvec::SmallVecData<[(u64, u64); 4]>>::into_inline
Line
Count
Source
655
12
    unsafe fn into_inline(self) -> MaybeUninit<A> {
656
12
        core::mem::ManuallyDrop::into_inner(self.inline)
657
12
    }
<smallvec::SmallVecData<[(u64, u64); 4]>>::into_inline
Line
Count
Source
655
42.3k
    unsafe fn into_inline(self) -> MaybeUninit<A> {
656
42.3k
        core::mem::ManuallyDrop::into_inner(self.inline)
657
42.3k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::into_inline
658
    #[inline]
659
374k
    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
660
374k
        (ConstNonNull(self.heap.0), self.heap.1)
661
374k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap
Line
Count
Source
659
1.43k
    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
660
1.43k
        (ConstNonNull(self.heap.0), self.heap.1)
661
1.43k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap
Line
Count
Source
659
169k
    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
660
169k
        (ConstNonNull(self.heap.0), self.heap.1)
661
169k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap
Line
Count
Source
659
202k
    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
660
202k
        (ConstNonNull(self.heap.0), self.heap.1)
661
202k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap
Line
Count
Source
659
1.43k
    unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
660
1.43k
        (ConstNonNull(self.heap.0), self.heap.1)
661
1.43k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap
662
    #[inline]
663
794k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
794k
        let h = &mut self.heap;
665
794k
        (h.0, &mut h.1)
666
794k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
4.62k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
4.62k
        let h = &mut self.heap;
665
4.62k
        (h.0, &mut h.1)
666
4.62k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
494k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
494k
        let h = &mut self.heap;
665
494k
        (h.0, &mut h.1)
666
494k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
187k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
187k
        let h = &mut self.heap;
665
187k
        (h.0, &mut h.1)
666
187k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
39.1k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
39.1k
        let h = &mut self.heap;
665
39.1k
        (h.0, &mut h.1)
666
39.1k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
4.18k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
4.18k
        let h = &mut self.heap;
665
4.18k
        (h.0, &mut h.1)
666
4.18k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::heap_mut
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::heap_mut
Line
Count
Source
663
64.6k
    unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
664
64.6k
        let h = &mut self.heap;
665
64.6k
        (h.0, &mut h.1)
666
64.6k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::heap_mut
667
    #[inline]
668
227k
    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
669
227k
        SmallVecData { heap: (ptr, len) }
670
227k
    }
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_heap
Line
Count
Source
668
1.46k
    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
669
1.46k
        SmallVecData { heap: (ptr, len) }
670
1.46k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::from_heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_heap
Line
Count
Source
668
181k
    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
669
181k
        SmallVecData { heap: (ptr, len) }
670
181k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::from_heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_heap
Line
Count
Source
668
43.0k
    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
669
43.0k
        SmallVecData { heap: (ptr, len) }
670
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, usize); 1]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 1]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::from_heap
<smallvec::SmallVecData<[quiche::frame::Frame; 1]>>::from_heap
Line
Count
Source
668
1.43k
    fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
669
1.43k
        SmallVecData { heap: (ptr, len) }
670
1.43k
    }
Unexecuted instantiation: <smallvec::SmallVecData<[(u64, u64); 4]>>::from_heap
Unexecuted instantiation: <smallvec::SmallVecData<[u64; 8]>>::from_heap
671
}
672
673
#[cfg(not(feature = "union"))]
674
enum 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"))]
688
impl<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"))]
697
impl<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
743
unsafe impl<A: Array + Send> Send for SmallVecData<A> {}
744
unsafe 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
/// ```
772
pub 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
780
impl<A: Array> SmallVec<A> {
781
    /// Construct an empty vector
782
    #[inline]
783
34.0M
    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
34.0M
        assert!(
787
34.0M
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
34.0M
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
34.0M
        SmallVec {
791
34.0M
            capacity: 0,
792
34.0M
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
34.0M
        }
794
34.0M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::new
Line
Count
Source
783
4.61k
    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
4.61k
        assert!(
787
4.61k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
4.61k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
4.61k
        SmallVec {
791
4.61k
            capacity: 0,
792
4.61k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
4.61k
        }
794
4.61k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::new
Line
Count
Source
783
7.11k
    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
7.11k
        assert!(
787
7.11k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
7.11k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
7.11k
        SmallVec {
791
7.11k
            capacity: 0,
792
7.11k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
7.11k
        }
794
7.11k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::new
Line
Count
Source
783
1.36k
    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
1.36k
        assert!(
787
1.36k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
1.36k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
1.36k
        SmallVec {
791
1.36k
            capacity: 0,
792
1.36k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
1.36k
        }
794
1.36k
    }
<smallvec::SmallVec<[u64; 8]>>::new
Line
Count
Source
783
764
    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
764
        assert!(
787
764
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
764
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
764
        SmallVec {
791
764
            capacity: 0,
792
764
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
764
        }
794
764
    }
<smallvec::SmallVec<[u64; 8]>>::new
Line
Count
Source
783
17.8M
    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
17.8M
        assert!(
787
17.8M
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
17.8M
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
17.8M
        SmallVec {
791
17.8M
            capacity: 0,
792
17.8M
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
17.8M
        }
794
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::new
Line
Count
Source
783
14.8M
    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
14.8M
        assert!(
787
14.8M
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
14.8M
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
14.8M
        SmallVec {
791
14.8M
            capacity: 0,
792
14.8M
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
14.8M
        }
794
14.8M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::new
Line
Count
Source
783
31.6k
    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
31.6k
        assert!(
787
31.6k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
31.6k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
31.6k
        SmallVec {
791
31.6k
            capacity: 0,
792
31.6k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
31.6k
        }
794
31.6k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::new
Line
Count
Source
783
30.6k
    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
30.6k
        assert!(
787
30.6k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
30.6k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
30.6k
        SmallVec {
791
30.6k
            capacity: 0,
792
30.6k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
30.6k
        }
794
30.6k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::new
Line
Count
Source
783
1.01M
    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
1.01M
        assert!(
787
1.01M
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
1.01M
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
1.01M
        SmallVec {
791
1.01M
            capacity: 0,
792
1.01M
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
1.01M
        }
794
1.01M
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::new
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::new
Line
Count
Source
783
223k
    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
223k
        assert!(
787
223k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
223k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
223k
        SmallVec {
791
223k
            capacity: 0,
792
223k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
223k
        }
794
223k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::new
<smallvec::SmallVec<[u64; 8]>>::new
Line
Count
Source
783
43.0k
    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
43.0k
        assert!(
787
43.0k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
43.0k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
43.0k
        SmallVec {
791
43.0k
            capacity: 0,
792
43.0k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
43.0k
        }
794
43.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::new
Line
Count
Source
783
930
    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
930
        assert!(
787
930
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
930
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
930
        SmallVec {
791
930
            capacity: 0,
792
930
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
930
        }
794
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::new
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::new
Line
Count
Source
783
3.68k
    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
3.68k
        assert!(
787
3.68k
            mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
788
3.68k
                && mem::align_of::<A>() >= mem::align_of::<A::Item>()
789
        );
790
3.68k
        SmallVec {
791
3.68k
            capacity: 0,
792
3.68k
            data: SmallVecData::from_inline(MaybeUninit::uninit()),
793
3.68k
        }
794
3.68k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::new
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
373k
    pub unsafe fn set_len(&mut self, new_len: usize) {
924
373k
        let (_, len_ptr, _) = self.triple_mut();
925
373k
        *len_ptr = new_len;
926
373k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::set_len
Line
Count
Source
923
7.11k
    pub unsafe fn set_len(&mut self, new_len: usize) {
924
7.11k
        let (_, len_ptr, _) = self.triple_mut();
925
7.11k
        *len_ptr = new_len;
926
7.11k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::set_len
Line
Count
Source
923
31.6k
    pub unsafe fn set_len(&mut self, new_len: usize) {
924
31.6k
        let (_, len_ptr, _) = self.triple_mut();
925
31.6k
        *len_ptr = new_len;
926
31.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::set_len
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::set_len
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::set_len
Line
Count
Source
923
334k
    pub unsafe fn set_len(&mut self, new_len: usize) {
924
334k
        let (_, len_ptr, _) = self.triple_mut();
925
334k
        *len_ptr = new_len;
926
334k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::set_len
927
928
    /// The maximum number of elements this vector can hold inline
929
    #[inline]
930
290M
    fn inline_capacity() -> usize {
931
290M
        if mem::size_of::<A::Item>() > 0 {
932
290M
            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
0
            core::usize::MAX
945
        }
946
290M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
52.2k
    fn inline_capacity() -> usize {
931
52.2k
        if mem::size_of::<A::Item>() > 0 {
932
52.2k
            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
0
            core::usize::MAX
945
        }
946
52.2k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::inline_capacity
Line
Count
Source
930
51.3k
    fn inline_capacity() -> usize {
931
51.3k
        if mem::size_of::<A::Item>() > 0 {
932
51.3k
            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
0
            core::usize::MAX
945
        }
946
51.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
983k
    fn inline_capacity() -> usize {
931
983k
        if mem::size_of::<A::Item>() > 0 {
932
983k
            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
0
            core::usize::MAX
945
        }
946
983k
    }
<smallvec::SmallVec<[u64; 8]>>::inline_capacity
Line
Count
Source
930
6.87k
    fn inline_capacity() -> usize {
931
6.87k
        if mem::size_of::<A::Item>() > 0 {
932
6.87k
            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
0
            core::usize::MAX
945
        }
946
6.87k
    }
<smallvec::SmallVec<[u64; 8]>>::inline_capacity
Line
Count
Source
930
172M
    fn inline_capacity() -> usize {
931
172M
        if mem::size_of::<A::Item>() > 0 {
932
172M
            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
0
            core::usize::MAX
945
        }
946
172M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
94.7M
    fn inline_capacity() -> usize {
931
94.7M
        if mem::size_of::<A::Item>() > 0 {
932
94.7M
            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
0
            core::usize::MAX
945
        }
946
94.7M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::inline_capacity
Line
Count
Source
930
228k
    fn inline_capacity() -> usize {
931
228k
        if mem::size_of::<A::Item>() > 0 {
932
228k
            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
0
            core::usize::MAX
945
        }
946
228k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
802k
    fn inline_capacity() -> usize {
931
802k
        if mem::size_of::<A::Item>() > 0 {
932
802k
            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
0
            core::usize::MAX
945
        }
946
802k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
11.7M
    fn inline_capacity() -> usize {
931
11.7M
        if mem::size_of::<A::Item>() > 0 {
932
11.7M
            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
0
            core::usize::MAX
945
        }
946
11.7M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
4.75M
    fn inline_capacity() -> usize {
931
4.75M
        if mem::size_of::<A::Item>() > 0 {
932
4.75M
            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
0
            core::usize::MAX
945
        }
946
4.75M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::inline_capacity
Line
Count
Source
930
7.89k
    fn inline_capacity() -> usize {
931
7.89k
        if mem::size_of::<A::Item>() > 0 {
932
7.89k
            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
0
            core::usize::MAX
945
        }
946
7.89k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::inline_capacity
<smallvec::SmallVec<[u64; 8]>>::inline_capacity
Line
Count
Source
930
387k
    fn inline_capacity() -> usize {
931
387k
        if mem::size_of::<A::Item>() > 0 {
932
387k
            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
0
            core::usize::MAX
945
        }
946
387k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
1.36M
    fn inline_capacity() -> usize {
931
1.36M
        if mem::size_of::<A::Item>() > 0 {
932
1.36M
            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
0
            core::usize::MAX
945
        }
946
1.36M
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
313k
    fn inline_capacity() -> usize {
931
313k
        if mem::size_of::<A::Item>() > 0 {
932
313k
            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
0
            core::usize::MAX
945
        }
946
313k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
38.8k
    fn inline_capacity() -> usize {
931
38.8k
        if mem::size_of::<A::Item>() > 0 {
932
38.8k
            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
0
            core::usize::MAX
945
        }
946
38.8k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::inline_capacity
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
142k
    fn inline_capacity() -> usize {
931
142k
        if mem::size_of::<A::Item>() > 0 {
932
142k
            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
0
            core::usize::MAX
945
        }
946
142k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::inline_capacity
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::inline_capacity
Line
Count
Source
930
1.54M
    fn inline_capacity() -> usize {
931
1.54M
        if mem::size_of::<A::Item>() > 0 {
932
1.54M
            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
0
            core::usize::MAX
945
        }
946
1.54M
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::inline_capacity
Line
Count
Source
930
526k
    fn inline_capacity() -> usize {
931
526k
        if mem::size_of::<A::Item>() > 0 {
932
526k
            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
0
            core::usize::MAX
945
        }
946
526k
    }
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
26.4M
    pub fn len(&self) -> usize {
957
26.4M
        self.triple().1
958
26.4M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::len
Line
Count
Source
956
8.21k
    pub fn len(&self) -> usize {
957
8.21k
        self.triple().1
958
8.21k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::len
Line
Count
Source
956
7.11k
    pub fn len(&self) -> usize {
957
7.11k
        self.triple().1
958
7.11k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::len
Line
Count
Source
956
363
    pub fn len(&self) -> usize {
957
363
        self.triple().1
958
363
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::len
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::len
Line
Count
Source
956
24.0M
    pub fn len(&self) -> usize {
957
24.0M
        self.triple().1
958
24.0M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::len
Line
Count
Source
956
31.6k
    pub fn len(&self) -> usize {
957
31.6k
        self.triple().1
958
31.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::len
<smallvec::SmallVec<[(u64, u64); 4]>>::len
Line
Count
Source
956
24.0k
    pub fn len(&self) -> usize {
957
24.0k
        self.triple().1
958
24.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::len
Line
Count
Source
956
1.82M
    pub fn len(&self) -> usize {
957
1.82M
        self.triple().1
958
1.82M
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::len
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::len
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::len
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::len
Line
Count
Source
956
517k
    pub fn len(&self) -> usize {
957
517k
        self.triple().1
958
517k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::len
Line
Count
Source
956
5.12k
    pub fn len(&self) -> usize {
957
5.12k
        self.triple().1
958
5.12k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::len
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::len
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::len
959
960
    /// Returns `true` if the vector is empty
961
    #[inline]
962
24.0M
    pub fn is_empty(&self) -> bool {
963
24.0M
        self.len() == 0
964
24.0M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::is_empty
Line
Count
Source
962
6.74k
    pub fn is_empty(&self) -> bool {
963
6.74k
        self.len() == 0
964
6.74k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::is_empty
Line
Count
Source
962
23.8M
    pub fn is_empty(&self) -> bool {
963
23.8M
        self.len() == 0
964
23.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::is_empty
Line
Count
Source
962
139k
    pub fn is_empty(&self) -> bool {
963
139k
        self.len() == 0
964
139k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::is_empty
Line
Count
Source
962
3.68k
    pub fn is_empty(&self) -> bool {
963
3.68k
        self.len() == 0
964
3.68k
    }
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
52.6M
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
52.6M
            if self.spilled() {
978
374k
                let (ptr, len) = self.data.heap();
979
374k
                (ptr, len, self.capacity)
980
            } else {
981
52.2M
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
52.6M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple
Line
Count
Source
975
8.21k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
8.21k
            if self.spilled() {
978
1.43k
                let (ptr, len) = self.data.heap();
979
1.43k
                (ptr, len, self.capacity)
980
            } else {
981
6.77k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
8.21k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple
Line
Count
Source
975
1.72k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
1.72k
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
1.72k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
1.72k
    }
<smallvec::SmallVec<[u64; 8]>>::triple
Line
Count
Source
975
764
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
764
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
764
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
764
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::triple
Line
Count
Source
975
7.85k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
7.85k
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
7.85k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
7.85k
    }
<smallvec::SmallVec<[u64; 8]>>::triple
Line
Count
Source
975
23.7M
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
23.7M
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
23.7M
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
23.7M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple
Line
Count
Source
975
24.0M
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
24.0M
            if self.spilled() {
978
169k
                let (ptr, len) = self.data.heap();
979
169k
                (ptr, len, self.capacity)
980
            } else {
981
23.8M
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
24.0M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::triple
Line
Count
Source
975
34.8k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
34.8k
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
34.8k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
34.8k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple
Line
Count
Source
975
53.0k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
53.0k
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
53.0k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
53.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple
Line
Count
Source
975
3.86M
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
3.86M
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
3.86M
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
3.86M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple
Line
Count
Source
975
913k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
913k
            if self.spilled() {
978
202k
                let (ptr, len) = self.data.heap();
979
202k
                (ptr, len, self.capacity)
980
            } else {
981
711k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
913k
    }
<smallvec::SmallVec<[u64; 8]>>::triple
Line
Count
Source
975
43.0k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
43.0k
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
43.0k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::triple
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::triple
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple
Line
Count
Source
975
5.12k
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
5.12k
            if self.spilled() {
978
1.43k
                let (ptr, len) = self.data.heap();
979
1.43k
                (ptr, len, self.capacity)
980
            } else {
981
3.68k
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
5.12k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple
Line
Count
Source
975
930
    fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
976
        unsafe {
977
930
            if self.spilled() {
978
0
                let (ptr, len) = self.data.heap();
979
0
                (ptr, len, self.capacity)
980
            } else {
981
930
                (self.data.inline(), self.capacity, Self::inline_capacity())
982
            }
983
        }
984
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::triple
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::triple
985
986
    /// Returns a tuple with (data ptr, len ptr, capacity)
987
    #[inline]
988
75.6M
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
75.6M
            if self.spilled() {
991
408k
                let (ptr, len_ptr) = self.data.heap_mut();
992
408k
                (ptr, len_ptr, self.capacity)
993
            } else {
994
75.2M
                (
995
75.2M
                    self.data.inline_mut(),
996
75.2M
                    &mut self.capacity,
997
75.2M
                    Self::inline_capacity(),
998
75.2M
                )
999
            }
1000
        }
1001
75.6M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
15.9k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
15.9k
            if self.spilled() {
991
2.06k
                let (ptr, len_ptr) = self.data.heap_mut();
992
2.06k
                (ptr, len_ptr, self.capacity)
993
            } else {
994
13.8k
                (
995
13.8k
                    self.data.inline_mut(),
996
13.8k
                    &mut self.capacity,
997
13.8k
                    Self::inline_capacity(),
998
13.8k
                )
999
            }
1000
        }
1001
15.9k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::triple_mut
Line
Count
Source
988
14.2k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
14.2k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
14.2k
                (
995
14.2k
                    self.data.inline_mut(),
996
14.2k
                    &mut self.capacity,
997
14.2k
                    Self::inline_capacity(),
998
14.2k
                )
999
            }
1000
        }
1001
14.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
327k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
327k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
327k
                (
995
327k
                    self.data.inline_mut(),
996
327k
                    &mut self.capacity,
997
327k
                    Self::inline_capacity(),
998
327k
                )
999
            }
1000
        }
1001
327k
    }
<smallvec::SmallVec<[u64; 8]>>::triple_mut
Line
Count
Source
988
2.29k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
2.29k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
2.29k
                (
995
2.29k
                    self.data.inline_mut(),
996
2.29k
                    &mut self.capacity,
997
2.29k
                    Self::inline_capacity(),
998
2.29k
                )
999
            }
1000
        }
1001
2.29k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
16.7M
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
16.7M
            if self.spilled() {
991
312k
                let (ptr, len_ptr) = self.data.heap_mut();
992
312k
                (ptr, len_ptr, self.capacity)
993
            } else {
994
16.4M
                (
995
16.4M
                    self.data.inline_mut(),
996
16.4M
                    &mut self.capacity,
997
16.4M
                    Self::inline_capacity(),
998
16.4M
                )
999
            }
1000
        }
1001
16.7M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::triple_mut
Line
Count
Source
988
63.3k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
63.3k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
63.3k
                (
995
63.3k
                    self.data.inline_mut(),
996
63.3k
                    &mut self.capacity,
997
63.3k
                    Self::inline_capacity(),
998
63.3k
                )
999
            }
1000
        }
1001
63.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
252k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
252k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
252k
                (
995
252k
                    self.data.inline_mut(),
996
252k
                    &mut self.capacity,
997
252k
                    Self::inline_capacity(),
998
252k
                )
999
            }
1000
        }
1001
252k
    }
<smallvec::SmallVec<[u64; 8]>>::triple_mut
Line
Count
Source
988
53.6M
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
53.6M
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
53.6M
                (
995
53.6M
                    self.data.inline_mut(),
996
53.6M
                    &mut self.capacity,
997
53.6M
                    Self::inline_capacity(),
998
53.6M
                )
999
            }
1000
        }
1001
53.6M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::triple_mut
Line
Count
Source
988
3.94k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
3.94k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
3.94k
                (
995
3.94k
                    self.data.inline_mut(),
996
3.94k
                    &mut self.capacity,
997
3.94k
                    Self::inline_capacity(),
998
3.94k
                )
999
            }
1000
        }
1001
3.94k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
1.91M
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
1.91M
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
1.91M
                (
995
1.91M
                    self.data.inline_mut(),
996
1.91M
                    &mut self.capacity,
997
1.91M
                    Self::inline_capacity(),
998
1.91M
                )
999
            }
1000
        }
1001
1.91M
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::triple_mut
<smallvec::SmallVec<[u64; 8]>>::triple_mut
Line
Count
Source
988
129k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
129k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
129k
                (
995
129k
                    self.data.inline_mut(),
996
129k
                    &mut self.capacity,
997
129k
                    Self::inline_capacity(),
998
129k
                )
999
            }
1000
        }
1001
129k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
1.23M
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
1.23M
            if self.spilled() {
991
92.4k
                let (ptr, len_ptr) = self.data.heap_mut();
992
92.4k
                (ptr, len_ptr, self.capacity)
993
            } else {
994
1.14M
                (
995
1.14M
                    self.data.inline_mut(),
996
1.14M
                    &mut self.capacity,
997
1.14M
                    Self::inline_capacity(),
998
1.14M
                )
999
            }
1000
        }
1001
1.23M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
440k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
440k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
440k
                (
995
440k
                    self.data.inline_mut(),
996
440k
                    &mut self.capacity,
997
440k
                    Self::inline_capacity(),
998
440k
                )
999
            }
1000
        }
1001
440k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
104k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
104k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
104k
                (
995
104k
                    self.data.inline_mut(),
996
104k
                    &mut self.capacity,
997
104k
                    Self::inline_capacity(),
998
104k
                )
999
            }
1000
        }
1001
104k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
12.4k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
12.4k
            if self.spilled() {
991
1.43k
                let (ptr, len_ptr) = self.data.heap_mut();
992
1.43k
                (ptr, len_ptr, self.capacity)
993
            } else {
994
11.0k
                (
995
11.0k
                    self.data.inline_mut(),
996
11.0k
                    &mut self.capacity,
997
11.0k
                    Self::inline_capacity(),
998
11.0k
                )
999
            }
1000
        }
1001
12.4k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::triple_mut
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
47.5k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
47.5k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
47.5k
                (
995
47.5k
                    self.data.inline_mut(),
996
47.5k
                    &mut self.capacity,
997
47.5k
                    Self::inline_capacity(),
998
47.5k
                )
999
            }
1000
        }
1001
47.5k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::triple_mut
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::triple_mut
Line
Count
Source
988
494k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
494k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
494k
                (
995
494k
                    self.data.inline_mut(),
996
494k
                    &mut self.capacity,
997
494k
                    Self::inline_capacity(),
998
494k
                )
999
            }
1000
        }
1001
494k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::triple_mut
Line
Count
Source
988
175k
    fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
989
        unsafe {
990
175k
            if self.spilled() {
991
0
                let (ptr, len_ptr) = self.data.heap_mut();
992
0
                (ptr, len_ptr, self.capacity)
993
            } else {
994
175k
                (
995
175k
                    self.data.inline_mut(),
996
175k
                    &mut self.capacity,
997
175k
                    Self::inline_capacity(),
998
175k
                )
999
            }
1000
        }
1001
175k
    }
1002
1003
    /// Returns `true` if the data has spilled into a separate heap-allocated buffer.
1004
    #[inline]
1005
162M
    pub fn spilled(&self) -> bool {
1006
162M
        self.capacity > Self::inline_capacity()
1007
162M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
30.1k
    pub fn spilled(&self) -> bool {
1006
30.1k
        self.capacity > Self::inline_capacity()
1007
30.1k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::spilled
Line
Count
Source
1005
29.2k
    pub fn spilled(&self) -> bool {
1006
29.2k
        self.capacity > Self::inline_capacity()
1007
29.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
654k
    pub fn spilled(&self) -> bool {
1006
654k
        self.capacity > Self::inline_capacity()
1007
654k
    }
<smallvec::SmallVec<[u64; 8]>>::spilled
Line
Count
Source
1005
3.82k
    pub fn spilled(&self) -> bool {
1006
3.82k
        self.capacity > Self::inline_capacity()
1007
3.82k
    }
<smallvec::SmallVec<[u64; 8]>>::spilled
Line
Count
Source
1005
95.2M
    pub fn spilled(&self) -> bool {
1006
95.2M
        self.capacity > Self::inline_capacity()
1007
95.2M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
54.2M
    pub fn spilled(&self) -> bool {
1006
54.2M
        self.capacity > Self::inline_capacity()
1007
54.2M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::spilled
Line
Count
Source
1005
129k
    pub fn spilled(&self) -> bool {
1006
129k
        self.capacity > Self::inline_capacity()
1007
129k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
497k
    pub fn spilled(&self) -> bool {
1006
497k
        self.capacity > Self::inline_capacity()
1007
497k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
5.99M
    pub fn spilled(&self) -> bool {
1006
5.99M
        self.capacity > Self::inline_capacity()
1007
5.99M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
2.85M
    pub fn spilled(&self) -> bool {
1006
2.85M
        self.capacity > Self::inline_capacity()
1007
2.85M
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::spilled
Line
Count
Source
1005
3.94k
    pub fn spilled(&self) -> bool {
1006
3.94k
        self.capacity > Self::inline_capacity()
1007
3.94k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::spilled
<smallvec::SmallVec<[u64; 8]>>::spilled
Line
Count
Source
1005
215k
    pub fn spilled(&self) -> bool {
1006
215k
        self.capacity > Self::inline_capacity()
1007
215k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
920k
    pub fn spilled(&self) -> bool {
1006
920k
        self.capacity > Self::inline_capacity()
1007
920k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
208k
    pub fn spilled(&self) -> bool {
1006
208k
        self.capacity > Self::inline_capacity()
1007
208k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
22.6k
    pub fn spilled(&self) -> bool {
1006
22.6k
        self.capacity > Self::inline_capacity()
1007
22.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::spilled
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
94.1k
    pub fn spilled(&self) -> bool {
1006
94.1k
        self.capacity > Self::inline_capacity()
1007
94.1k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::spilled
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::spilled
Line
Count
Source
1005
1.05M
    pub fn spilled(&self) -> bool {
1006
1.05M
        self.capacity > Self::inline_capacity()
1007
1.05M
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::spilled
Line
Count
Source
1005
350k
    pub fn spilled(&self) -> bool {
1006
350k
        self.capacity > Self::inline_capacity()
1007
350k
    }
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
233k
    pub fn drain<R>(&mut self, range: R) -> Drain<'_, A>
1023
233k
    where
1024
233k
        R: RangeBounds<usize>,
1025
    {
1026
        use core::ops::Bound::*;
1027
1028
233k
        let len = self.len();
1029
233k
        let start = match range.start_bound() {
1030
0
            Included(&n) => n,
1031
0
            Excluded(&n) => n.checked_add(1).expect("Range start out of bounds"),
1032
233k
            Unbounded => 0,
1033
        };
1034
233k
        let end = match range.end_bound() {
1035
0
            Included(&n) => n.checked_add(1).expect("Range end out of bounds"),
1036
0
            Excluded(&n) => n,
1037
233k
            Unbounded => len,
1038
        };
1039
1040
233k
        assert!(start <= end);
1041
233k
        assert!(end <= len);
1042
1043
        unsafe {
1044
233k
            self.set_len(start);
1045
1046
233k
            let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
1047
1048
233k
            Drain {
1049
233k
                tail_start: end,
1050
233k
                tail_len: len - end,
1051
233k
                iter: range_slice.iter(),
1052
233k
                // Since self is a &mut, passing it to a function would invalidate the slice iterator.
1053
233k
                vec: NonNull::new_unchecked(self as *mut _),
1054
233k
            }
1055
        }
1056
233k
    }
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
2.53M
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
2.53M
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
2.53M
            if *len == cap {
1122
227k
                self.reserve_one_unchecked();
1123
227k
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
227k
                ptr = heap_ptr;
1125
227k
                len = heap_len;
1126
2.30M
            }
1127
2.53M
            ptr::write(ptr.as_ptr().add(*len), value);
1128
2.53M
            *len += 1;
1129
        }
1130
2.53M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::push
Line
Count
Source
1118
6.30k
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
6.30k
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
6.30k
            if *len == cap {
1122
1.46k
                self.reserve_one_unchecked();
1123
1.46k
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
1.46k
                ptr = heap_ptr;
1125
1.46k
                len = heap_len;
1126
4.84k
            }
1127
6.30k
            ptr::write(ptr.as_ptr().add(*len), value);
1128
6.30k
            *len += 1;
1129
        }
1130
6.30k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::push
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::push
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::push
Line
Count
Source
1118
1.72M
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
1.72M
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
1.72M
            if *len == cap {
1122
181k
                self.reserve_one_unchecked();
1123
181k
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
181k
                ptr = heap_ptr;
1125
181k
                len = heap_len;
1126
1.54M
            }
1127
1.72M
            ptr::write(ptr.as_ptr().add(*len), value);
1128
1.72M
            *len += 1;
1129
        }
1130
1.72M
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::push
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::push
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::push
<smallvec::SmallVec<[(u64, usize); 1]>>::push
Line
Count
Source
1118
3.94k
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
3.94k
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
3.94k
            if *len == cap {
1122
0
                self.reserve_one_unchecked();
1123
0
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
0
                ptr = heap_ptr;
1125
0
                len = heap_len;
1126
3.94k
            }
1127
3.94k
            ptr::write(ptr.as_ptr().add(*len), value);
1128
3.94k
            *len += 1;
1129
        }
1130
3.94k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::push
Line
Count
Source
1118
118k
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
118k
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
118k
            if *len == cap {
1122
43.0k
                self.reserve_one_unchecked();
1123
43.0k
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
43.0k
                ptr = heap_ptr;
1125
43.0k
                len = heap_len;
1126
75.3k
            }
1127
118k
            ptr::write(ptr.as_ptr().add(*len), value);
1128
118k
            *len += 1;
1129
        }
1130
118k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::push
Line
Count
Source
1118
678k
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
678k
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
678k
            if *len == cap {
1122
0
                self.reserve_one_unchecked();
1123
0
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
0
                ptr = heap_ptr;
1125
0
                len = heap_len;
1126
678k
            }
1127
678k
            ptr::write(ptr.as_ptr().add(*len), value);
1128
678k
            *len += 1;
1129
        }
1130
678k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::push
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::push
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::push
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::push
Line
Count
Source
1118
5.12k
    pub fn push(&mut self, value: A::Item) {
1119
        unsafe {
1120
5.12k
            let (mut ptr, mut len, cap) = self.triple_mut();
1121
5.12k
            if *len == cap {
1122
1.43k
                self.reserve_one_unchecked();
1123
1.43k
                let (heap_ptr, heap_len) = self.data.heap_mut();
1124
1.43k
                ptr = heap_ptr;
1125
1.43k
                len = heap_len;
1126
3.68k
            }
1127
5.12k
            ptr::write(ptr.as_ptr().add(*len), value);
1128
5.12k
            *len += 1;
1129
        }
1130
5.12k
    }
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
227k
    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1178
        unsafe {
1179
227k
            let unspilled = !self.spilled();
1180
227k
            let (ptr, &mut len, cap) = self.triple_mut();
1181
227k
            assert!(new_cap >= len);
1182
227k
            if new_cap <= Self::inline_capacity() {
1183
0
                if unspilled {
1184
0
                    return Ok(());
1185
0
                }
1186
0
                self.data = SmallVecData::from_inline(MaybeUninit::uninit());
1187
0
                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1188
0
                self.capacity = len;
1189
0
                deallocate(ptr, cap);
1190
227k
            } else if new_cap != cap {
1191
227k
                let layout = layout_array::<A::Item>(new_cap)?;
1192
227k
                debug_assert!(layout.size() > 0);
1193
                let new_alloc;
1194
227k
                if unspilled {
1195
157k
                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1196
157k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1197
157k
                        .cast();
1198
157k
                    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
69.9k
                    let old_layout = layout_array::<A::Item>(cap)?;
1203
1204
69.9k
                    let new_ptr =
1205
69.9k
                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1206
69.9k
                    new_alloc = NonNull::new(new_ptr)
1207
69.9k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1208
69.9k
                        .cast();
1209
                }
1210
227k
                self.data = SmallVecData::from_heap(new_alloc, len);
1211
227k
                self.capacity = new_cap;
1212
0
            }
1213
227k
            Ok(())
1214
        }
1215
227k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::try_grow
Line
Count
Source
1177
1.46k
    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1178
        unsafe {
1179
1.46k
            let unspilled = !self.spilled();
1180
1.46k
            let (ptr, &mut len, cap) = self.triple_mut();
1181
1.46k
            assert!(new_cap >= len);
1182
1.46k
            if new_cap <= Self::inline_capacity() {
1183
0
                if unspilled {
1184
0
                    return Ok(());
1185
0
                }
1186
0
                self.data = SmallVecData::from_inline(MaybeUninit::uninit());
1187
0
                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1188
0
                self.capacity = len;
1189
0
                deallocate(ptr, cap);
1190
1.46k
            } else if new_cap != cap {
1191
1.46k
                let layout = layout_array::<A::Item>(new_cap)?;
1192
1.46k
                debug_assert!(layout.size() > 0);
1193
                let new_alloc;
1194
1.46k
                if unspilled {
1195
1.09k
                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1196
1.09k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1197
1.09k
                        .cast();
1198
1.09k
                    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
370
                    let old_layout = layout_array::<A::Item>(cap)?;
1203
1204
370
                    let new_ptr =
1205
370
                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1206
370
                    new_alloc = NonNull::new(new_ptr)
1207
370
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1208
370
                        .cast();
1209
                }
1210
1.46k
                self.data = SmallVecData::from_heap(new_alloc, len);
1211
1.46k
                self.capacity = new_cap;
1212
0
            }
1213
1.46k
            Ok(())
1214
        }
1215
1.46k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::try_grow
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::try_grow
Line
Count
Source
1177
181k
    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1178
        unsafe {
1179
181k
            let unspilled = !self.spilled();
1180
181k
            let (ptr, &mut len, cap) = self.triple_mut();
1181
181k
            assert!(new_cap >= len);
1182
181k
            if new_cap <= Self::inline_capacity() {
1183
0
                if unspilled {
1184
0
                    return Ok(());
1185
0
                }
1186
0
                self.data = SmallVecData::from_inline(MaybeUninit::uninit());
1187
0
                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1188
0
                self.capacity = len;
1189
0
                deallocate(ptr, cap);
1190
181k
            } else if new_cap != cap {
1191
181k
                let layout = layout_array::<A::Item>(new_cap)?;
1192
181k
                debug_assert!(layout.size() > 0);
1193
                let new_alloc;
1194
181k
                if unspilled {
1195
112k
                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1196
112k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1197
112k
                        .cast();
1198
112k
                    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
69.5k
                    let old_layout = layout_array::<A::Item>(cap)?;
1203
1204
69.5k
                    let new_ptr =
1205
69.5k
                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1206
69.5k
                    new_alloc = NonNull::new(new_ptr)
1207
69.5k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1208
69.5k
                        .cast();
1209
                }
1210
181k
                self.data = SmallVecData::from_heap(new_alloc, len);
1211
181k
                self.capacity = new_cap;
1212
0
            }
1213
181k
            Ok(())
1214
        }
1215
181k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::try_grow
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::try_grow
Line
Count
Source
1177
43.0k
    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1178
        unsafe {
1179
43.0k
            let unspilled = !self.spilled();
1180
43.0k
            let (ptr, &mut len, cap) = self.triple_mut();
1181
43.0k
            assert!(new_cap >= len);
1182
43.0k
            if new_cap <= Self::inline_capacity() {
1183
0
                if unspilled {
1184
0
                    return Ok(());
1185
0
                }
1186
0
                self.data = SmallVecData::from_inline(MaybeUninit::uninit());
1187
0
                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1188
0
                self.capacity = len;
1189
0
                deallocate(ptr, cap);
1190
43.0k
            } else if new_cap != cap {
1191
43.0k
                let layout = layout_array::<A::Item>(new_cap)?;
1192
43.0k
                debug_assert!(layout.size() > 0);
1193
                let new_alloc;
1194
43.0k
                if unspilled {
1195
43.0k
                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1196
43.0k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1197
43.0k
                        .cast();
1198
43.0k
                    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
0
                    let old_layout = layout_array::<A::Item>(cap)?;
1203
1204
0
                    let new_ptr =
1205
0
                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1206
0
                    new_alloc = NonNull::new(new_ptr)
1207
0
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1208
0
                        .cast();
1209
                }
1210
43.0k
                self.data = SmallVecData::from_heap(new_alloc, len);
1211
43.0k
                self.capacity = new_cap;
1212
0
            }
1213
43.0k
            Ok(())
1214
        }
1215
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::try_grow
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::try_grow
Line
Count
Source
1177
1.43k
    pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1178
        unsafe {
1179
1.43k
            let unspilled = !self.spilled();
1180
1.43k
            let (ptr, &mut len, cap) = self.triple_mut();
1181
1.43k
            assert!(new_cap >= len);
1182
1.43k
            if new_cap <= Self::inline_capacity() {
1183
0
                if unspilled {
1184
0
                    return Ok(());
1185
0
                }
1186
0
                self.data = SmallVecData::from_inline(MaybeUninit::uninit());
1187
0
                ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1188
0
                self.capacity = len;
1189
0
                deallocate(ptr, cap);
1190
1.43k
            } else if new_cap != cap {
1191
1.43k
                let layout = layout_array::<A::Item>(new_cap)?;
1192
1.43k
                debug_assert!(layout.size() > 0);
1193
                let new_alloc;
1194
1.43k
                if unspilled {
1195
1.43k
                    new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1196
1.43k
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1197
1.43k
                        .cast();
1198
1.43k
                    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
0
                    let old_layout = layout_array::<A::Item>(cap)?;
1203
1204
0
                    let new_ptr =
1205
0
                        alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1206
0
                    new_alloc = NonNull::new(new_ptr)
1207
0
                        .ok_or(CollectionAllocErr::AllocErr { layout })?
1208
0
                        .cast();
1209
                }
1210
1.43k
                self.data = SmallVecData::from_heap(new_alloc, len);
1211
1.43k
                self.capacity = new_cap;
1212
0
            }
1213
1.43k
            Ok(())
1214
        }
1215
1.43k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::try_grow
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::try_grow
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
18.0M
    pub fn reserve(&mut self, additional: usize) {
1224
18.0M
        infallible(self.try_reserve(additional))
1225
18.0M
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::reserve
Line
Count
Source
1223
1.36k
    pub fn reserve(&mut self, additional: usize) {
1224
1.36k
        infallible(self.try_reserve(additional))
1225
1.36k
    }
<smallvec::SmallVec<[u64; 8]>>::reserve
Line
Count
Source
1223
764
    pub fn reserve(&mut self, additional: usize) {
1224
764
        infallible(self.try_reserve(additional))
1225
764
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::reserve
Line
Count
Source
1223
30.6k
    pub fn reserve(&mut self, additional: usize) {
1224
30.6k
        infallible(self.try_reserve(additional))
1225
30.6k
    }
<smallvec::SmallVec<[u64; 8]>>::reserve
Line
Count
Source
1223
17.8M
    pub fn reserve(&mut self, additional: usize) {
1224
17.8M
        infallible(self.try_reserve(additional))
1225
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::reserve
Line
Count
Source
1223
25.3k
    pub fn reserve(&mut self, additional: usize) {
1224
25.3k
        infallible(self.try_reserve(additional))
1225
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::reserve
Line
Count
Source
1223
32.3k
    pub fn reserve(&mut self, additional: usize) {
1224
32.3k
        infallible(self.try_reserve(additional))
1225
32.3k
    }
<smallvec::SmallVec<[u64; 8]>>::reserve
Line
Count
Source
1223
43.0k
    pub fn reserve(&mut self, additional: usize) {
1224
43.0k
        infallible(self.try_reserve(additional))
1225
43.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::reserve
Line
Count
Source
1223
930
    pub fn reserve(&mut self, additional: usize) {
1224
930
        infallible(self.try_reserve(additional))
1225
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::reserve
1226
1227
    /// Internal method used to grow in push() and insert(), where we know already we have to grow.
1228
    #[cold]
1229
227k
    fn reserve_one_unchecked(&mut self) {
1230
227k
        debug_assert_eq!(self.len(), self.capacity());
1231
227k
        let new_cap = self.len()
1232
227k
            .checked_add(1)
1233
227k
            .and_then(usize::checked_next_power_of_two)
1234
227k
            .expect("capacity overflow");
1235
227k
        infallible(self.try_grow(new_cap))
1236
227k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::reserve_one_unchecked
Line
Count
Source
1229
1.46k
    fn reserve_one_unchecked(&mut self) {
1230
1.46k
        debug_assert_eq!(self.len(), self.capacity());
1231
1.46k
        let new_cap = self.len()
1232
1.46k
            .checked_add(1)
1233
1.46k
            .and_then(usize::checked_next_power_of_two)
1234
1.46k
            .expect("capacity overflow");
1235
1.46k
        infallible(self.try_grow(new_cap))
1236
1.46k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::reserve_one_unchecked
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::reserve_one_unchecked
Line
Count
Source
1229
181k
    fn reserve_one_unchecked(&mut self) {
1230
181k
        debug_assert_eq!(self.len(), self.capacity());
1231
181k
        let new_cap = self.len()
1232
181k
            .checked_add(1)
1233
181k
            .and_then(usize::checked_next_power_of_two)
1234
181k
            .expect("capacity overflow");
1235
181k
        infallible(self.try_grow(new_cap))
1236
181k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::reserve_one_unchecked
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::reserve_one_unchecked
Line
Count
Source
1229
43.0k
    fn reserve_one_unchecked(&mut self) {
1230
43.0k
        debug_assert_eq!(self.len(), self.capacity());
1231
43.0k
        let new_cap = self.len()
1232
43.0k
            .checked_add(1)
1233
43.0k
            .and_then(usize::checked_next_power_of_two)
1234
43.0k
            .expect("capacity overflow");
1235
43.0k
        infallible(self.try_grow(new_cap))
1236
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::reserve_one_unchecked
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::reserve_one_unchecked
Line
Count
Source
1229
1.43k
    fn reserve_one_unchecked(&mut self) {
1230
1.43k
        debug_assert_eq!(self.len(), self.capacity());
1231
1.43k
        let new_cap = self.len()
1232
1.43k
            .checked_add(1)
1233
1.43k
            .and_then(usize::checked_next_power_of_two)
1234
1.43k
            .expect("capacity overflow");
1235
1.43k
        infallible(self.try_grow(new_cap))
1236
1.43k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::reserve_one_unchecked
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::reserve_one_unchecked
1237
1238
    /// Reserve capacity for `additional` more elements to be inserted.
1239
    ///
1240
    /// May reserve more space to avoid frequent reallocations.
1241
18.0M
    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
18.0M
        let (_, &mut len, cap) = self.triple_mut();
1245
18.0M
        if cap - len >= additional {
1246
18.0M
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
18.0M
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::try_reserve
Line
Count
Source
1241
1.36k
    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
1.36k
        let (_, &mut len, cap) = self.triple_mut();
1245
1.36k
        if cap - len >= additional {
1246
1.36k
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
1.36k
    }
<smallvec::SmallVec<[u64; 8]>>::try_reserve
Line
Count
Source
1241
764
    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
764
        let (_, &mut len, cap) = self.triple_mut();
1245
764
        if cap - len >= additional {
1246
764
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
764
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::try_reserve
Line
Count
Source
1241
30.6k
    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
30.6k
        let (_, &mut len, cap) = self.triple_mut();
1245
30.6k
        if cap - len >= additional {
1246
30.6k
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
30.6k
    }
<smallvec::SmallVec<[u64; 8]>>::try_reserve
Line
Count
Source
1241
17.8M
    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
17.8M
        let (_, &mut len, cap) = self.triple_mut();
1245
17.8M
        if cap - len >= additional {
1246
17.8M
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::try_reserve
Line
Count
Source
1241
25.3k
    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
25.3k
        let (_, &mut len, cap) = self.triple_mut();
1245
25.3k
        if cap - len >= additional {
1246
25.3k
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::try_reserve
Line
Count
Source
1241
32.3k
    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
32.3k
        let (_, &mut len, cap) = self.triple_mut();
1245
32.3k
        if cap - len >= additional {
1246
32.3k
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
32.3k
    }
<smallvec::SmallVec<[u64; 8]>>::try_reserve
Line
Count
Source
1241
43.0k
    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
43.0k
        let (_, &mut len, cap) = self.triple_mut();
1245
43.0k
        if cap - len >= additional {
1246
43.0k
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
43.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::try_reserve
Line
Count
Source
1241
930
    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
930
        let (_, &mut len, cap) = self.triple_mut();
1245
930
        if cap - len >= additional {
1246
930
            return Ok(());
1247
0
        }
1248
0
        let new_cap = len
1249
0
            .checked_add(additional)
1250
0
            .and_then(usize::checked_next_power_of_two)
1251
0
            .ok_or(CollectionAllocErr::CapacityOverflow)?;
1252
0
        self.try_grow(new_cap)
1253
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]>>::try_reserve
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
88.9k
    pub fn as_slice(&self) -> &[A::Item] {
1319
88.9k
        self
1320
88.9k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::as_slice
Line
Count
Source
1318
1.36k
    pub fn as_slice(&self) -> &[A::Item] {
1319
1.36k
        self
1320
1.36k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::as_slice
Line
Count
Source
1318
29.0k
    pub fn as_slice(&self) -> &[A::Item] {
1319
29.0k
        self
1320
29.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::as_slice
Line
Count
Source
1318
25.3k
    pub fn as_slice(&self) -> &[A::Item] {
1319
25.3k
        self
1320
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::as_slice
Line
Count
Source
1318
32.2k
    pub fn as_slice(&self) -> &[A::Item] {
1319
32.2k
        self
1320
32.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::as_slice
Line
Count
Source
1318
930
    pub fn as_slice(&self) -> &[A::Item] {
1319
930
        self
1320
930
    }
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
15.8k
    pub fn remove(&mut self, index: usize) -> A::Item {
1353
        unsafe {
1354
15.8k
            let (ptr, len_ptr, _) = self.triple_mut();
1355
15.8k
            let len = *len_ptr;
1356
15.8k
            assert!(index < len);
1357
15.8k
            *len_ptr = len - 1;
1358
15.8k
            let ptr = ptr.as_ptr().add(index);
1359
15.8k
            let item = ptr::read(ptr);
1360
15.8k
            ptr::copy(ptr.add(1), ptr, len - index - 1);
1361
15.8k
            item
1362
        }
1363
15.8k
    }
1364
1365
    /// Insert an element at position `index`, shifting all elements after it to the right.
1366
    ///
1367
    /// Panics if `index > len`.
1368
114k
    pub fn insert(&mut self, index: usize, element: A::Item) {
1369
        unsafe {
1370
114k
            let (mut ptr, mut len_ptr, cap) = self.triple_mut();
1371
114k
            if *len_ptr == cap {
1372
0
                self.reserve_one_unchecked();
1373
0
                let (heap_ptr, heap_len_ptr) = self.data.heap_mut();
1374
0
                ptr = heap_ptr;
1375
0
                len_ptr = heap_len_ptr;
1376
114k
            }
1377
114k
            let mut ptr = ptr.as_ptr();
1378
114k
            let len = *len_ptr;
1379
114k
            if index > len {
1380
0
                panic!("index exceeds length");
1381
114k
            }
1382
            // SAFETY: add is UB if index > len, but we panicked first
1383
114k
            ptr = ptr.add(index);
1384
114k
            if index < len {
1385
114k
                // Shift element to the right of `index`.
1386
114k
                ptr::copy(ptr, ptr.add(1), len - index);
1387
114k
            }
1388
114k
            *len_ptr = len + 1;
1389
114k
            ptr::write(ptr, element);
1390
        }
1391
114k
    }
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
42.3k
    pub fn into_inner(self) -> Result<A, Self> {
1507
42.3k
        if self.spilled() || self.len() != A::size() {
1508
            // Note: A::size, not Self::inline_capacity
1509
0
            Err(self)
1510
        } else {
1511
            unsafe {
1512
42.3k
                let data = ptr::read(&self.data);
1513
42.3k
                mem::forget(self);
1514
42.3k
                Ok(data.into_inline().assume_init())
1515
            }
1516
        }
1517
42.3k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::into_inner
<smallvec::SmallVec<[(u64, u64); 4]>>::into_inner
Line
Count
Source
1506
12
    pub fn into_inner(self) -> Result<A, Self> {
1507
12
        if self.spilled() || self.len() != A::size() {
1508
            // Note: A::size, not Self::inline_capacity
1509
0
            Err(self)
1510
        } else {
1511
            unsafe {
1512
12
                let data = ptr::read(&self.data);
1513
12
                mem::forget(self);
1514
12
                Ok(data.into_inline().assume_init())
1515
            }
1516
        }
1517
12
    }
<smallvec::SmallVec<[(u64, u64); 4]>>::into_inner
Line
Count
Source
1506
42.3k
    pub fn into_inner(self) -> Result<A, Self> {
1507
42.3k
        if self.spilled() || self.len() != A::size() {
1508
            // Note: A::size, not Self::inline_capacity
1509
0
            Err(self)
1510
        } else {
1511
            unsafe {
1512
42.3k
                let data = ptr::read(&self.data);
1513
42.3k
                mem::forget(self);
1514
42.3k
                Ok(data.into_inline().assume_init())
1515
            }
1516
        }
1517
42.3k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]>>::into_inner
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
374k
    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
374k
        self.triple().0.as_ptr()
1725
374k
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::as_ptr
Line
Count
Source
1720
737
    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
737
        self.triple().0.as_ptr()
1725
737
    }
<smallvec::SmallVec<[(u64, usize); 1]>>::as_ptr
Line
Count
Source
1720
3.20k
    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
3.20k
        self.triple().0.as_ptr()
1725
3.20k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]>>::as_ptr
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::as_ptr
<smallvec::SmallVec<[quiche::frame::Frame; 1]>>::as_ptr
Line
Count
Source
1720
370k
    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
370k
        self.triple().0.as_ptr()
1725
370k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]>>::as_ptr
1726
1727
    /// Returns a raw mutable pointer to the vector's buffer.
1728
0
    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
0
        self.triple_mut().0.as_ptr()
1733
0
    }
1734
}
1735
1736
impl<A: Array> SmallVec<A>
1737
where
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
1800
impl<A: Array> SmallVec<A>
1801
where
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
1847
impl<A: Array> ops::Deref for SmallVec<A> {
1848
    type Target = [A::Item];
1849
    #[inline]
1850
25.8M
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
25.8M
            let (ptr, len, _) = self.triple();
1853
25.8M
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
25.8M
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
764
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
764
            let (ptr, len, _) = self.triple();
1853
764
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
764
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
1.36k
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
1.36k
            let (ptr, len, _) = self.triple();
1853
1.36k
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
1.36k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
23.7M
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
23.7M
            let (ptr, len, _) = self.triple();
1853
23.7M
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
23.7M
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
29.0k
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
29.0k
            let (ptr, len, _) = self.triple();
1853
29.0k
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
29.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
25.3k
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
25.3k
            let (ptr, len, _) = self.triple();
1853
25.3k
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
2.04M
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
2.04M
            let (ptr, len, _) = self.triple();
1853
2.04M
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
2.04M
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
43.0k
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
43.0k
            let (ptr, len, _) = self.triple();
1853
43.0k
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
43.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::Deref>::deref
Line
Count
Source
1850
930
    fn deref(&self) -> &[A::Item] {
1851
        unsafe {
1852
930
            let (ptr, len, _) = self.triple();
1853
930
            slice::from_raw_parts(ptr.as_ptr(), len)
1854
        }
1855
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::ops::deref::Deref>::deref
1856
}
1857
1858
impl<A: Array> ops::DerefMut for SmallVec<A> {
1859
    #[inline]
1860
36.3M
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
36.3M
        unsafe {
1862
36.3M
            let (ptr, &mut len, _) = self.triple_mut();
1863
36.3M
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
36.3M
        }
1865
36.3M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
8.13k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
8.13k
        unsafe {
1862
8.13k
            let (ptr, &mut len, _) = self.triple_mut();
1863
8.13k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
8.13k
        }
1865
8.13k
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
7.11k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
7.11k
        unsafe {
1862
7.11k
            let (ptr, &mut len, _) = self.triple_mut();
1863
7.11k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
7.11k
        }
1865
7.11k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
324k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
324k
        unsafe {
1862
324k
            let (ptr, &mut len, _) = self.triple_mut();
1863
324k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
324k
        }
1865
324k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
764
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
764
        unsafe {
1862
764
            let (ptr, &mut len, _) = self.triple_mut();
1863
764
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
764
        }
1865
764
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
14.8M
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
14.8M
        unsafe {
1862
14.8M
            let (ptr, &mut len, _) = self.triple_mut();
1863
14.8M
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
14.8M
        }
1865
14.8M
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
31.6k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
31.6k
        unsafe {
1862
31.6k
            let (ptr, &mut len, _) = self.triple_mut();
1863
31.6k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
31.6k
        }
1865
31.6k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
191k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
191k
        unsafe {
1862
191k
            let (ptr, &mut len, _) = self.triple_mut();
1863
191k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
191k
        }
1865
191k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
17.8M
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
17.8M
        unsafe {
1862
17.8M
            let (ptr, &mut len, _) = self.triple_mut();
1863
17.8M
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
17.8M
        }
1865
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
687k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
687k
        unsafe {
1862
687k
            let (ptr, &mut len, _) = self.triple_mut();
1863
687k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
687k
        }
1865
687k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::deref::DerefMut>::deref_mut
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
1.04M
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
1.04M
        unsafe {
1862
1.04M
            let (ptr, &mut len, _) = self.triple_mut();
1863
1.04M
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
1.04M
        }
1865
1.04M
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]> as core::ops::deref::DerefMut>::deref_mut
<smallvec::SmallVec<[u64; 8]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
43.0k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
43.0k
        unsafe {
1862
43.0k
            let (ptr, &mut len, _) = self.triple_mut();
1863
43.0k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
43.0k
        }
1865
43.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
440k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
440k
        unsafe {
1862
440k
            let (ptr, &mut len, _) = self.triple_mut();
1863
440k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
440k
        }
1865
440k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
104k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
104k
        unsafe {
1862
104k
            let (ptr, &mut len, _) = self.triple_mut();
1863
104k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
104k
        }
1865
104k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
5.94k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
5.94k
        unsafe {
1862
5.94k
            let (ptr, &mut len, _) = self.triple_mut();
1863
5.94k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
5.94k
        }
1865
5.94k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::deref::DerefMut>::deref_mut
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
45.6k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
45.6k
        unsafe {
1862
45.6k
            let (ptr, &mut len, _) = self.triple_mut();
1863
45.6k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
45.6k
        }
1865
45.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::ops::deref::DerefMut>::deref_mut
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
494k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
494k
        unsafe {
1862
494k
            let (ptr, &mut len, _) = self.triple_mut();
1863
494k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
494k
        }
1865
494k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::deref::DerefMut>::deref_mut
Line
Count
Source
1860
175k
    fn deref_mut(&mut self) -> &mut [A::Item] {
1861
175k
        unsafe {
1862
175k
            let (ptr, &mut len, _) = self.triple_mut();
1863
175k
            slice::from_raw_parts_mut(ptr.as_ptr(), len)
1864
175k
        }
1865
175k
    }
1866
}
1867
1868
impl<A: Array> AsRef<[A::Item]> for SmallVec<A> {
1869
    #[inline]
1870
    fn as_ref(&self) -> &[A::Item] {
1871
        self
1872
    }
1873
}
1874
1875
impl<A: Array> AsMut<[A::Item]> for SmallVec<A> {
1876
    #[inline]
1877
    fn as_mut(&mut self) -> &mut [A::Item] {
1878
        self
1879
    }
1880
}
1881
1882
impl<A: Array> Borrow<[A::Item]> for SmallVec<A> {
1883
    #[inline]
1884
    fn borrow(&self) -> &[A::Item] {
1885
        self
1886
    }
1887
}
1888
1889
impl<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")))]
1898
impl<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")))]
1919
impl<A: Array> Serialize for SmallVec<A>
1920
where
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")))]
1934
impl<'de, A: Array> Deserialize<'de> for SmallVec<A>
1935
where
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")]
1946
struct SmallVecVisitor<A> {
1947
    phantom: PhantomData<A>,
1948
}
1949
1950
#[cfg(feature = "serde")]
1951
impl<'de, A: Array> Visitor<'de> for SmallVecVisitor<A>
1952
where
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")]
1979
impl<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")]
1990
impl<A> MallocSizeOf for SmallVec<A>
1991
where
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")]
2005
trait SpecFrom<A: Array, S> {
2006
    fn spec_from(slice: S) -> SmallVec<A>;
2007
}
2008
2009
#[cfg(feature = "specialization")]
2010
mod specialization;
2011
2012
#[cfg(feature = "arbitrary")]
2013
mod arbitrary;
2014
2015
#[cfg(feature = "specialization")]
2016
impl<'a, A: Array> SpecFrom<A, &'a [A::Item]> for SmallVec<A>
2017
where
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
2026
impl<'a, A: Array> From<&'a [A::Item]> for SmallVec<A>
2027
where
2028
    A::Item: Clone,
2029
{
2030
    #[cfg(not(feature = "specialization"))]
2031
    #[inline]
2032
88.9k
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
88.9k
        slice.iter().cloned().collect()
2034
88.9k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::convert::From<&[(u64, u64)]>>::from
Line
Count
Source
2032
1.36k
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
1.36k
        slice.iter().cloned().collect()
2034
1.36k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::convert::From<&[(u64, u64)]>>::from
Line
Count
Source
2032
29.0k
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
29.0k
        slice.iter().cloned().collect()
2034
29.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::convert::From<&[quiche::frame::Frame]>>::from
Line
Count
Source
2032
25.3k
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
25.3k
        slice.iter().cloned().collect()
2034
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::convert::From<&[(u64, u64)]>>::from
Line
Count
Source
2032
32.2k
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
32.2k
        slice.iter().cloned().collect()
2034
32.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::convert::From<&[(u64, u64)]>>::from
Line
Count
Source
2032
930
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2033
930
        slice.iter().cloned().collect()
2034
930
    }
2035
2036
    #[cfg(feature = "specialization")]
2037
    #[inline]
2038
    fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2039
        SmallVec::spec_from(slice)
2040
    }
2041
}
2042
2043
impl<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
2050
impl<A: Array> From<A> for SmallVec<A> {
2051
    #[inline]
2052
    fn from(array: A) -> SmallVec<A> {
2053
        SmallVec::from_buf(array)
2054
    }
2055
}
2056
2057
impl<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
2065
impl<A: Array, I: SliceIndex<[A::Item]>> ops::IndexMut<I> for SmallVec<A> {
2066
33.8M
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
33.8M
        &mut (&mut **self)[index]
2068
33.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
3.52k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
3.52k
        &mut (&mut **self)[index]
2068
3.52k
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
7.11k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
7.11k
        &mut (&mut **self)[index]
2068
7.11k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
324k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
324k
        &mut (&mut **self)[index]
2068
324k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
764
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
764
        &mut (&mut **self)[index]
2068
764
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
13.3M
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
13.3M
        &mut (&mut **self)[index]
2068
13.3M
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
31.6k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
31.6k
        &mut (&mut **self)[index]
2068
31.6k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
191k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
191k
        &mut (&mut **self)[index]
2068
191k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
17.8M
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
17.8M
        &mut (&mut **self)[index]
2068
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
612k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
612k
        &mut (&mut **self)[index]
2068
612k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
166k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
166k
        &mut (&mut **self)[index]
2068
166k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<usize>>::index_mut
Line
Count
Source
2066
85
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
85
        &mut (&mut **self)[index]
2068
85
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
<smallvec::SmallVec<[u64; 8]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
43.0k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
43.0k
        &mut (&mut **self)[index]
2068
43.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
440k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
440k
        &mut (&mut **self)[index]
2068
440k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
104k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
104k
        &mut (&mut **self)[index]
2068
104k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
2.25k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
2.25k
        &mut (&mut **self)[index]
2068
2.25k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
45.6k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
45.6k
        &mut (&mut **self)[index]
2068
45.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
494k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
494k
        &mut (&mut **self)[index]
2068
494k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::index::IndexMut<core::ops::range::RangeFull>>::index_mut
Line
Count
Source
2066
175k
    fn index_mut(&mut self, index: I) -> &mut I::Output {
2067
175k
        &mut (&mut **self)[index]
2068
175k
    }
2069
}
2070
2071
#[allow(deprecated)]
2072
impl<A: Array> ExtendFromSlice<A::Item> for SmallVec<A>
2073
where
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
2081
impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
2082
    #[inline]
2083
18.0M
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
18.0M
        let mut v = SmallVec::new();
2085
18.0M
        v.extend(iterable);
2086
18.0M
        v
2087
18.0M
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2083
1.36k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
1.36k
        let mut v = SmallVec::new();
2085
1.36k
        v.extend(iterable);
2086
1.36k
        v
2087
1.36k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<alloc::collections::btree::map::BTreeMap<u64, u64>>
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2083
764
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
764
        let mut v = SmallVec::new();
2085
764
        v.extend(iterable);
2086
764
        v
2087
764
    }
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::map::Map<intrusive_collections::rbtree::Iter<quiche::stream::StreamReadablePriorityAdapter>, <quiche::stream::StreamMap>::readable::{closure#0}>>
Line
Count
Source
2083
9.22M
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
9.22M
        let mut v = SmallVec::new();
2085
9.22M
        v.extend(iterable);
2086
9.22M
        v
2087
9.22M
    }
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2083
8.66M
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
8.66M
        let mut v = SmallVec::new();
2085
8.66M
        v.extend(iterable);
2086
8.66M
        v
2087
8.66M
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2083
29.0k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
29.0k
        let mut v = SmallVec::new();
2085
29.0k
        v.extend(iterable);
2086
29.0k
        v
2087
29.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Line
Count
Source
2083
1.61k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
1.61k
        let mut v = SmallVec::new();
2085
1.61k
        v.extend(iterable);
2086
1.61k
        v
2087
1.61k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Line
Count
Source
2083
36
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
36
        let mut v = SmallVec::new();
2085
36
        v.extend(iterable);
2086
36
        v
2087
36
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::FromIterator<quiche::frame::Frame>>::from_iter::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<quiche::frame::Frame>>>
Line
Count
Source
2083
25.3k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
25.3k
        let mut v = SmallVec::new();
2085
25.3k
        v.extend(iterable);
2086
25.3k
        v
2087
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2083
32.2k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
32.2k
        let mut v = SmallVec::new();
2085
32.2k
        v.extend(iterable);
2086
32.2k
        v
2087
32.2k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::map::Map<intrusive_collections::rbtree::Iter<quiche::stream::StreamReadablePriorityAdapter>, <quiche::stream::StreamMap>::readable::{closure#0}>>
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2083
43.0k
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
43.0k
        let mut v = SmallVec::new();
2085
43.0k
        v.extend(iterable);
2086
43.0k
        v
2087
43.0k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::FromIterator<u64>>::from_iter::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::FromIterator<(u64, u64)>>::from_iter::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2083
930
    fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2084
930
        let mut v = SmallVec::new();
2085
930
        v.extend(iterable);
2086
930
        v
2087
930
    }
2088
}
2089
2090
impl<A: Array> Extend<A::Item> for SmallVec<A> {
2091
18.0M
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
18.0M
        let mut iter = iterable.into_iter();
2093
18.0M
        let (lower_size_bound, _) = iter.size_hint();
2094
18.0M
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
18.0M
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
18.0M
            let ptr = ptr.as_ptr();
2099
18.0M
            let mut len = SetLenOnDrop::new(len_ptr);
2100
23.9M
            while len.get() < cap {
2101
23.9M
                if let Some(out) = iter.next() {
2102
5.90M
                    ptr::write(ptr.add(len.get()), out);
2103
5.90M
                    len.increment_len(1);
2104
5.90M
                } else {
2105
18.0M
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
18.0M
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2091
1.36k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
1.36k
        let mut iter = iterable.into_iter();
2093
1.36k
        let (lower_size_bound, _) = iter.size_hint();
2094
1.36k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
1.36k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
1.36k
            let ptr = ptr.as_ptr();
2099
1.36k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
2.98k
            while len.get() < cap {
2101
2.98k
                if let Some(out) = iter.next() {
2102
1.61k
                    ptr::write(ptr.add(len.get()), out);
2103
1.61k
                    len.increment_len(1);
2104
1.61k
                } else {
2105
1.36k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
1.36k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<alloc::collections::btree::map::BTreeMap<u64, u64>>
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2091
764
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
764
        let mut iter = iterable.into_iter();
2093
764
        let (lower_size_bound, _) = iter.size_hint();
2094
764
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
764
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
764
            let ptr = ptr.as_ptr();
2099
764
            let mut len = SetLenOnDrop::new(len_ptr);
2100
764
            while len.get() < cap {
2101
764
                if let Some(out) = iter.next() {
2102
0
                    ptr::write(ptr.add(len.get()), out);
2103
0
                    len.increment_len(1);
2104
0
                } else {
2105
764
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
764
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2091
29.0k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
29.0k
        let mut iter = iterable.into_iter();
2093
29.0k
        let (lower_size_bound, _) = iter.size_hint();
2094
29.0k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
29.0k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
29.0k
            let ptr = ptr.as_ptr();
2099
29.0k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
79.4k
            while len.get() < cap {
2101
79.4k
                if let Some(out) = iter.next() {
2102
50.4k
                    ptr::write(ptr.add(len.get()), out);
2103
50.4k
                    len.increment_len(1);
2104
50.4k
                } else {
2105
29.0k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
29.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Line
Count
Source
2091
1.61k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
1.61k
        let mut iter = iterable.into_iter();
2093
1.61k
        let (lower_size_bound, _) = iter.size_hint();
2094
1.61k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
1.61k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
1.61k
            let ptr = ptr.as_ptr();
2099
1.61k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
2.67k
            while len.get() < cap {
2101
2.67k
                if let Some(out) = iter.next() {
2102
1.05k
                    ptr::write(ptr.add(len.get()), out);
2103
1.05k
                    len.increment_len(1);
2104
1.05k
                } else {
2105
1.61k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
1.61k
    }
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::map::Map<intrusive_collections::rbtree::Iter<quiche::stream::StreamReadablePriorityAdapter>, <quiche::stream::StreamMap>::readable::{closure#0}>>
Line
Count
Source
2091
9.22M
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
9.22M
        let mut iter = iterable.into_iter();
2093
9.22M
        let (lower_size_bound, _) = iter.size_hint();
2094
9.22M
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
9.22M
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
9.22M
            let ptr = ptr.as_ptr();
2099
9.22M
            let mut len = SetLenOnDrop::new(len_ptr);
2100
9.48M
            while len.get() < cap {
2101
9.48M
                if let Some(out) = iter.next() {
2102
255k
                    ptr::write(ptr.add(len.get()), out);
2103
255k
                    len.increment_len(1);
2104
255k
                } else {
2105
9.22M
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
9.22M
    }
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2091
8.66M
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
8.66M
        let mut iter = iterable.into_iter();
2093
8.66M
        let (lower_size_bound, _) = iter.size_hint();
2094
8.66M
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
8.66M
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
8.66M
            let ptr = ptr.as_ptr();
2099
8.66M
            let mut len = SetLenOnDrop::new(len_ptr);
2100
14.2M
            while len.get() < cap {
2101
14.2M
                if let Some(out) = iter.next() {
2102
5.56M
                    ptr::write(ptr.add(len.get()), out);
2103
5.56M
                    len.increment_len(1);
2104
5.56M
                } else {
2105
8.66M
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
8.66M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::Extend<quiche::frame::Frame>>::extend::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<quiche::frame::Frame>>>
Line
Count
Source
2091
25.3k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
25.3k
        let mut iter = iterable.into_iter();
2093
25.3k
        let (lower_size_bound, _) = iter.size_hint();
2094
25.3k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
25.3k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
25.3k
            let ptr = ptr.as_ptr();
2099
25.3k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
25.3k
            while len.get() < cap {
2101
25.3k
                if let Some(out) = iter.next() {
2102
0
                    ptr::write(ptr.add(len.get()), out);
2103
0
                    len.increment_len(1);
2104
0
                } else {
2105
25.3k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2091
32.2k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
32.2k
        let mut iter = iterable.into_iter();
2093
32.2k
        let (lower_size_bound, _) = iter.size_hint();
2094
32.2k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
32.2k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
32.2k
            let ptr = ptr.as_ptr();
2099
32.2k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
64.5k
            while len.get() < cap {
2101
64.5k
                if let Some(out) = iter.next() {
2102
32.2k
                    ptr::write(ptr.add(len.get()), out);
2103
32.2k
                    len.increment_len(1);
2104
32.2k
                } else {
2105
32.2k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
32.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Line
Count
Source
2091
36
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
36
        let mut iter = iterable.into_iter();
2093
36
        let (lower_size_bound, _) = iter.size_hint();
2094
36
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
36
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
36
            let ptr = ptr.as_ptr();
2099
36
            let mut len = SetLenOnDrop::new(len_ptr);
2100
108
            while len.get() < cap {
2101
108
                if let Some(out) = iter.next() {
2102
72
                    ptr::write(ptr.add(len.get()), out);
2103
72
                    len.increment_len(1);
2104
72
                } else {
2105
36
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
36
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::map::Map<intrusive_collections::rbtree::Iter<quiche::stream::StreamReadablePriorityAdapter>, <quiche::stream::StreamMap>::readable::{closure#0}>>
<smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
Line
Count
Source
2091
43.0k
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
43.0k
        let mut iter = iterable.into_iter();
2093
43.0k
        let (lower_size_bound, _) = iter.size_hint();
2094
43.0k
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
43.0k
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
43.0k
            let ptr = ptr.as_ptr();
2099
43.0k
            let mut len = SetLenOnDrop::new(len_ptr);
2100
43.0k
            while len.get() < cap {
2101
43.0k
                if let Some(out) = iter.next() {
2102
0
                    ptr::write(ptr.add(len.get()), out);
2103
0
                    len.increment_len(1);
2104
0
                } else {
2105
43.0k
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
43.0k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<core::iter::adapters::cloned::Cloned<core::slice::iter::Iter<(u64, u64)>>>
Line
Count
Source
2091
930
    fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2092
930
        let mut iter = iterable.into_iter();
2093
930
        let (lower_size_bound, _) = iter.size_hint();
2094
930
        self.reserve(lower_size_bound);
2095
2096
        unsafe {
2097
930
            let (ptr, len_ptr, cap) = self.triple_mut();
2098
930
            let ptr = ptr.as_ptr();
2099
930
            let mut len = SetLenOnDrop::new(len_ptr);
2100
2.14k
            while len.get() < cap {
2101
2.14k
                if let Some(out) = iter.next() {
2102
1.21k
                    ptr::write(ptr.add(len.get()), out);
2103
1.21k
                    len.increment_len(1);
2104
1.21k
                } else {
2105
930
                    return;
2106
                }
2107
            }
2108
        }
2109
2110
0
        for elem in iter {
2111
0
            self.push(elem);
2112
0
        }
2113
930
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::iter::traits::collect::Extend<(u64, u64)>>::extend::<alloc::collections::btree::map::BTreeMap<u64, u64>>
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::iter::traits::collect::Extend<u64>>::extend::<core::iter::adapters::copied::Copied<std::collections::hash::set::Iter<u64>>>
2114
}
2115
2116
impl<A: Array> fmt::Debug for SmallVec<A>
2117
where
2118
    A::Item: fmt::Debug,
2119
{
2120
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2121
0
        f.debug_list().entries(self.iter()).finish()
2122
0
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::fmt::Debug>::fmt
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::fmt::Debug>::fmt
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::fmt::Debug>::fmt
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::fmt::Debug>::fmt
2123
}
2124
2125
impl<A: Array> Default for SmallVec<A> {
2126
    #[inline]
2127
1.08M
    fn default() -> SmallVec<A> {
2128
1.08M
        SmallVec::new()
2129
1.08M
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::default::Default>::default
<smallvec::SmallVec<[(u64, u64); 4]> as core::default::Default>::default
Line
Count
Source
2127
12
    fn default() -> SmallVec<A> {
2128
12
        SmallVec::new()
2129
12
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::default::Default>::default
Line
Count
Source
2127
985k
    fn default() -> SmallVec<A> {
2128
985k
        SmallVec::new()
2129
985k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::default::Default>::default
Line
Count
Source
2127
100k
    fn default() -> SmallVec<A> {
2128
100k
        SmallVec::new()
2129
100k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, u64); 4]> as core::default::Default>::default
2130
}
2131
2132
#[cfg(feature = "may_dangle")]
2133
unsafe 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"))]
2147
impl<A: Array> Drop for SmallVec<A> {
2148
34.0M
    fn drop(&mut self) {
2149
        unsafe {
2150
34.0M
            if self.spilled() {
2151
157k
                let (ptr, &mut len) = self.data.heap_mut();
2152
157k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
33.8M
            } else {
2154
33.8M
                ptr::drop_in_place(&mut self[..]);
2155
33.8M
            }
2156
        }
2157
34.0M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
4.61k
    fn drop(&mut self) {
2149
        unsafe {
2150
4.61k
            if self.spilled() {
2151
1.09k
                let (ptr, &mut len) = self.data.heap_mut();
2152
1.09k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
3.52k
            } else {
2154
3.52k
                ptr::drop_in_place(&mut self[..]);
2155
3.52k
            }
2156
        }
2157
4.61k
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
7.11k
    fn drop(&mut self) {
2149
        unsafe {
2150
7.11k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
7.11k
            } else {
2154
7.11k
                ptr::drop_in_place(&mut self[..]);
2155
7.11k
            }
2156
        }
2157
7.11k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
324k
    fn drop(&mut self) {
2149
        unsafe {
2150
324k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
324k
            } else {
2154
324k
                ptr::drop_in_place(&mut self[..]);
2155
324k
            }
2156
        }
2157
324k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
764
    fn drop(&mut self) {
2149
        unsafe {
2150
764
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
764
            } else {
2154
764
                ptr::drop_in_place(&mut self[..]);
2155
764
            }
2156
        }
2157
764
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
13.3M
    fn drop(&mut self) {
2149
        unsafe {
2150
13.3M
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
13.3M
            } else {
2154
13.3M
                ptr::drop_in_place(&mut self[..]);
2155
13.3M
            }
2156
        }
2157
13.3M
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
31.6k
    fn drop(&mut self) {
2149
        unsafe {
2150
31.6k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
31.6k
            } else {
2154
31.6k
                ptr::drop_in_place(&mut self[..]);
2155
31.6k
            }
2156
        }
2157
31.6k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
191k
    fn drop(&mut self) {
2149
        unsafe {
2150
191k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
191k
            } else {
2154
191k
                ptr::drop_in_place(&mut self[..]);
2155
191k
            }
2156
        }
2157
191k
    }
<smallvec::SmallVec<[u64; 8]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
17.8M
    fn drop(&mut self) {
2149
        unsafe {
2150
17.8M
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
17.8M
            } else {
2154
17.8M
                ptr::drop_in_place(&mut self[..]);
2155
17.8M
            }
2156
        }
2157
17.8M
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
663k
    fn drop(&mut self) {
2149
        unsafe {
2150
663k
            if self.spilled() {
2151
51.5k
                let (ptr, &mut len) = self.data.heap_mut();
2152
51.5k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
612k
            } else {
2154
612k
                ptr::drop_in_place(&mut self[..]);
2155
612k
            }
2156
        }
2157
663k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
166k
    fn drop(&mut self) {
2149
        unsafe {
2150
166k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
166k
            } else {
2154
166k
                ptr::drop_in_place(&mut self[..]);
2155
166k
            }
2156
        }
2157
166k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]> as core::ops::drop::Drop>::drop
<smallvec::SmallVec<[u64; 8]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
43.0k
    fn drop(&mut self) {
2149
        unsafe {
2150
43.0k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
43.0k
            } else {
2154
43.0k
                ptr::drop_in_place(&mut self[..]);
2155
43.0k
            }
2156
        }
2157
43.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
479k
    fn drop(&mut self) {
2149
        unsafe {
2150
479k
            if self.spilled() {
2151
39.1k
                let (ptr, &mut len) = self.data.heap_mut();
2152
39.1k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
440k
            } else {
2154
440k
                ptr::drop_in_place(&mut self[..]);
2155
440k
            }
2156
        }
2157
479k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
104k
    fn drop(&mut self) {
2149
        unsafe {
2150
104k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
104k
            } else {
2154
104k
                ptr::drop_in_place(&mut self[..]);
2155
104k
            }
2156
        }
2157
104k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
3.57k
    fn drop(&mut self) {
2149
        unsafe {
2150
3.57k
            if self.spilled() {
2151
1.32k
                let (ptr, &mut len) = self.data.heap_mut();
2152
1.32k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
2.25k
            } else {
2154
2.25k
                ptr::drop_in_place(&mut self[..]);
2155
2.25k
            }
2156
        }
2157
3.57k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
45.6k
    fn drop(&mut self) {
2149
        unsafe {
2150
45.6k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
45.6k
            } else {
2154
45.6k
                ptr::drop_in_place(&mut self[..]);
2155
45.6k
            }
2156
        }
2157
45.6k
    }
Unexecuted instantiation: <smallvec::SmallVec<[u64; 8]> as core::ops::drop::Drop>::drop
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
559k
    fn drop(&mut self) {
2149
        unsafe {
2150
559k
            if self.spilled() {
2151
64.6k
                let (ptr, &mut len) = self.data.heap_mut();
2152
64.6k
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
494k
            } else {
2154
494k
                ptr::drop_in_place(&mut self[..]);
2155
494k
            }
2156
        }
2157
559k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::ops::drop::Drop>::drop
Line
Count
Source
2148
175k
    fn drop(&mut self) {
2149
        unsafe {
2150
175k
            if self.spilled() {
2151
0
                let (ptr, &mut len) = self.data.heap_mut();
2152
0
                drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2153
175k
            } else {
2154
175k
                ptr::drop_in_place(&mut self[..]);
2155
175k
            }
2156
        }
2157
175k
    }
2158
}
2159
2160
impl<A: Array> Clone for SmallVec<A>
2161
where
2162
    A::Item: Clone,
2163
{
2164
    #[inline]
2165
88.9k
    fn clone(&self) -> SmallVec<A> {
2166
88.9k
        SmallVec::from(self.as_slice())
2167
88.9k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::clone::Clone>::clone
Line
Count
Source
2165
1.36k
    fn clone(&self) -> SmallVec<A> {
2166
1.36k
        SmallVec::from(self.as_slice())
2167
1.36k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::clone::Clone>::clone
Line
Count
Source
2165
29.0k
    fn clone(&self) -> SmallVec<A> {
2166
29.0k
        SmallVec::from(self.as_slice())
2167
29.0k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::clone::Clone>::clone
Line
Count
Source
2165
25.3k
    fn clone(&self) -> SmallVec<A> {
2166
25.3k
        SmallVec::from(self.as_slice())
2167
25.3k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::clone::Clone>::clone
Line
Count
Source
2165
32.2k
    fn clone(&self) -> SmallVec<A> {
2166
32.2k
        SmallVec::from(self.as_slice())
2167
32.2k
    }
<smallvec::SmallVec<[(u64, u64); 4]> as core::clone::Clone>::clone
Line
Count
Source
2165
930
    fn clone(&self) -> SmallVec<A> {
2166
930
        SmallVec::from(self.as_slice())
2167
930
    }
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
2185
impl<A: Array, B: Array> PartialEq<SmallVec<B>> for SmallVec<A>
2186
where
2187
    A::Item: PartialEq<B::Item>,
2188
{
2189
    #[inline]
2190
    fn eq(&self, other: &SmallVec<B>) -> bool {
2191
        self[..] == other[..]
2192
    }
2193
}
2194
2195
impl<A: Array> Eq for SmallVec<A> where A::Item: Eq {}
2196
2197
impl<A: Array> PartialOrd for SmallVec<A>
2198
where
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
2207
impl<A: Array> Ord for SmallVec<A>
2208
where
2209
    A::Item: Ord,
2210
{
2211
    #[inline]
2212
    fn cmp(&self, other: &SmallVec<A>) -> cmp::Ordering {
2213
        Ord::cmp(&**self, &**other)
2214
    }
2215
}
2216
2217
impl<A: Array> Hash for SmallVec<A>
2218
where
2219
    A::Item: Hash,
2220
{
2221
    fn hash<H: Hasher>(&self, state: &mut H) {
2222
        (**self).hash(state)
2223
    }
2224
}
2225
2226
unsafe 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
2233
pub struct IntoIter<A: Array> {
2234
    data: SmallVec<A>,
2235
    current: usize,
2236
    end: usize,
2237
}
2238
2239
impl<A: Array> fmt::Debug for IntoIter<A>
2240
where
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
2248
impl<A: Array + Clone> Clone for IntoIter<A>
2249
where
2250
    A::Item: Clone,
2251
{
2252
    fn clone(&self) -> IntoIter<A> {
2253
        SmallVec::from(self.as_slice()).into_iter()
2254
    }
2255
}
2256
2257
impl<A: Array> Drop for IntoIter<A> {
2258
139k
    fn drop(&mut self) {
2259
139k
        for _ in self {}
2260
139k
    }
<smallvec::IntoIter<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2258
7.11k
    fn drop(&mut self) {
2259
7.11k
        for _ in self {}
2260
7.11k
    }
<smallvec::IntoIter<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2258
31.6k
    fn drop(&mut self) {
2259
31.6k
        for _ in self {}
2260
31.6k
    }
<smallvec::IntoIter<[quiche::frame::Frame; 1]> as core::ops::drop::Drop>::drop
Line
Count
Source
2258
100k
    fn drop(&mut self) {
2259
100k
        for _ in self {}
2260
100k
    }
Unexecuted instantiation: <smallvec::IntoIter<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
Unexecuted instantiation: <smallvec::IntoIter<[u64; 1]> as core::ops::drop::Drop>::drop
Unexecuted instantiation: <smallvec::IntoIter<[(u64, usize); 1]> as core::ops::drop::Drop>::drop
2261
}
2262
2263
impl<A: Array> Iterator for IntoIter<A> {
2264
    type Item = A::Item;
2265
2266
    #[inline]
2267
420k
    fn next(&mut self) -> Option<A::Item> {
2268
420k
        if self.current == self.end {
2269
279k
            None
2270
        } else {
2271
            unsafe {
2272
140k
                let current = self.current;
2273
140k
                self.current += 1;
2274
140k
                Some(ptr::read(self.data.as_ptr().add(current)))
2275
            }
2276
        }
2277
420k
    }
<smallvec::IntoIter<[(u64, usize); 1]> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
2267
14.9k
    fn next(&mut self) -> Option<A::Item> {
2268
14.9k
        if self.current == self.end {
2269
14.2k
            None
2270
        } else {
2271
            unsafe {
2272
737
                let current = self.current;
2273
737
                self.current += 1;
2274
737
                Some(ptr::read(self.data.as_ptr().add(current)))
2275
            }
2276
        }
2277
14.9k
    }
<smallvec::IntoIter<[(u64, usize); 1]> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
2267
66.5k
    fn next(&mut self) -> Option<A::Item> {
2268
66.5k
        if self.current == self.end {
2269
63.3k
            None
2270
        } else {
2271
            unsafe {
2272
3.20k
                let current = self.current;
2273
3.20k
                self.current += 1;
2274
3.20k
                Some(ptr::read(self.data.as_ptr().add(current)))
2275
            }
2276
        }
2277
66.5k
    }
Unexecuted instantiation: <smallvec::IntoIter<[u64; 1]> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <smallvec::IntoIter<[(u64, usize); 1]> as core::iter::traits::iterator::Iterator>::next
<smallvec::IntoIter<[quiche::frame::Frame; 1]> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
2267
338k
    fn next(&mut self) -> Option<A::Item> {
2268
338k
        if self.current == self.end {
2269
201k
            None
2270
        } else {
2271
            unsafe {
2272
136k
                let current = self.current;
2273
136k
                self.current += 1;
2274
136k
                Some(ptr::read(self.data.as_ptr().add(current)))
2275
            }
2276
        }
2277
338k
    }
Unexecuted instantiation: <smallvec::IntoIter<[(u64, usize); 1]> as core::iter::traits::iterator::Iterator>::next
2278
2279
    #[inline]
2280
46.0k
    fn size_hint(&self) -> (usize, Option<usize>) {
2281
46.0k
        let size = self.end - self.current;
2282
46.0k
        (size, Some(size))
2283
46.0k
    }
2284
}
2285
2286
impl<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
2300
impl<A: Array> ExactSizeIterator for IntoIter<A> {}
2301
impl<A: Array> FusedIterator for IntoIter<A> {}
2302
2303
impl<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
2317
impl<A: Array> IntoIterator for SmallVec<A> {
2318
    type IntoIter = IntoIter<A>;
2319
    type Item = A::Item;
2320
139k
    fn into_iter(mut self) -> Self::IntoIter {
2321
        unsafe {
2322
            // Set SmallVec len to zero as `IntoIter` drop handles dropping of the elements
2323
139k
            let len = self.len();
2324
139k
            self.set_len(0);
2325
139k
            IntoIter {
2326
139k
                data: self,
2327
139k
                current: 0,
2328
139k
                end: len,
2329
139k
            }
2330
        }
2331
139k
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2320
7.11k
    fn into_iter(mut self) -> Self::IntoIter {
2321
        unsafe {
2322
            // Set SmallVec len to zero as `IntoIter` drop handles dropping of the elements
2323
7.11k
            let len = self.len();
2324
7.11k
            self.set_len(0);
2325
7.11k
            IntoIter {
2326
7.11k
                data: self,
2327
7.11k
                current: 0,
2328
7.11k
                end: len,
2329
7.11k
            }
2330
        }
2331
7.11k
    }
<smallvec::SmallVec<[(u64, usize); 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2320
31.6k
    fn into_iter(mut self) -> Self::IntoIter {
2321
        unsafe {
2322
            // Set SmallVec len to zero as `IntoIter` drop handles dropping of the elements
2323
31.6k
            let len = self.len();
2324
31.6k
            self.set_len(0);
2325
31.6k
            IntoIter {
2326
31.6k
                data: self,
2327
31.6k
                current: 0,
2328
31.6k
                end: len,
2329
31.6k
            }
2330
        }
2331
31.6k
    }
<smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2320
100k
    fn into_iter(mut self) -> Self::IntoIter {
2321
        unsafe {
2322
            // Set SmallVec len to zero as `IntoIter` drop handles dropping of the elements
2323
100k
            let len = self.len();
2324
100k
            self.set_len(0);
2325
100k
            IntoIter {
2326
100k
                data: self,
2327
100k
                current: 0,
2328
100k
                end: len,
2329
100k
            }
2330
        }
2331
100k
    }
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Unexecuted instantiation: <smallvec::SmallVec<[u64; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Unexecuted instantiation: <smallvec::SmallVec<[(u64, usize); 1]> as core::iter::traits::collect::IntoIterator>::into_iter
2332
}
2333
2334
impl<'a, A: Array> IntoIterator for &'a SmallVec<A> {
2335
    type IntoIter = slice::Iter<'a, A::Item>;
2336
    type Item = &'a A::Item;
2337
0
    fn into_iter(self) -> Self::IntoIter {
2338
0
        self.iter()
2339
0
    }
2340
}
2341
2342
impl<'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
1.56M
    fn into_iter(self) -> Self::IntoIter {
2346
1.56M
        self.iter_mut()
2347
1.56M
    }
<&mut smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2345
4.61k
    fn into_iter(self) -> Self::IntoIter {
2346
4.61k
        self.iter_mut()
2347
4.61k
    }
<&mut smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2345
1.47M
    fn into_iter(self) -> Self::IntoIter {
2346
1.47M
        self.iter_mut()
2347
1.47M
    }
<&mut smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2345
75.3k
    fn into_iter(self) -> Self::IntoIter {
2346
75.3k
        self.iter_mut()
2347
75.3k
    }
<&mut smallvec::SmallVec<[quiche::frame::Frame; 1]> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
2345
3.68k
    fn into_iter(self) -> Self::IntoIter {
2346
3.68k
        self.iter_mut()
2347
3.68k
    }
2348
}
2349
2350
/// Types that can be used as the backing store for a [`SmallVec`].
2351
pub 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>
2361
struct SetLenOnDrop<'a> {
2362
    len: &'a mut usize,
2363
    local_len: usize,
2364
}
2365
2366
impl<'a> SetLenOnDrop<'a> {
2367
    #[inline]
2368
18.0M
    fn new(len: &'a mut usize) -> Self {
2369
18.0M
        SetLenOnDrop {
2370
18.0M
            local_len: *len,
2371
18.0M
            len,
2372
18.0M
        }
2373
18.0M
    }
2374
2375
    #[inline]
2376
29.8M
    fn get(&self) -> usize {
2377
29.8M
        self.local_len
2378
29.8M
    }
2379
2380
    #[inline]
2381
5.90M
    fn increment_len(&mut self, increment: usize) {
2382
5.90M
        self.local_len += increment;
2383
5.90M
    }
2384
}
2385
2386
impl<'a> Drop for SetLenOnDrop<'a> {
2387
    #[inline]
2388
18.0M
    fn drop(&mut self) {
2389
18.0M
        *self.len = self.local_len;
2390
18.0M
    }
2391
}
2392
2393
#[cfg(feature = "const_new")]
2394
impl<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")))]
2436
unsafe 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"))]
2445
macro_rules! impl_array(
2446
    ($($size:expr),+) => {
2447
        $(
2448
            unsafe impl<T> Array for [T; $size] {
2449
                type Item = T;
2450
                #[inline]
2451
324M
                fn size() -> usize { $size }
<[u64; 8] as smallvec::Array>::size
Line
Count
Source
2451
7.64k
                fn size() -> usize { $size }
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
56.8k
                fn size() -> usize { $size }
<[(u64, usize); 1] as smallvec::Array>::size
Line
Count
Source
2451
58.4k
                fn size() -> usize { $size }
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
984k
                fn size() -> usize { $size }
<[u64; 8] as smallvec::Array>::size
Line
Count
Source
2451
190M
                fn size() -> usize { $size }
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
109M
                fn size() -> usize { $size }
<[(u64, usize); 1] as smallvec::Array>::size
Line
Count
Source
2451
259k
                fn size() -> usize { $size }
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
833k
                fn size() -> usize { $size }
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
12.8M
                fn size() -> usize { $size }
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
4.97M
                fn size() -> usize { $size }
<[u64; 8] as smallvec::Array>::size
Line
Count
Source
2451
430k
                fn size() -> usize { $size }
<[(u64, usize); 1] as smallvec::Array>::size
Line
Count
Source
2451
7.89k
                fn size() -> usize { $size }
Unexecuted instantiation: <[u64; 1] as smallvec::Array>::size
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
1.36M
                fn size() -> usize { $size }
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
313k
                fn size() -> usize { $size }
Unexecuted instantiation: <[u64; 8] as smallvec::Array>::size
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
42.5k
                fn size() -> usize { $size }
Unexecuted instantiation: <[(u64, usize); 1] as smallvec::Array>::size
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
143k
                fn size() -> usize { $size }
<[quiche::frame::Frame; 1] as smallvec::Array>::size
Line
Count
Source
2451
1.54M
                fn size() -> usize { $size }
<[(u64, u64); 4] as smallvec::Array>::size
Line
Count
Source
2451
526k
                fn size() -> usize { $size }
2452
            }
2453
        )+
2454
    }
2455
);
2456
2457
#[cfg(not(feature = "const_generics"))]
2458
impl_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`
2465
pub trait ToSmallVec<A: Array> {
2466
    /// Construct a new `SmallVec` from a slice.
2467
    fn to_smallvec(&self) -> SmallVec<A>;
2468
}
2469
2470
impl<A: Array> ToSmallVec<A> for [A::Item]
2471
where
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)]
2482
struct ConstNonNull<T>(NonNull<T>);
2483
2484
impl<T> ConstNonNull<T> {
2485
    #[inline]
2486
52.2M
    fn new(ptr: *const T) -> Option<Self> {
2487
52.2M
        NonNull::new(ptr as *mut T).map(Self)
2488
52.2M
    }
<smallvec::ConstNonNull<quiche::frame::Frame>>::new
Line
Count
Source
2486
6.77k
    fn new(ptr: *const T) -> Option<Self> {
2487
6.77k
        NonNull::new(ptr as *mut T).map(Self)
2488
6.77k
    }
<smallvec::ConstNonNull<(u64, u64)>>::new
Line
Count
Source
2486
1.72k
    fn new(ptr: *const T) -> Option<Self> {
2487
1.72k
        NonNull::new(ptr as *mut T).map(Self)
2488
1.72k
    }
<smallvec::ConstNonNull<u64>>::new
Line
Count
Source
2486
764
    fn new(ptr: *const T) -> Option<Self> {
2487
764
        NonNull::new(ptr as *mut T).map(Self)
2488
764
    }
<smallvec::ConstNonNull<(u64, usize)>>::new
Line
Count
Source
2486
7.85k
    fn new(ptr: *const T) -> Option<Self> {
2487
7.85k
        NonNull::new(ptr as *mut T).map(Self)
2488
7.85k
    }
<smallvec::ConstNonNull<u64>>::new
Line
Count
Source
2486
23.7M
    fn new(ptr: *const T) -> Option<Self> {
2487
23.7M
        NonNull::new(ptr as *mut T).map(Self)
2488
23.7M
    }
<smallvec::ConstNonNull<quiche::frame::Frame>>::new
Line
Count
Source
2486
23.8M
    fn new(ptr: *const T) -> Option<Self> {
2487
23.8M
        NonNull::new(ptr as *mut T).map(Self)
2488
23.8M
    }
<smallvec::ConstNonNull<(u64, usize)>>::new
Line
Count
Source
2486
34.8k
    fn new(ptr: *const T) -> Option<Self> {
2487
34.8k
        NonNull::new(ptr as *mut T).map(Self)
2488
34.8k
    }
<smallvec::ConstNonNull<(u64, u64)>>::new
Line
Count
Source
2486
53.0k
    fn new(ptr: *const T) -> Option<Self> {
2487
53.0k
        NonNull::new(ptr as *mut T).map(Self)
2488
53.0k
    }
<smallvec::ConstNonNull<(u64, u64)>>::new
Line
Count
Source
2486
3.86M
    fn new(ptr: *const T) -> Option<Self> {
2487
3.86M
        NonNull::new(ptr as *mut T).map(Self)
2488
3.86M
    }
<smallvec::ConstNonNull<quiche::frame::Frame>>::new
Line
Count
Source
2486
711k
    fn new(ptr: *const T) -> Option<Self> {
2487
711k
        NonNull::new(ptr as *mut T).map(Self)
2488
711k
    }
Unexecuted instantiation: <smallvec::ConstNonNull<(u64, usize)>>::new
<smallvec::ConstNonNull<u64>>::new
Line
Count
Source
2486
43.0k
    fn new(ptr: *const T) -> Option<Self> {
2487
43.0k
        NonNull::new(ptr as *mut T).map(Self)
2488
43.0k
    }
<smallvec::ConstNonNull<quiche::frame::Frame>>::new
Line
Count
Source
2486
3.68k
    fn new(ptr: *const T) -> Option<Self> {
2487
3.68k
        NonNull::new(ptr as *mut T).map(Self)
2488
3.68k
    }
<smallvec::ConstNonNull<(u64, u64)>>::new
Line
Count
Source
2486
930
    fn new(ptr: *const T) -> Option<Self> {
2487
930
        NonNull::new(ptr as *mut T).map(Self)
2488
930
    }
Unexecuted instantiation: <smallvec::ConstNonNull<u64>>::new
Unexecuted instantiation: <smallvec::ConstNonNull<(u64, usize)>>::new
2489
    #[inline]
2490
26.2M
    fn as_ptr(self) -> *const T {
2491
26.2M
        self.0.as_ptr()
2492
26.2M
    }
<smallvec::ConstNonNull<u64>>::as_ptr
Line
Count
Source
2490
764
    fn as_ptr(self) -> *const T {
2491
764
        self.0.as_ptr()
2492
764
    }
<smallvec::ConstNonNull<(u64, usize)>>::as_ptr
Line
Count
Source
2490
737
    fn as_ptr(self) -> *const T {
2491
737
        self.0.as_ptr()
2492
737
    }
<smallvec::ConstNonNull<(u64, u64)>>::as_ptr
Line
Count
Source
2490
1.36k
    fn as_ptr(self) -> *const T {
2491
1.36k
        self.0.as_ptr()
2492
1.36k
    }
<smallvec::ConstNonNull<u64>>::as_ptr
Line
Count
Source
2490
23.7M
    fn as_ptr(self) -> *const T {
2491
23.7M
        self.0.as_ptr()
2492
23.7M
    }
<smallvec::ConstNonNull<(u64, usize)>>::as_ptr
Line
Count
Source
2490
3.20k
    fn as_ptr(self) -> *const T {
2491
3.20k
        self.0.as_ptr()
2492
3.20k
    }
<smallvec::ConstNonNull<(u64, u64)>>::as_ptr
Line
Count
Source
2490
29.0k
    fn as_ptr(self) -> *const T {
2491
29.0k
        self.0.as_ptr()
2492
29.0k
    }
Unexecuted instantiation: <smallvec::ConstNonNull<(u64, usize)>>::as_ptr
<smallvec::ConstNonNull<quiche::frame::Frame>>::as_ptr
Line
Count
Source
2490
395k
    fn as_ptr(self) -> *const T {
2491
395k
        self.0.as_ptr()
2492
395k
    }
<smallvec::ConstNonNull<(u64, u64)>>::as_ptr
Line
Count
Source
2490
2.04M
    fn as_ptr(self) -> *const T {
2491
2.04M
        self.0.as_ptr()
2492
2.04M
    }
<smallvec::ConstNonNull<u64>>::as_ptr
Line
Count
Source
2490
43.0k
    fn as_ptr(self) -> *const T {
2491
43.0k
        self.0.as_ptr()
2492
43.0k
    }
<smallvec::ConstNonNull<(u64, u64)>>::as_ptr
Line
Count
Source
2490
930
    fn as_ptr(self) -> *const T {
2491
930
        self.0.as_ptr()
2492
930
    }
Unexecuted instantiation: <smallvec::ConstNonNull<(u64, usize)>>::as_ptr
Unexecuted instantiation: <smallvec::ConstNonNull<u64>>::as_ptr
2493
}
2494
2495
impl<T> Clone for ConstNonNull<T> {
2496
    #[inline]
2497
    fn clone(&self) -> Self {
2498
        *self
2499
    }
2500
}
2501
2502
impl<T> Copy for ConstNonNull<T> {}
2503
2504
#[cfg(feature = "impl_bincode")]
2505
use 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")]
2513
impl<A, Context> Decode<Context> for SmallVec<A>
2514
where
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")]
2550
impl<'de, A, Context> BorrowDecode<'de, Context> for SmallVec<A>
2551
where
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")]
2587
impl<A> Encode for SmallVec<A>
2588
where
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
}