alloc/vec/mod.rs
1//! A contiguous growable array type with heap-allocated contents, written
2//! `Vec<T>`.
3//!
4//! Vectors have *O*(1) indexing, amortized *O*(1) push (to the end) and
5//! *O*(1) pop (from the end).
6//!
7//! Vectors ensure they never allocate more than `isize::MAX` bytes.
8//!
9//! # Examples
10//!
11//! You can explicitly create a [`Vec`] with [`Vec::new`]:
12//!
13//! ```
14//! let v: Vec<i32> = Vec::new();
15//! ```
16//!
17//! ...or by using the [`vec!`] macro:
18//!
19//! ```
20//! let v: Vec<i32> = vec![];
21//!
22//! let v = vec![1, 2, 3, 4, 5];
23//!
24//! let v = vec![0; 10]; // ten zeroes
25//! ```
26//!
27//! You can [`push`] values onto the end of a vector (which will grow the vector
28//! as needed):
29//!
30//! ```
31//! let mut v = vec![1, 2];
32//!
33//! v.push(3);
34//! ```
35//!
36//! Popping values works in much the same way:
37//!
38//! ```
39//! let mut v = vec![1, 2];
40//!
41//! let two = v.pop();
42//! ```
43//!
44//! Vectors also support indexing (through the [`Index`] and [`IndexMut`] traits):
45//!
46//! ```
47//! let mut v = vec![1, 2, 3];
48//! let three = v[2];
49//! v[1] = v[1] + 5;
50//! ```
51//!
52//! # Memory layout
53//!
54//! A [`Vec`] conceptually consists of a raw pointer `ptr` to the start of the allocation, a
55//! length `len`, a capacity `cap`, and an allocator `alloc`.
56//! While the exact fields and their order are not specified, a [`Vec`] can be converted to and
57//! from these parts using [`Vec::into_raw_parts_with_allocator`], [`Vec::from_raw_parts_in`],
58//! [`Vec::into_raw_parts`], and [`Vec::from_raw_parts`], as well as their [`NonNull`]-based
59//! versions.
60//!
61//! The parts of a [`Vec`] have the following invariants:
62//!
63//! * If [`size_of::<T>()`](size_of) and `cap` are non-zero, then:
64//! - `ptr` must point to the start of a memory block [*currently allocated*] via `alloc`.
65//! - [`Layout::array::<T>(cap)`] must [*fit*] the memory block of `ptr`. In particular,
66//! * `T` must have the same alignment as the [`Layout`] `ptr` was allocated with, and
67//! * `size_of::<T>() * cap` must be at least the size of the [`Layout`] `ptr` was
68//! allocated with, and at most the size of the allocation returned the allocator.
69//! - `size_of::<T>() * cap` must be at most [`isize::MAX`].
70//! See the safety documentation of [`pointer::offset`].
71//! * If [`size_of::<T>()`](size_of) or `cap` is zero, then `ptr` must be any sufficiently aligned non-null pointer.
72//!
73//! NOTE: `ptr` will not be passed to the allocator for deallocation by the destructor of [`Vec`]
74//! in this case. Thus, it is unwise to use a pointer acquired from the allocator for this, as
75//! overallocated memory may end up being leaked. Use [`ptr::dangling`] instead.
76//! * The following must always be satisfied:
77//! - `len` needs to be less than or equal to `cap`.
78//! - At `ptr`, there are at least `len` valid values of type `T`, laid out contiguously
79//! (like an array). These values are considered owned by the [`Vec`].
80//!
81//! It is sound to create a [`Vec`] from parts that satisfy these invariants.
82//!
83//! Conversely, the memory backing `ptr` obtained from [`Vec::as_mut_ptr`] or
84//! [`Vec::into_raw_parts_with_allocator`]-like methods may be deallocated
85//! using the allocator, with layout [`Layout::array::<T>(cap)`], provided
86//! that [`size_of::<T>()`](size_of) or `cap` is non-zero.
87//! To automatically handle the case where the allocation is zero-sized,
88//! it is recommended to use [`Vec::from_raw_parts_in`], instead of manually
89//! deallocating.
90//!
91//! [*fit*]: crate::alloc::Allocator#memory-fitting
92//! [*currently allocated*]: crate::alloc::Allocator#currently-allocated-memory
93//! [`allocate`]: crate::alloc::Allocator::allocate
94//! [`push`]: Vec::push
95//! [`ptr::NonNull::dangling`]: NonNull::dangling
96//! [`Layout`]: crate::alloc::Layout
97//! [`Layout::array::<T>(cap)`]: crate::alloc::Layout::array
98
99#![stable(feature = "rust1", since = "1.0.0")]
100
101#[cfg(not(no_global_oom_handling))]
102use core::clone::TrivialClone;
103use core::cmp::Ordering;
104use core::hash::{Hash, Hasher};
105#[cfg(not(no_global_oom_handling))]
106use core::iter;
107use core::marker::{Destruct, Freeze, PhantomData};
108use core::mem::{self, Assume, ManuallyDrop, MaybeUninit, SizedTypeProperties, TransmuteFrom};
109use core::ops::{self, Index, IndexMut, Range, RangeBounds};
110use core::ptr::{self, NonNull};
111use core::slice::{self, SliceIndex};
112use core::{cmp, fmt, hint, intrinsics, ub_checks};
113
114#[stable(feature = "extract_if", since = "1.87.0")]
115pub use self::extract_if::ExtractIf;
116use crate::alloc::{Allocator, AllocatorNightly, Global};
117use crate::borrow::{Cow, ToOwned};
118use crate::boxed::Box;
119use crate::collections::TryReserveError;
120use crate::raw_vec::RawVec;
121
122mod extract_if;
123
124#[cfg(not(no_global_oom_handling))]
125#[stable(feature = "vec_splice", since = "1.21.0")]
126pub use self::splice::Splice;
127
128#[cfg(not(no_global_oom_handling))]
129mod splice;
130
131#[stable(feature = "drain", since = "1.6.0")]
132pub use self::drain::Drain;
133
134mod drain;
135
136#[cfg(not(no_global_oom_handling))]
137mod cow;
138
139#[cfg(not(no_global_oom_handling))]
140pub(crate) use self::in_place_collect::AsVecIntoIter;
141#[stable(feature = "rust1", since = "1.0.0")]
142pub use self::into_iter::IntoIter;
143
144mod into_iter;
145
146#[cfg(not(no_global_oom_handling))]
147use self::is_zero::IsZero;
148
149#[cfg(not(no_global_oom_handling))]
150mod is_zero;
151
152#[cfg(not(no_global_oom_handling))]
153mod in_place_collect;
154
155mod partial_eq;
156
157#[unstable(feature = "vec_peek_mut", issue = "122742")]
158pub use self::peek_mut::PeekMut;
159
160mod peek_mut;
161
162#[cfg(not(no_global_oom_handling))]
163use self::spec_from_elem::SpecFromElem;
164
165#[cfg(not(no_global_oom_handling))]
166mod spec_from_elem;
167
168#[cfg(not(no_global_oom_handling))]
169use self::set_len_on_drop::SetLenOnDrop;
170
171#[cfg(not(no_global_oom_handling))]
172mod set_len_on_drop;
173
174#[cfg(not(no_global_oom_handling))]
175use self::in_place_drop::{InPlaceDrop, InPlaceDstDataSrcBufDrop};
176
177#[cfg(not(no_global_oom_handling))]
178mod in_place_drop;
179
180#[cfg(not(no_global_oom_handling))]
181use self::spec_from_iter_nested::SpecFromIterNested;
182
183#[cfg(not(no_global_oom_handling))]
184mod spec_from_iter_nested;
185
186#[cfg(not(no_global_oom_handling))]
187use self::spec_from_iter::SpecFromIter;
188
189#[cfg(not(no_global_oom_handling))]
190mod spec_from_iter;
191
192#[cfg(not(no_global_oom_handling))]
193use self::spec_extend::SpecExtend;
194
195#[cfg(not(no_global_oom_handling))]
196mod spec_extend;
197
198#[cfg(not(no_global_oom_handling))]
199use self::spec_extend_with::SpecExtendWith;
200
201#[cfg(not(no_global_oom_handling))]
202mod spec_extend_with;
203
204#[cfg(all(target_arch = "aarch64", target_feature = "sve"))]
205mod sve_retain;
206
207/// A contiguous growable array type, written as `Vec<T>`, short for 'vector'.
208///
209/// # Examples
210///
211/// ```
212/// let mut vec = Vec::new();
213/// vec.push(1);
214/// vec.push(2);
215///
216/// assert_eq!(vec.len(), 2);
217/// assert_eq!(vec[0], 1);
218///
219/// assert_eq!(vec.pop(), Some(2));
220/// assert_eq!(vec.len(), 1);
221///
222/// vec[0] = 7;
223/// assert_eq!(vec[0], 7);
224///
225/// vec.extend([1, 2, 3]);
226///
227/// for x in &vec {
228/// println!("{x}");
229/// }
230/// assert_eq!(vec, [7, 1, 2, 3]);
231/// ```
232///
233/// The [`vec!`] macro is provided for convenient initialization:
234///
235/// ```
236/// let mut vec1 = vec![1, 2, 3];
237/// vec1.push(4);
238/// let vec2 = Vec::from([1, 2, 3, 4]);
239/// assert_eq!(vec1, vec2);
240/// ```
241///
242/// It can also initialize each element of a `Vec<T>` with a given value.
243/// This may be more efficient than performing allocation and initialization
244/// in separate steps, especially when initializing a vector of zeros:
245///
246/// ```
247/// let vec = vec![0; 5];
248/// assert_eq!(vec, [0, 0, 0, 0, 0]);
249///
250/// // The following is equivalent, but potentially slower:
251/// let mut vec = Vec::with_capacity(5);
252/// vec.resize(5, 0);
253/// assert_eq!(vec, [0, 0, 0, 0, 0]);
254/// ```
255///
256/// For more information, see
257/// [Capacity and Reallocation](#capacity-and-reallocation).
258///
259/// Use a `Vec<T>` as an efficient stack:
260///
261/// ```
262/// let mut stack = Vec::new();
263///
264/// stack.push(1);
265/// stack.push(2);
266/// stack.push(3);
267///
268/// while let Some(top) = stack.pop() {
269/// // Prints 3, 2, 1
270/// println!("{top}");
271/// }
272/// ```
273///
274/// # Indexing
275///
276/// The `Vec` type allows access to values by index, because it implements the
277/// [`Index`] trait. An example will be more explicit:
278///
279/// ```
280/// let v = vec![0, 2, 4, 6];
281/// println!("{}", v[1]); // it will display '2'
282/// ```
283///
284/// However be careful: if you try to access an index which isn't in the `Vec`,
285/// your software will panic! You cannot do this:
286///
287/// ```should_panic
288/// let v = vec![0, 2, 4, 6];
289/// println!("{}", v[6]); // it will panic!
290/// ```
291///
292/// Use [`get`] and [`get_mut`] if you want to check whether the index is in
293/// the `Vec`.
294///
295/// # Slicing
296///
297/// A `Vec` can be mutable. On the other hand, slices are read-only objects.
298/// To get a [slice][prim@slice], use [`&`]. Example:
299///
300/// ```
301/// fn read_slice(slice: &[usize]) {
302/// // ...
303/// }
304///
305/// let v = vec![0, 1];
306/// read_slice(&v);
307///
308/// // ... and that's all!
309/// // you can also do it like this:
310/// let u: &[usize] = &v;
311/// // or like this:
312/// let u: &[_] = &v;
313/// ```
314///
315/// In Rust, it's more common to pass slices as arguments rather than vectors
316/// when you just want to provide read access. The same goes for [`String`] and
317/// [`&str`].
318///
319/// # Capacity and reallocation
320///
321/// The capacity of a vector is the amount of space allocated for any future
322/// elements that will be added onto the vector. This is not to be confused with
323/// the *length* of a vector, which specifies the number of actual elements
324/// within the vector. If a vector's length exceeds its capacity, its capacity
325/// will automatically be increased, but its elements will have to be
326/// reallocated.
327///
328/// For example, a vector with capacity 10 and length 0 would be an empty vector
329/// with space for 10 more elements. Pushing 10 or fewer elements onto the
330/// vector will not change its capacity or cause reallocation to occur. However,
331/// if the vector's length is increased to 11, it will have to reallocate, which
332/// can be slow. For this reason, it is recommended to use [`Vec::with_capacity`]
333/// whenever possible to specify how big the vector is expected to get.
334///
335/// # Guarantees
336///
337/// The following section is to be read as an addendum of the
338/// [memory layout](self#memory-layout) section.
339///
340/// Due to its incredibly fundamental nature, `Vec` makes a lot of guarantees
341/// about its design. This ensures that it's as low-overhead as possible in
342/// the general case, and can be correctly manipulated in primitive ways
343/// by unsafe code.
344///
345/// A vector containing the elements `'a'` and `'b'` with capacity 4 can be
346/// visualized as below. The top part is the `Vec` struct, it contains a
347/// pointer to the head of the allocation in the heap, length and capacity.
348/// The bottom part is the allocation on the heap, a contiguous memory block.
349///
350/// ```text
351/// ptr len capacity
352/// +--------+--------+--------+
353/// | 0x0123 | 2 | 4 |
354/// +--------+--------+--------+
355/// |
356/// v
357/// Heap +--------+--------+--------+--------+
358/// | 'a' | 'b' | uninit | uninit |
359/// +--------+--------+--------+--------+
360/// ```
361///
362/// - **uninit** represents memory that is not initialized, see [`MaybeUninit`].
363/// - Note: the ABI is not stable and `Vec` makes no guarantees about its memory
364/// layout (including the order of fields).
365///
366/// `Vec` will never perform a "small optimization" where elements are actually
367/// stored on the stack for two reasons:
368///
369/// * It would make it more difficult for unsafe code to correctly manipulate
370/// a `Vec`. The contents of a `Vec` wouldn't have a stable address if it were
371/// only moved, and it would be more difficult to determine if a `Vec` had
372/// actually allocated memory.
373///
374/// * It would penalize the general case, incurring an additional branch
375/// on every access.
376///
377/// `Vec` will never automatically shrink itself, even if completely empty. This
378/// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec`
379/// and then filling it back up to the same [`len`] should incur no calls to
380/// the allocator. If you wish to free up unused memory, use
381/// [`shrink_to_fit`] or [`shrink_to`].
382///
383/// [`push`] and [`insert`] will never (re)allocate if the reported capacity is
384/// sufficient. [`push`] and [`insert`] *will* (re)allocate if
385/// <code>[len] == [capacity]</code>. That is, the reported capacity is completely
386/// accurate, and can be relied on. It can even be used to manually free the memory
387/// allocated by a `Vec` if desired. Bulk insertion methods *may* reallocate, even
388/// when not necessary.
389///
390/// `Vec` does not guarantee any particular growth strategy when reallocating
391/// when full, nor when [`reserve`] is called. The current strategy is basic
392/// and it may prove desirable to use a non-constant growth factor. Whatever
393/// strategy is used will of course guarantee *O*(1) amortized [`push`].
394///
395/// It is guaranteed, in order to respect the intentions of the programmer, that
396/// all of `vec![e_1, e_2, ..., e_n]`, `vec![x; n]`, and [`Vec::with_capacity(n)`] produce a `Vec`
397/// that requests an allocation of the exact size needed for precisely `n` elements from the allocator,
398/// and no other size (such as, for example: a size rounded up to the nearest power of 2).
399/// The allocator will return an allocation that is at least as large as requested, but it may be larger.
400///
401/// It is guaranteed that the [`Vec::capacity`] method returns a value that is at least the requested capacity
402/// and not more than the allocated capacity.
403///
404/// The method [`Vec::shrink_to_fit`] will attempt to discard excess capacity an allocator has given to a `Vec`.
405/// If <code>[len] == [capacity]</code>, then a `Vec<T>` can be converted
406/// to and from a [`Box<[T]>`][owned slice] without reallocating or moving the elements.
407/// `Vec` exploits this fact as much as reasonable when implementing common conversions
408/// such as [`into_boxed_slice`].
409///
410/// `Vec` will not specifically overwrite any data that is removed from it,
411/// but also won't specifically preserve it. Its uninitialized memory is
412/// scratch space that it may use however it wants. It will generally just do
413/// whatever is most efficient or otherwise easy to implement. Do not rely on
414/// removed data to be erased for security purposes. Even if you drop a `Vec`, its
415/// buffer may simply be reused by another allocation. Even if you zero a `Vec`'s memory
416/// first, that might not actually happen because the optimizer does not consider
417/// this a side-effect that must be preserved. There is one case which we will
418/// not break, however: using `unsafe` code to write to the excess capacity,
419/// and then increasing the length to match, is always valid.
420///
421/// Currently, `Vec` does not guarantee the order in which elements are dropped.
422/// The order has changed in the past and may change again.
423///
424/// [`get`]: slice::get
425/// [`get_mut`]: slice::get_mut
426/// [`String`]: crate::string::String
427/// [`&str`]: type@str
428/// [`shrink_to_fit`]: Vec::shrink_to_fit
429/// [`shrink_to`]: Vec::shrink_to
430/// [capacity]: Vec::capacity
431/// [`capacity`]: Vec::capacity
432/// [`Vec::capacity`]: Vec::capacity
433/// [size_of::\<T>]: size_of
434/// [len]: Vec::len
435/// [`len`]: Vec::len
436/// [`push`]: Vec::push
437/// [`insert`]: Vec::insert
438/// [`reserve`]: Vec::reserve
439/// [`Vec::with_capacity(n)`]: Vec::with_capacity
440/// [`MaybeUninit`]: core::mem::MaybeUninit
441/// [owned slice]: Box
442/// [`into_boxed_slice`]: Vec::into_boxed_slice
443#[stable(feature = "rust1", since = "1.0.0")]
444#[rustc_diagnostic_item = "Vec"]
445#[rustc_insignificant_dtor]
446#[doc(alias = "list")]
447#[doc(alias = "vector")]
448pub struct Vec<T, #[stable(feature = "allocator_api", since = "1.100.0")] A: Allocator = Global> {
449 buf: RawVec<T, A>,
450 len: usize,
451}
452
453////////////////////////////////////////////////////////////////////////////////
454// Inherent methods
455////////////////////////////////////////////////////////////////////////////////
456
457impl<T> Vec<T> {
458 /// Constructs a new, empty `Vec<T>`.
459 ///
460 /// The vector will not allocate until elements are pushed onto it.
461 ///
462 /// # Examples
463 ///
464 /// ```
465 /// # #![allow(unused_mut)]
466 /// let mut vec: Vec<i32> = Vec::new();
467 /// ```
468 #[inline]
469 #[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")]
470 #[rustc_diagnostic_item = "vec_new"]
471 #[stable(feature = "rust1", since = "1.0.0")]
472 #[must_use]
473 pub const fn new() -> Self {
474 Vec { buf: RawVec::new(), len: 0 }
475 }
476
477 /// Constructs a new, empty `Vec<T>` with at least the specified capacity.
478 ///
479 /// The vector will be able to hold at least `capacity` elements without
480 /// reallocating. This method is allowed to allocate for more elements than
481 /// `capacity`. If `capacity` is zero, the vector [will not allocate].
482 ///
483 /// It is important to note that although the returned vector has the
484 /// minimum *capacity* specified, the vector will have a zero *length*. For
485 /// an explanation of the difference between length and capacity, see
486 /// *[Capacity and reallocation]*.
487 ///
488 /// If it is important to know the exact allocated capacity of a `Vec`,
489 /// always use the [`capacity`] method after construction.
490 ///
491 /// For `Vec<T>` where `T` is a zero-sized type, the vector
492 /// [will not allocate], and the capacity will always be `usize::MAX`.
493 ///
494 /// [Capacity and reallocation]: #capacity-and-reallocation
495 /// [`capacity`]: Vec::capacity
496 /// [will not allocate]: self#memory-layout
497 ///
498 /// # Panics
499 ///
500 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
501 ///
502 /// # Examples
503 ///
504 /// ```
505 /// let mut vec = Vec::with_capacity(10);
506 ///
507 /// // The vector contains no items, even though it has capacity for more
508 /// assert_eq!(vec.len(), 0);
509 /// assert!(vec.capacity() >= 10);
510 ///
511 /// // These are all done without reallocating...
512 /// for i in 0..10 {
513 /// vec.push(i);
514 /// }
515 /// assert_eq!(vec.len(), 10);
516 /// assert!(vec.capacity() >= 10);
517 ///
518 /// // ...but this may make the vector reallocate
519 /// vec.push(11);
520 /// assert_eq!(vec.len(), 11);
521 /// assert!(vec.capacity() >= 11);
522 ///
523 /// // A vector of a zero-sized type will always over-allocate, since no
524 /// // allocation is necessary
525 /// let vec_units = Vec::<()>::with_capacity(10);
526 /// assert_eq!(vec_units.capacity(), usize::MAX);
527 /// ```
528 #[cfg(not(no_global_oom_handling))]
529 #[inline]
530 #[stable(feature = "rust1", since = "1.0.0")]
531 #[must_use]
532 #[rustc_diagnostic_item = "vec_with_capacity"]
533 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
534 pub const fn with_capacity(capacity: usize) -> Self {
535 Self::with_capacity_in(capacity, Global)
536 }
537
538 /// Constructs a new, empty `Vec<T>` with at least the specified capacity.
539 ///
540 /// The vector will be able to hold at least `capacity` elements without
541 /// reallocating. This method is allowed to allocate for more elements than
542 /// `capacity`. If `capacity` is zero, the vector [will not allocate].
543 ///
544 /// # Errors
545 ///
546 /// Returns an error if the capacity exceeds `isize::MAX` _bytes_,
547 /// or if the allocator reports allocation failure.
548 ///
549 /// [will not allocate]: self#memory-layout
550 #[inline]
551 #[unstable(feature = "try_with_capacity", issue = "91913")]
552 pub fn try_with_capacity(capacity: usize) -> Result<Self, TryReserveError> {
553 Self::try_with_capacity_in(capacity, Global)
554 }
555
556 /// Creates a `Vec<T>` directly from a pointer, a length, and a capacity.
557 ///
558 /// # Safety
559 ///
560 /// The parts must satisfy the invariants described in the [memory layout] section,
561 /// with allocator [`Global`].
562 ///
563 /// Violating them may cause problems like corrupting the allocator's
564 /// internal data structures. For example it is normally **not** safe
565 /// to build a `Vec<u8>` from a pointer to a C `char` array with length
566 /// `size_t`, doing so is only safe if the array was initially allocated by
567 /// a `Vec` or `String`.
568 /// It's also not safe to build one from a `Vec<u16>` and its length, because
569 /// the allocator cares about the alignment, and these two types have different
570 /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
571 /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1. To avoid
572 /// these issues, it is often preferable to do casting/transmuting using
573 /// [`slice::from_raw_parts`] instead.
574 ///
575 /// The ownership of `ptr` is effectively transferred to the
576 /// `Vec<T>` which may then deallocate, reallocate or change the
577 /// contents of memory pointed to by the pointer at will. Ensure
578 /// that nothing else uses the pointer after calling this
579 /// function.
580 ///
581 /// [`String`]: crate::string::String
582 /// [memory layout]: self#memory-layout
583 ///
584 /// # Examples
585 ///
586 /// ```
587 /// use std::ptr;
588 ///
589 /// let v = vec![1, 2, 3];
590 ///
591 /// // Deconstruct the vector into parts.
592 /// let (p, len, cap) = v.into_raw_parts();
593 ///
594 /// unsafe {
595 /// // Overwrite memory with 4, 5, 6
596 /// for i in 0..len {
597 /// ptr::write(p.add(i), 4 + i);
598 /// }
599 ///
600 /// // Put everything back together into a Vec
601 /// let rebuilt = Vec::from_raw_parts(p, len, cap);
602 /// assert_eq!(rebuilt, [4, 5, 6]);
603 /// }
604 /// ```
605 ///
606 /// Using memory that was allocated elsewhere:
607 ///
608 /// ```rust
609 /// use std::alloc::{alloc, Layout};
610 ///
611 /// fn main() {
612 /// let layout = Layout::array::<u32>(16).expect("16 u32s take 64 bytes, so it shouldn't overflow");
613 ///
614 /// let vec = unsafe {
615 /// let mem = alloc(layout).cast::<u32>();
616 /// if mem.is_null() {
617 /// return;
618 /// }
619 ///
620 /// mem.write(1_000_000);
621 ///
622 /// Vec::from_raw_parts(mem, 1, 16)
623 /// };
624 ///
625 /// assert_eq!(vec, &[1_000_000]);
626 /// assert_eq!(vec.capacity(), 16);
627 /// }
628 /// ```
629 #[inline]
630 #[stable(feature = "rust1", since = "1.0.0")]
631 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
632 pub const unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self {
633 // SAFETY: Upheld by caller.
634 unsafe { Self::from_raw_parts_in(ptr, length, capacity, Global) }
635 }
636
637 #[doc(alias = "from_non_null_parts")]
638 /// Creates a `Vec<T>` directly from a `NonNull` pointer, a length, and a capacity.
639 ///
640 /// # Safety
641 ///
642 /// The parts must satisfy the invariants described in the [memory layout] section,
643 /// with allocator [`Global`].
644 ///
645 /// Violating them may cause problems like corrupting the allocator's
646 /// internal data structures. For example it is normally **not** safe
647 /// to build a `Vec<u8>` from a pointer to a C `char` array with length
648 /// `size_t`, doing so is only safe if the array was initially allocated by
649 /// a `Vec` or `String`.
650 /// It's also not safe to build one from a `Vec<u16>` and its length, because
651 /// the allocator cares about the alignment, and these two types have different
652 /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
653 /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1. To avoid
654 /// these issues, it is often preferable to do casting/transmuting using
655 /// [`NonNull::slice_from_raw_parts`] instead.
656 ///
657 /// The ownership of `ptr` is effectively transferred to the
658 /// `Vec<T>` which may then deallocate, reallocate or change the
659 /// contents of memory pointed to by the pointer at will. Ensure
660 /// that nothing else uses the pointer after calling this
661 /// function.
662 ///
663 /// [`String`]: crate::string::String
664 /// [memory layout]: self#memory-layout
665 ///
666 /// # Examples
667 ///
668 /// ```
669 /// let v = vec![1, 2, 3];
670 ///
671 /// // Deconstruct the vector into parts.
672 /// let (p, len, cap) = v.into_parts();
673 ///
674 /// unsafe {
675 /// // Overwrite memory with 4, 5, 6
676 /// for i in 0..len {
677 /// p.add(i).write(4 + i);
678 /// }
679 ///
680 /// // Put everything back together into a Vec
681 /// let rebuilt = Vec::from_parts(p, len, cap);
682 /// assert_eq!(rebuilt, [4, 5, 6]);
683 /// }
684 /// ```
685 ///
686 /// Using memory that was allocated elsewhere:
687 ///
688 /// ```rust
689 /// use std::alloc::{alloc, Layout};
690 /// use std::ptr::NonNull;
691 ///
692 /// fn main() {
693 /// let layout = Layout::array::<u32>(16).expect("16 u32s take 64 bytes, so it shouldn't overflow");
694 ///
695 /// let vec = unsafe {
696 /// let Some(mem) = NonNull::new(alloc(layout).cast::<u32>()) else {
697 /// return;
698 /// };
699 ///
700 /// mem.write(1_000_000);
701 ///
702 /// Vec::from_parts(mem, 1, 16)
703 /// };
704 ///
705 /// assert_eq!(vec, &[1_000_000]);
706 /// assert_eq!(vec.capacity(), 16);
707 /// }
708 /// ```
709 #[inline]
710 #[stable(feature = "box_vec_non_null", since = "1.99.0")]
711 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
712 pub const unsafe fn from_parts(ptr: NonNull<T>, length: usize, capacity: usize) -> Self {
713 // SAFETY: Upheld by caller.
714 unsafe { Self::from_parts_in(ptr, length, capacity, Global) }
715 }
716
717 /// Creates a `Vec<T>` where each element is produced by calling `f` with
718 /// that element's index while walking forward through the `Vec<T>`.
719 ///
720 /// This is essentially the same as writing
721 ///
722 /// ```text
723 /// vec![f(0), f(1), f(2), …, f(length - 2), f(length - 1)]
724 /// ```
725 /// and is similar to `(0..i).map(f)`, just for `Vec<T>`s not iterators.
726 ///
727 /// If `length == 0`, this produces an empty `Vec<T>` without ever calling `f`.
728 ///
729 /// # Example
730 ///
731 /// ```rust
732 /// let vec = Vec::from_fn(5, |i| i);
733 ///
734 /// // indexes are: 0 1 2 3 4
735 /// assert_eq!(vec, [0, 1, 2, 3, 4]);
736 ///
737 /// let vec2 = Vec::from_fn(8, |i| i * 2);
738 ///
739 /// // indexes are: 0 1 2 3 4 5 6 7
740 /// assert_eq!(vec2, [0, 2, 4, 6, 8, 10, 12, 14]);
741 ///
742 /// let bool_vec = Vec::from_fn(5, |i| i % 2 == 0);
743 ///
744 /// // indexes are: 0 1 2 3 4
745 /// assert_eq!(bool_vec, [true, false, true, false, true]);
746 /// ```
747 ///
748 /// The `Vec<T>` is generated in ascending index order, starting from the front
749 /// and going towards the back, so you can use closures with mutable state:
750 /// ```
751 /// let mut state = 1;
752 /// let a = Vec::from_fn(6, |_| { let x = state; state *= 2; x });
753 ///
754 /// assert_eq!(a, [1, 2, 4, 8, 16, 32]);
755 /// ```
756 #[cfg(not(no_global_oom_handling))]
757 #[inline]
758 #[stable(feature = "vec_from_fn", since = "1.100.0")]
759 pub fn from_fn<F>(length: usize, f: F) -> Self
760 where
761 F: FnMut(usize) -> T,
762 {
763 (0..length).map(f).collect()
764 }
765
766 /// Decomposes a `Vec<T>` into its raw components: `(pointer, length, capacity)`.
767 ///
768 /// Returns the raw pointer to the underlying data, the length of
769 /// the vector (in elements), and the allocated capacity of the
770 /// data (in elements). These are the same arguments in the same
771 /// order as the arguments to [`from_raw_parts`].
772 ///
773 /// After calling this function, the caller is responsible for the
774 /// memory previously managed by the `Vec`. Most often, one does
775 /// this by converting the raw pointer, length, and capacity back
776 /// into a `Vec` with the [`from_raw_parts`] function; more generally,
777 /// if `T` is non-zero-sized and the capacity is nonzero, one may use
778 /// any method that calls [`dealloc`] with a layout of
779 /// `Layout::array::<T>(capacity)`; if `T` is zero-sized or the
780 /// capacity is zero, nothing needs to be done.
781 ///
782 /// [`from_raw_parts`]: Vec::from_raw_parts
783 /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
784 ///
785 /// # Examples
786 ///
787 /// ```
788 /// let v: Vec<i32> = vec![-1, 0, 1];
789 ///
790 /// let (ptr, len, cap) = v.into_raw_parts();
791 ///
792 /// let rebuilt = unsafe {
793 /// // We can now make changes to the components, such as
794 /// // transmuting the raw pointer to a compatible type.
795 /// let ptr = ptr as *mut u32;
796 ///
797 /// Vec::from_raw_parts(ptr, len, cap)
798 /// };
799 /// assert_eq!(rebuilt, [4294967295, 0, 1]);
800 /// ```
801 #[must_use = "losing the pointer will leak memory"]
802 #[stable(feature = "vec_into_raw_parts", since = "1.93.0")]
803 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
804 pub const fn into_raw_parts(self) -> (*mut T, usize, usize) {
805 let mut me = ManuallyDrop::new(self);
806 (me.as_mut_ptr(), me.len(), me.capacity())
807 }
808
809 #[doc(alias = "into_non_null_parts")]
810 /// Decomposes a `Vec<T>` into its raw components: `(NonNull pointer, length, capacity)`.
811 ///
812 /// Returns the `NonNull` pointer to the underlying data, the length of
813 /// the vector (in elements), and the allocated capacity of the
814 /// data (in elements). These are the same arguments in the same
815 /// order as the arguments to [`from_parts`].
816 ///
817 /// After calling this function, the caller is responsible for the
818 /// memory previously managed by the `Vec`. The only way to do
819 /// this is to convert the `NonNull` pointer, length, and capacity back
820 /// into a `Vec` with the [`from_parts`] function, allowing
821 /// the destructor to perform the cleanup.
822 ///
823 /// [`from_parts`]: Vec::from_parts
824 ///
825 /// # Examples
826 ///
827 /// ```
828 /// let v: Vec<i32> = vec![-1, 0, 1];
829 ///
830 /// let (ptr, len, cap) = v.into_parts();
831 ///
832 /// let rebuilt = unsafe {
833 /// // We can now make changes to the components, such as
834 /// // transmuting the raw pointer to a compatible type.
835 /// let ptr = ptr.cast::<u32>();
836 ///
837 /// Vec::from_parts(ptr, len, cap)
838 /// };
839 /// assert_eq!(rebuilt, [4294967295, 0, 1]);
840 /// ```
841 #[must_use = "losing the pointer will leak memory"]
842 #[stable(feature = "box_vec_non_null", since = "1.99.0")]
843 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
844 pub const fn into_parts(self) -> (NonNull<T>, usize, usize) {
845 let (ptr, len, capacity) = self.into_raw_parts();
846 // SAFETY: A `Vec` always has a non-null pointer.
847 (unsafe { NonNull::new_unchecked(ptr) }, len, capacity)
848 }
849
850 /// Interns the `Vec<T>`, making the underlying memory read-only. This method should be
851 /// called during compile time. (This is a no-op if called during runtime)
852 ///
853 /// This method must be called if the memory used by `Vec` needs to appear in the final
854 /// values of constants.
855 #[unstable(feature = "const_heap", issue = "79597")]
856 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
857 pub const fn const_make_global(mut self) -> &'static [T]
858 where
859 T: Freeze,
860 {
861 // `const_make_global` requires the pointer to point to the beginning of a heap allocation,
862 // which is not the case when `self.capacity()` is 0, or if `T::IS_ZST`,
863 // which is why we instead return a new slice in this case.
864 if self.capacity() == 0 || T::IS_ZST {
865 let me = ManuallyDrop::new(self);
866 // ignore-tidy-undocumented-unsafe
867 unsafe { slice::from_raw_parts(NonNull::<T>::dangling().as_ptr(), me.len) }
868 } else {
869 // ignore-tidy-undocumented-unsafe
870 unsafe { core::intrinsics::const_make_global(self.as_mut_ptr().cast()) };
871 let me = ManuallyDrop::new(self);
872 // ignore-tidy-undocumented-unsafe
873 unsafe { slice::from_raw_parts(me.as_ptr(), me.len) }
874 }
875 }
876}
877
878#[cfg(not(no_global_oom_handling))]
879#[rustc_const_unstable(feature = "const_heap", issue = "79597")]
880#[rustfmt::skip] // FIXME(fee1-dead): temporary measure before rustfmt is bumped
881const impl<T, A: [const] Allocator + [const] Destruct> Vec<T, A> {
882 /// Constructs a new, empty `Vec<T, A>` with at least the specified capacity
883 /// with the provided allocator.
884 ///
885 /// The vector will be able to hold at least `capacity` elements without
886 /// reallocating. This method is allowed to allocate for more elements than
887 /// `capacity`. If `capacity` is zero, the vector [will not allocate].
888 ///
889 /// It is important to note that although the returned vector has the
890 /// minimum *capacity* specified, the vector will have a zero *length*. For
891 /// an explanation of the difference between length and capacity, see
892 /// *[Capacity and reallocation]*.
893 ///
894 /// If it is important to know the exact allocated capacity of a `Vec`,
895 /// always use the [`capacity`] method after construction.
896 ///
897 /// For `Vec<T, A>` where `T` is a zero-sized type, the vector
898 /// [will not allocate], and the capacity will always be `usize::MAX`.
899 ///
900 /// [Capacity and reallocation]: #capacity-and-reallocation
901 /// [`capacity`]: Vec::capacity
902 /// [will not allocate]: self#memory-layout
903 ///
904 /// # Panics
905 ///
906 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
907 ///
908 /// # Examples
909 ///
910 /// ```
911 /// use std::alloc::System;
912 ///
913 /// let mut vec = Vec::with_capacity_in(10, System);
914 ///
915 /// // The vector contains no items, even though it has capacity for more
916 /// assert_eq!(vec.len(), 0);
917 /// assert!(vec.capacity() >= 10);
918 ///
919 /// // These are all done without reallocating...
920 /// for i in 0..10 {
921 /// vec.push(i);
922 /// }
923 /// assert_eq!(vec.len(), 10);
924 /// assert!(vec.capacity() >= 10);
925 ///
926 /// // ...but this may make the vector reallocate
927 /// vec.push(11);
928 /// assert_eq!(vec.len(), 11);
929 /// assert!(vec.capacity() >= 11);
930 ///
931 /// // A vector of a zero-sized type will always over-allocate, since no
932 /// // allocation is necessary
933 /// let vec_units = Vec::<(), System>::with_capacity_in(10, System);
934 /// assert_eq!(vec_units.capacity(), usize::MAX);
935 /// ```
936 #[inline]
937 #[stable(feature = "allocator_api", since = "1.100.0")]
938 pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
939 Vec { buf: RawVec::with_capacity_in(capacity, alloc), len: 0 }
940 }
941
942 /// Appends an element to the back of a collection.
943 ///
944 /// # Panics
945 ///
946 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
947 ///
948 /// # Examples
949 ///
950 /// ```
951 /// let mut vec = vec![1, 2];
952 /// vec.push(3);
953 /// assert_eq!(vec, [1, 2, 3]);
954 /// ```
955 ///
956 /// # Time complexity
957 ///
958 /// Takes amortized *O*(1) time. If the vector's length would exceed its
959 /// capacity after the push, *O*(*capacity*) time is taken to copy the
960 /// vector's elements to a larger allocation. This expensive operation is
961 /// offset by the *capacity* *O*(1) insertions it allows.
962 #[inline]
963 #[stable(feature = "rust1", since = "1.0.0")]
964 #[rustc_confusables("push_back", "put", "append")]
965 pub fn push(&mut self, value: T) {
966 let _ = self.push_mut(value);
967 }
968
969 /// Appends an element to the back of a collection, returning a reference to it.
970 ///
971 /// # Panics
972 ///
973 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
974 ///
975 /// # Examples
976 ///
977 /// ```
978 /// let mut vec = vec![1, 2];
979 /// let last = vec.push_mut(3);
980 /// assert_eq!(*last, 3);
981 /// assert_eq!(vec, [1, 2, 3]);
982 ///
983 /// let last = vec.push_mut(3);
984 /// *last += 1;
985 /// assert_eq!(vec, [1, 2, 3, 4]);
986 /// ```
987 ///
988 /// # Time complexity
989 ///
990 /// Takes amortized *O*(1) time. If the vector's length would exceed its
991 /// capacity after the push, *O*(*capacity*) time is taken to copy the
992 /// vector's elements to a larger allocation. This expensive operation is
993 /// offset by the *capacity* *O*(1) insertions it allows.
994 #[inline]
995 #[stable(feature = "push_mut", since = "1.95.0")]
996 #[must_use = "if you don't need a reference to the value, use `Vec::push` instead"]
997 pub fn push_mut(&mut self, value: T) -> &mut T {
998 // Inform codegen that the length does not change across grow_one().
999 let len = self.len;
1000 // This will panic or abort if we would allocate > isize::MAX bytes
1001 // or if the length increment would overflow for zero-sized types.
1002 if len == self.buf.capacity() {
1003 self.buf.grow_one();
1004 }
1005 // ignore-tidy-undocumented-unsafe
1006 unsafe {
1007 let end = self.as_mut_ptr().add(len);
1008 ptr::write(end, value);
1009 self.len = len + 1;
1010 // SAFETY: We just wrote a value to the pointer that will live the lifetime of the reference.
1011 &mut *end
1012 }
1013 }
1014}
1015
1016impl<T, A: Allocator> Vec<T, A> {
1017 /// Constructs a new, empty `Vec<T, A>`.
1018 ///
1019 /// The vector will not allocate until elements are pushed onto it.
1020 ///
1021 /// # Examples
1022 ///
1023 /// ```
1024 /// use std::alloc::System;
1025 ///
1026 /// let vec: Vec<i32, System> = Vec::new_in(System);
1027 /// ```
1028 #[inline]
1029 #[stable(feature = "allocator_api", since = "1.100.0")]
1030 #[rustc_const_unstable(feature = "allocator_ext", issue = "163177")]
1031 pub const fn new_in(alloc: A) -> Self {
1032 Vec { buf: RawVec::new_in(alloc), len: 0 }
1033 }
1034
1035 /// Constructs a new, empty `Vec<T, A>` with at least the specified capacity
1036 /// with the provided allocator.
1037 ///
1038 /// The vector will be able to hold at least `capacity` elements without
1039 /// reallocating. This method is allowed to allocate for more elements than
1040 /// `capacity`. If `capacity` is zero, the vector [will not allocate].
1041 ///
1042 /// # Errors
1043 ///
1044 /// Returns an error if the capacity exceeds `isize::MAX` _bytes_,
1045 /// or if the allocator reports allocation failure.
1046 ///
1047 /// [will not allocate]: self#memory-layout
1048 #[inline]
1049 #[unstable(feature = "allocator_ext", issue = "163177", implied_by = "allocator_api")]
1050 // #[unstable(feature = "try_with_capacity", issue = "91913")]
1051 pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result<Self, TryReserveError> {
1052 Ok(Vec { buf: RawVec::try_with_capacity_in(capacity, alloc)?, len: 0 })
1053 }
1054
1055 /// Creates a `Vec<T, A>` directly from a pointer, a length, a capacity,
1056 /// and an allocator.
1057 ///
1058 /// # Safety
1059 ///
1060 /// The parts must satisfy the invariants described in the [memory layout] section.
1061 ///
1062 /// Violating them may cause problems like corrupting the allocator's
1063 /// internal data structures. For example it is **not** safe
1064 /// to build a `Vec<u8>` from a pointer to a C `char` array with length `size_t`.
1065 /// It's also not safe to build one from a `Vec<u16>` and its length, because
1066 /// the allocator cares about the alignment, and these two types have different
1067 /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
1068 /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1.
1069 ///
1070 /// The ownership of `ptr` is effectively transferred to the
1071 /// `Vec<T>` which may then deallocate, reallocate or change the
1072 /// contents of memory pointed to by the pointer at will. Ensure
1073 /// that nothing else uses the pointer after calling this
1074 /// function.
1075 ///
1076 /// [`String`]: crate::string::String
1077 /// [`allocate`]: crate::alloc::Allocator::allocate
1078 /// [memory layout]: self#memory-layout
1079 ///
1080 /// # Examples
1081 ///
1082 /// ```
1083 /// use std::alloc::System;
1084 ///
1085 /// use std::ptr;
1086 ///
1087 /// let mut v = Vec::with_capacity_in(3, System);
1088 /// v.push(1);
1089 /// v.push(2);
1090 /// v.push(3);
1091 ///
1092 /// // Deconstruct the vector into parts.
1093 /// let (p, len, cap, alloc) = v.into_raw_parts_with_allocator();
1094 ///
1095 /// unsafe {
1096 /// // Overwrite memory with 4, 5, 6
1097 /// for i in 0..len {
1098 /// ptr::write(p.add(i), 4 + i);
1099 /// }
1100 ///
1101 /// // Put everything back together into a Vec
1102 /// let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());
1103 /// assert_eq!(rebuilt, [4, 5, 6]);
1104 /// }
1105 /// ```
1106 ///
1107 /// Using memory that was allocated elsewhere:
1108 ///
1109 /// ```rust
1110 /// use std::alloc::{AllocError, Allocator, Global, Layout};
1111 ///
1112 /// fn main() {
1113 /// let layout = Layout::array::<u32>(16).expect("16 u32s take 64 bytes, so it shouldn't overflow");
1114 ///
1115 /// let vec = unsafe {
1116 /// let mem = match Global.allocate(layout) {
1117 /// Ok(mem) => mem.cast::<u32>().as_ptr(),
1118 /// Err(AllocError) => return,
1119 /// };
1120 ///
1121 /// mem.write(1_000_000);
1122 ///
1123 /// Vec::from_raw_parts_in(mem, 1, 16, Global)
1124 /// };
1125 ///
1126 /// assert_eq!(vec, &[1_000_000]);
1127 /// assert_eq!(vec.capacity(), 16);
1128 /// }
1129 /// ```
1130 #[inline]
1131 #[stable(feature = "allocator_api", since = "1.100.0")]
1132 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
1133 pub const unsafe fn from_raw_parts_in(
1134 ptr: *mut T,
1135 length: usize,
1136 capacity: usize,
1137 alloc: A,
1138 ) -> Self {
1139 ub_checks::assert_unsafe_precondition!(
1140 check_library_ub,
1141 "Vec::from_raw_parts_in requires that length <= capacity",
1142 (length: usize = length, capacity: usize = capacity) => length <= capacity
1143 );
1144 // SAFETY: Upheld by caller.
1145 unsafe { Vec { buf: RawVec::from_raw_parts_in(ptr, capacity, alloc), len: length } }
1146 }
1147
1148 #[doc(alias = "from_non_null_parts_in")]
1149 /// Creates a `Vec<T, A>` directly from a `NonNull` pointer, a length, a capacity,
1150 /// and an allocator.
1151 ///
1152 /// # Safety
1153 ///
1154 /// The parts must satisfy the invariants described in the [memory layout] section.
1155 ///
1156 /// Violating them may cause problems like corrupting the allocator's
1157 /// internal data structures. For example it is **not** safe
1158 /// to build a `Vec<u8>` from a pointer to a C `char` array with length `size_t`.
1159 /// It's also not safe to build one from a `Vec<u16>` and its length, because
1160 /// the allocator cares about the alignment, and these two types have different
1161 /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
1162 /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1.
1163 ///
1164 /// The ownership of `ptr` is effectively transferred to the
1165 /// `Vec<T>` which may then deallocate, reallocate or change the
1166 /// contents of memory pointed to by the pointer at will. Ensure
1167 /// that nothing else uses the pointer after calling this
1168 /// function.
1169 ///
1170 /// [`String`]: crate::string::String
1171 /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
1172 /// [memory layout]: self#memory-layout
1173 ///
1174 /// # Examples
1175 ///
1176 /// ```
1177 /// use std::alloc::System;
1178 ///
1179 /// let mut v = Vec::with_capacity_in(3, System);
1180 /// v.push(1);
1181 /// v.push(2);
1182 /// v.push(3);
1183 ///
1184 /// // Deconstruct the vector into parts.
1185 /// let (p, len, cap, alloc) = v.into_parts_with_allocator();
1186 ///
1187 /// unsafe {
1188 /// // Overwrite memory with 4, 5, 6
1189 /// for i in 0..len {
1190 /// p.add(i).write(4 + i);
1191 /// }
1192 ///
1193 /// // Put everything back together into a Vec
1194 /// let rebuilt = Vec::from_parts_in(p, len, cap, alloc.clone());
1195 /// assert_eq!(rebuilt, [4, 5, 6]);
1196 /// }
1197 /// ```
1198 ///
1199 /// Using memory that was allocated elsewhere:
1200 ///
1201 /// ```rust
1202 /// use std::alloc::{AllocError, Allocator, Global, Layout};
1203 ///
1204 /// fn main() {
1205 /// let layout = Layout::array::<u32>(16).expect("16 u32s take 64 bytes, so it shouldn't overflow");
1206 ///
1207 /// let vec = unsafe {
1208 /// let mem = match Global.allocate(layout) {
1209 /// Ok(mem) => mem.cast::<u32>(),
1210 /// Err(AllocError) => return,
1211 /// };
1212 ///
1213 /// mem.write(1_000_000);
1214 ///
1215 /// Vec::from_parts_in(mem, 1, 16, Global)
1216 /// };
1217 ///
1218 /// assert_eq!(vec, &[1_000_000]);
1219 /// assert_eq!(vec.capacity(), 16);
1220 /// }
1221 /// ```
1222 #[inline]
1223 #[stable(feature = "allocator_api", since = "1.100.0")]
1224 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
1225 pub const unsafe fn from_parts_in(
1226 ptr: NonNull<T>,
1227 length: usize,
1228 capacity: usize,
1229 alloc: A,
1230 ) -> Self {
1231 ub_checks::assert_unsafe_precondition!(
1232 check_library_ub,
1233 "Vec::from_parts_in requires that length <= capacity",
1234 (length: usize = length, capacity: usize = capacity) => length <= capacity
1235 );
1236 // SAFETY: Upheld by caller.
1237 unsafe { Vec { buf: RawVec::from_nonnull_in(ptr, capacity, alloc), len: length } }
1238 }
1239
1240 /// Decomposes a `Vec<T>` into its raw components: `(pointer, length, capacity, allocator)`.
1241 ///
1242 /// Returns the raw pointer to the underlying data, the length of the vector (in elements),
1243 /// the allocated capacity of the data (in elements), and the allocator. These are the same
1244 /// arguments in the same order as the arguments to [`from_raw_parts_in`].
1245 ///
1246 /// After calling this function, the caller is responsible for the
1247 /// memory previously managed by the `Vec`. The only way to do
1248 /// this is to convert the raw pointer, length, and capacity back
1249 /// into a `Vec` with the [`from_raw_parts_in`] function, allowing
1250 /// the destructor to perform the cleanup.
1251 ///
1252 /// [`from_raw_parts_in`]: Vec::from_raw_parts_in
1253 ///
1254 /// # Examples
1255 ///
1256 /// ```
1257 /// use std::alloc::System;
1258 ///
1259 /// let mut v: Vec<i32, System> = Vec::new_in(System);
1260 /// v.push(-1);
1261 /// v.push(0);
1262 /// v.push(1);
1263 ///
1264 /// let (ptr, len, cap, alloc) = v.into_raw_parts_with_allocator();
1265 ///
1266 /// let rebuilt = unsafe {
1267 /// // We can now make changes to the components, such as
1268 /// // transmuting the raw pointer to a compatible type.
1269 /// let ptr = ptr as *mut u32;
1270 ///
1271 /// Vec::from_raw_parts_in(ptr, len, cap, alloc)
1272 /// };
1273 /// assert_eq!(rebuilt, [4294967295, 0, 1]);
1274 /// ```
1275 #[must_use = "losing the pointer will leak memory"]
1276 #[stable(feature = "allocator_api", since = "1.100.0")]
1277 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
1278 pub const fn into_raw_parts_with_allocator(self) -> (*mut T, usize, usize, A) {
1279 let mut me = ManuallyDrop::new(self);
1280 let len = me.len();
1281 let capacity = me.capacity();
1282 let ptr = me.as_mut_ptr();
1283 // ignore-tidy-undocumented-unsafe
1284 let alloc = unsafe { ptr::read(me.allocator()) };
1285 (ptr, len, capacity, alloc)
1286 }
1287
1288 #[doc(alias = "into_non_null_parts_with_alloc")]
1289 /// Decomposes a `Vec<T>` into its raw components: `(NonNull pointer, length, capacity, allocator)`.
1290 ///
1291 /// Returns the `NonNull` pointer to the underlying data, the length of the vector (in elements),
1292 /// the allocated capacity of the data (in elements), and the allocator. These are the same
1293 /// arguments in the same order as the arguments to [`from_parts_in`].
1294 ///
1295 /// After calling this function, the caller is responsible for the
1296 /// memory previously managed by the `Vec`. The only way to do
1297 /// this is to convert the `NonNull` pointer, length, and capacity back
1298 /// into a `Vec` with the [`from_parts_in`] function, allowing
1299 /// the destructor to perform the cleanup.
1300 ///
1301 /// [`from_parts_in`]: Vec::from_parts_in
1302 ///
1303 /// # Examples
1304 ///
1305 /// ```
1306 /// use std::alloc::System;
1307 ///
1308 /// let mut v: Vec<i32, System> = Vec::new_in(System);
1309 /// v.push(-1);
1310 /// v.push(0);
1311 /// v.push(1);
1312 ///
1313 /// let (ptr, len, cap, alloc) = v.into_parts_with_allocator();
1314 ///
1315 /// let rebuilt = unsafe {
1316 /// // We can now make changes to the components, such as
1317 /// // transmuting the raw pointer to a compatible type.
1318 /// let ptr = ptr.cast::<u32>();
1319 ///
1320 /// Vec::from_parts_in(ptr, len, cap, alloc)
1321 /// };
1322 /// assert_eq!(rebuilt, [4294967295, 0, 1]);
1323 /// ```
1324 #[must_use = "losing the pointer will leak memory"]
1325 #[stable(feature = "allocator_api", since = "1.100.0")]
1326 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
1327 pub const fn into_parts_with_allocator(self) -> (NonNull<T>, usize, usize, A) {
1328 let (ptr, len, capacity, alloc) = self.into_raw_parts_with_allocator();
1329 // SAFETY: A `Vec` always has a non-null pointer.
1330 (unsafe { NonNull::new_unchecked(ptr) }, len, capacity, alloc)
1331 }
1332
1333 /// Returns the total number of elements the vector can hold without
1334 /// reallocating.
1335 ///
1336 /// # Examples
1337 ///
1338 /// ```
1339 /// let mut vec: Vec<i32> = Vec::with_capacity(10);
1340 /// vec.push(42);
1341 /// assert!(vec.capacity() >= 10);
1342 /// ```
1343 ///
1344 /// A vector with zero-sized elements will always have a capacity of usize::MAX:
1345 ///
1346 /// ```
1347 /// #[derive(Clone)]
1348 /// struct ZeroSized;
1349 ///
1350 /// fn main() {
1351 /// assert_eq!(std::mem::size_of::<ZeroSized>(), 0);
1352 /// let v = vec![ZeroSized; 0];
1353 /// assert_eq!(v.capacity(), usize::MAX);
1354 /// }
1355 /// ```
1356 #[inline]
1357 #[stable(feature = "rust1", since = "1.0.0")]
1358 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1359 pub const fn capacity(&self) -> usize {
1360 self.buf.capacity()
1361 }
1362
1363 /// Reserves capacity for at least `additional` more elements to be inserted
1364 /// in the given `Vec<T>`. The collection may reserve more space to
1365 /// speculatively avoid frequent reallocations. After calling `reserve`,
1366 /// capacity will be greater than or equal to `self.len() + additional`.
1367 /// Does nothing if capacity is already sufficient.
1368 ///
1369 /// # Panics
1370 ///
1371 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
1372 ///
1373 /// # Examples
1374 ///
1375 /// ```
1376 /// let mut vec = vec![1];
1377 /// vec.reserve(10);
1378 /// assert!(vec.capacity() >= 11);
1379 /// ```
1380 #[cfg(not(no_global_oom_handling))]
1381 #[stable(feature = "rust1", since = "1.0.0")]
1382 #[rustc_diagnostic_item = "vec_reserve"]
1383 pub fn reserve(&mut self, additional: usize) {
1384 self.buf.reserve(self.len, additional);
1385 }
1386
1387 /// Reserves the minimum capacity for at least `additional` more elements to
1388 /// be inserted in the given `Vec<T>`. Unlike [`reserve`], this will not
1389 /// deliberately over-allocate to speculatively avoid frequent allocations.
1390 /// After calling `reserve_exact`, capacity will be greater than or equal to
1391 /// `self.len() + additional`. Does nothing if the capacity is already
1392 /// sufficient.
1393 ///
1394 /// Note that the allocator may give the collection more space than it
1395 /// requests. Therefore, capacity can not be relied upon to be precisely
1396 /// minimal. Prefer [`reserve`] if future insertions are expected.
1397 ///
1398 /// [`reserve`]: Vec::reserve
1399 ///
1400 /// # Panics
1401 ///
1402 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
1403 ///
1404 /// # Examples
1405 ///
1406 /// ```
1407 /// let mut vec = vec![1];
1408 /// vec.reserve_exact(10);
1409 /// assert!(vec.capacity() >= 11);
1410 /// ```
1411 #[cfg(not(no_global_oom_handling))]
1412 #[stable(feature = "rust1", since = "1.0.0")]
1413 pub fn reserve_exact(&mut self, additional: usize) {
1414 self.buf.reserve_exact(self.len, additional);
1415 }
1416
1417 /// Tries to reserve capacity for at least `additional` more elements to be inserted
1418 /// in the given `Vec<T>`. The collection may reserve more space to speculatively avoid
1419 /// frequent reallocations. After calling `try_reserve`, capacity will be
1420 /// greater than or equal to `self.len() + additional` if it returns
1421 /// `Ok(())`. Does nothing if capacity is already sufficient. This method
1422 /// preserves the contents even if an error occurs.
1423 ///
1424 /// # Errors
1425 ///
1426 /// If the capacity overflows, or the allocator reports a failure, then an error
1427 /// is returned.
1428 ///
1429 /// # Examples
1430 ///
1431 /// ```
1432 /// use std::collections::TryReserveError;
1433 ///
1434 /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
1435 /// let mut output = Vec::new();
1436 ///
1437 /// // Pre-reserve the memory, exiting if we can't
1438 /// output.try_reserve(data.len())?;
1439 ///
1440 /// // Now we know this can't OOM in the middle of our complex work
1441 /// output.extend(data.iter().map(|&val| {
1442 /// val * 2 + 5 // very complicated
1443 /// }));
1444 ///
1445 /// Ok(output)
1446 /// }
1447 /// # process_data(&[1, 2, 3]).expect("this test needs 12 bytes, so it shouldn't fail");
1448 /// ```
1449 #[stable(feature = "try_reserve", since = "1.57.0")]
1450 pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
1451 self.buf.try_reserve(self.len, additional)
1452 }
1453
1454 /// Tries to reserve the minimum capacity for at least `additional`
1455 /// elements to be inserted in the given `Vec<T>`. Unlike [`try_reserve`],
1456 /// this will not deliberately over-allocate to speculatively avoid frequent
1457 /// allocations. After calling `try_reserve_exact`, capacity will be greater
1458 /// than or equal to `self.len() + additional` if it returns `Ok(())`.
1459 /// Does nothing if the capacity is already sufficient.
1460 ///
1461 /// Note that the allocator may give the collection more space than it
1462 /// requests. Therefore, capacity can not be relied upon to be precisely
1463 /// minimal. Prefer [`try_reserve`] if future insertions are expected.
1464 ///
1465 /// [`try_reserve`]: Vec::try_reserve
1466 ///
1467 /// # Errors
1468 ///
1469 /// If the capacity overflows, or the allocator reports a failure, then an error
1470 /// is returned.
1471 ///
1472 /// # Examples
1473 ///
1474 /// ```
1475 /// use std::collections::TryReserveError;
1476 ///
1477 /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
1478 /// let mut output = Vec::new();
1479 ///
1480 /// // Pre-reserve the memory, exiting if we can't
1481 /// output.try_reserve_exact(data.len())?;
1482 ///
1483 /// // Now we know this can't OOM in the middle of our complex work
1484 /// output.extend(data.iter().map(|&val| {
1485 /// val * 2 + 5 // very complicated
1486 /// }));
1487 ///
1488 /// Ok(output)
1489 /// }
1490 /// # process_data(&[1, 2, 3]).expect("this test needs 12 bytes, so it shouldn't fail");
1491 /// ```
1492 #[stable(feature = "try_reserve", since = "1.57.0")]
1493 pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
1494 self.buf.try_reserve_exact(self.len, additional)
1495 }
1496
1497 /// Shrinks the capacity of the vector as much as possible.
1498 ///
1499 /// When `vec.len() == vec.capacity()` the allocation is unchanged. Otherwise, the behavior of
1500 /// this method depends on the allocator, which may either shrink the vector in-place or
1501 /// reallocate. The resulting vector might still have some excess capacity, just as
1502 /// is the case for [`with_capacity`]. See [`Allocator::shrink`] for more details.
1503 ///
1504 /// [`with_capacity`]: Vec::with_capacity
1505 ///
1506 /// # Examples
1507 ///
1508 /// ```
1509 /// let mut vec = Vec::with_capacity(10);
1510 /// vec.extend([1, 2, 3]);
1511 /// assert!(vec.capacity() >= 10);
1512 /// vec.shrink_to_fit();
1513 /// assert!(vec.capacity() >= 3);
1514 /// ```
1515 #[cfg(not(no_global_oom_handling))]
1516 #[stable(feature = "rust1", since = "1.0.0")]
1517 #[inline]
1518 pub fn shrink_to_fit(&mut self) {
1519 // The capacity is never less than the length, and there's nothing to do when
1520 // they are equal, so we can avoid the panic case in `RawVec::shrink_to_fit`
1521 // by only calling it with a greater capacity.
1522 if self.capacity() > self.len {
1523 self.buf.shrink_to_fit(self.len);
1524 }
1525 }
1526
1527 /// Shrinks the capacity of the vector with a lower bound.
1528 ///
1529 /// The capacity will remain at least as large as both the length
1530 /// and the supplied value.
1531 ///
1532 /// If the current capacity is less than the lower limit, this is a no-op.
1533 ///
1534 /// # Examples
1535 ///
1536 /// ```
1537 /// let mut vec = Vec::with_capacity(10);
1538 /// vec.extend([1, 2, 3]);
1539 /// assert!(vec.capacity() >= 10);
1540 /// vec.shrink_to(4);
1541 /// assert!(vec.capacity() >= 4);
1542 /// vec.shrink_to(0);
1543 /// assert!(vec.capacity() >= 3);
1544 /// ```
1545 #[cfg(not(no_global_oom_handling))]
1546 #[stable(feature = "shrink_to", since = "1.56.0")]
1547 pub fn shrink_to(&mut self, min_capacity: usize) {
1548 if self.capacity() > min_capacity {
1549 self.buf.shrink_to_fit(cmp::max(self.len, min_capacity));
1550 }
1551 }
1552
1553 /// Tries to shrink the capacity of the vector as much as possible
1554 ///
1555 /// The behavior of this method depends on the allocator, which may either shrink the vector
1556 /// in-place or reallocate. The resulting vector might still have some excess capacity, just as
1557 /// is the case for [`with_capacity`]. See [`Allocator::shrink`] for more details.
1558 ///
1559 /// [`with_capacity`]: Vec::with_capacity
1560 ///
1561 /// # Errors
1562 ///
1563 /// This function returns an error if the allocator fails to shrink the allocation,
1564 /// the vector thereafter is still safe to use, the capacity remains unchanged
1565 /// however. See [`Allocator::shrink`].
1566 ///
1567 /// # Examples
1568 ///
1569 /// ```
1570 /// #![feature(vec_fallible_shrink)]
1571 ///
1572 /// let mut vec = Vec::with_capacity(10);
1573 /// vec.extend([1, 2, 3]);
1574 /// assert!(vec.capacity() >= 10);
1575 /// vec.try_shrink_to_fit().expect("for this test, shrink shouldn't fail");
1576 /// assert!(vec.capacity() >= 3);
1577 /// ```
1578 #[unstable(feature = "vec_fallible_shrink", issue = "152350")]
1579 #[inline]
1580 pub fn try_shrink_to_fit(&mut self) -> Result<(), TryReserveError> {
1581 if self.capacity() > self.len { self.buf.try_shrink_to_fit(self.len) } else { Ok(()) }
1582 }
1583
1584 /// Shrinks the capacity of the vector with a lower bound.
1585 ///
1586 /// The capacity will remain at least as large as both the length
1587 /// and the supplied value.
1588 ///
1589 /// If the current capacity is less than the lower limit, this is a no-op.
1590 ///
1591 /// # Errors
1592 ///
1593 /// This function returns an error if the allocator fails to shrink the allocation,
1594 /// the vector thereafter is still safe to use, the capacity remains unchanged
1595 /// however. See [`Allocator::shrink`].
1596 ///
1597 /// # Examples
1598 ///
1599 /// ```
1600 /// #![feature(vec_fallible_shrink)]
1601 ///
1602 /// let mut vec = Vec::with_capacity(10);
1603 /// vec.extend([1, 2, 3]);
1604 /// assert!(vec.capacity() >= 10);
1605 /// vec.try_shrink_to(4).expect("for this test, shrink shouldn't fail");
1606 /// assert!(vec.capacity() >= 4);
1607 /// vec.try_shrink_to(0).expect("this is a no-op and thus the allocator isn't involved.");
1608 /// assert!(vec.capacity() >= 3);
1609 /// ```
1610 #[unstable(feature = "vec_fallible_shrink", issue = "152350")]
1611 #[inline]
1612 pub fn try_shrink_to(&mut self, min_capacity: usize) -> Result<(), TryReserveError> {
1613 if self.capacity() > min_capacity {
1614 self.buf.try_shrink_to_fit(cmp::max(self.len, min_capacity))
1615 } else {
1616 Ok(())
1617 }
1618 }
1619
1620 /// Converts the vector into a boxed slice.
1621 ///
1622 /// This conversion is in-place if `vec.len() == vec.capacity()`. Otherwise excess capacity
1623 /// is discarded by reallocating before doing the conversion.
1624 ///
1625 /// # Examples
1626 ///
1627 /// ```
1628 /// let v = vec![1, 2, 3];
1629 ///
1630 /// let slice = v.into_boxed_slice();
1631 /// ```
1632 ///
1633 /// Any excess capacity is removed:
1634 ///
1635 /// ```
1636 /// let mut vec = Vec::with_capacity(10);
1637 /// vec.extend([1, 2, 3]);
1638 ///
1639 /// assert!(vec.capacity() >= 10);
1640 /// let slice = vec.into_boxed_slice();
1641 /// assert_eq!(slice.into_vec().capacity(), 3);
1642 /// ```
1643 #[cfg(not(no_global_oom_handling))]
1644 #[stable(feature = "rust1", since = "1.0.0")]
1645 pub fn into_boxed_slice(mut self) -> Box<[T], A> {
1646 self.shrink_to_fit();
1647 let me = ManuallyDrop::new(self);
1648 // ignore-tidy-undocumented-unsafe
1649 unsafe {
1650 let buf = ptr::read(&me.buf);
1651 let len = me.len();
1652 buf.into_box(len).assume_init()
1653 }
1654 }
1655
1656 /// Converts the Vec into a boxed array. This conversion will discard any spare capacity,
1657 /// if there is any, see [`Vec::shrink_to_fit`].
1658 /// If you merely wish for a reference to an array, use [`as_array`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_array).
1659 ///
1660 /// # Errors
1661 ///
1662 /// Returns the original `Vec<T>` in the `Err` variant if [`Vec::len`] does not equal `N`.
1663 ///
1664 /// # Examples
1665 ///
1666 /// ```
1667 /// #![feature(alloc_slice_into_array)]
1668 /// let vec: Vec<i32> = vec![1, 2, 3];
1669 /// let box_array: Box<[i32; 3]> = vec.clone().into_array().unwrap();
1670 /// let not_enough_elements: Result<Box<[i32; 4]>, Vec<i32>> = vec.into_array::<4>();
1671 /// assert_eq!(not_enough_elements, Err(vec![1, 2, 3]));
1672 /// ```
1673 #[cfg(not(no_global_oom_handling))]
1674 #[unstable(feature = "alloc_slice_into_array", issue = "148082")]
1675 pub fn into_array<const N: usize>(self) -> Result<Box<[T; N], A>, Self> {
1676 if self.len() == N {
1677 // SAFETY: `Box::into_array` is guaranteed to return `Ok` if the
1678 // length of the slice is equal to `N`.
1679 // `self.into_boxed_slice().len()` is equal to `self.len()`,
1680 // which we just checked.
1681 Ok(unsafe { self.into_boxed_slice().into_array().unwrap_unchecked() })
1682 } else {
1683 Err(self)
1684 }
1685 }
1686
1687 /// Shortens the vector, keeping the first `len` elements and dropping
1688 /// the rest.
1689 ///
1690 /// If `len` is greater or equal to the vector's current length, this has
1691 /// no effect.
1692 ///
1693 /// The [`drain`] method can emulate `truncate`, but causes the excess
1694 /// elements to be returned instead of dropped.
1695 ///
1696 /// Note that this method has no effect on the allocated capacity
1697 /// of the vector.
1698 ///
1699 /// # Examples
1700 ///
1701 /// Truncating a five element vector to two elements:
1702 ///
1703 /// ```
1704 /// let mut vec = vec![1, 2, 3, 4, 5];
1705 /// vec.truncate(2);
1706 /// assert_eq!(vec, [1, 2]);
1707 /// ```
1708 ///
1709 /// No truncation occurs when `len` is greater than or equal to the
1710 /// vector's current length:
1711 ///
1712 /// ```
1713 /// let mut vec = vec![1, 2, 3];
1714 /// vec.truncate(8);
1715 /// assert_eq!(vec, [1, 2, 3]);
1716 /// ```
1717 ///
1718 /// Truncating when `len == 0` is equivalent to calling the [`clear`]
1719 /// method.
1720 ///
1721 /// ```
1722 /// let mut vec = vec![1, 2, 3];
1723 /// vec.truncate(0);
1724 /// assert_eq!(vec, []);
1725 /// ```
1726 ///
1727 /// [`clear`]: Vec::clear
1728 /// [`drain`]: Vec::drain
1729 #[stable(feature = "rust1", since = "1.0.0")]
1730 pub fn truncate(&mut self, len: usize) {
1731 // SAFETY: `BufWriter::flush_buf` assumes that this will not
1732 // de-initialize any elements of the spare capacity.
1733
1734 // This is safe because:
1735 //
1736 // * the slice passed to `drop_in_place` is valid; the `len >= self.len`
1737 // case avoids creating an invalid slice, and
1738 // * the `len` of the vector is shrunk before calling `drop_in_place`,
1739 // such that no value will be dropped twice in case `drop_in_place`
1740 // were to panic once (if it panics twice, the program aborts).
1741 unsafe {
1742 if len >= self.len {
1743 return;
1744 }
1745 let remaining_len = self.len - len;
1746 let s = self.as_mut_ptr().add(len).cast_slice(remaining_len);
1747 self.len = len;
1748 ptr::drop_in_place(s);
1749 }
1750 }
1751
1752 /// Extracts a slice containing the entire vector.
1753 ///
1754 /// Equivalent to `&s[..]`.
1755 ///
1756 /// # Examples
1757 ///
1758 /// ```
1759 /// use std::io::{self, Write};
1760 /// let buffer = vec![1, 2, 3, 5, 8];
1761 /// io::sink().write(buffer.as_slice()).unwrap();
1762 /// ```
1763 #[inline]
1764 #[stable(feature = "vec_as_slice", since = "1.7.0")]
1765 #[rustc_diagnostic_item = "vec_as_slice"]
1766 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1767 pub const fn as_slice(&self) -> &[T] {
1768 // SAFETY: `slice::from_raw_parts` requires pointee is a contiguous, aligned buffer of size
1769 // `len` containing properly-initialized `T`s. Data must not be mutated for the returned
1770 // lifetime. Further, `len * size_of::<T>` <= `isize::MAX`, and allocation does not
1771 // "wrap" through overflowing memory addresses.
1772 //
1773 // * Vec API guarantees that self.buf:
1774 // * contains only properly-initialized items within 0..len
1775 // * is aligned, contiguous, and valid for `len` reads
1776 // * obeys size and address-wrapping constraints
1777 //
1778 // * We only construct `&mut` references to `self.buf` through `&mut self` methods; borrow-
1779 // check ensures that it is not possible to mutably alias `self.buf` within the
1780 // returned lifetime.
1781 unsafe {
1782 // normally this would use `slice::from_raw_parts`, but it's
1783 // instantiated often enough that avoiding the UB check is worth it
1784 &*core::intrinsics::aggregate_raw_ptr::<*const [T], _, _>(self.as_ptr(), self.len)
1785 }
1786 }
1787
1788 /// Extracts a mutable slice of the entire vector.
1789 ///
1790 /// Equivalent to `&mut s[..]`.
1791 ///
1792 /// # Examples
1793 ///
1794 /// ```
1795 /// use std::io::{self, Read};
1796 /// let mut buffer = vec![0; 3];
1797 /// io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
1798 /// ```
1799 #[inline]
1800 #[stable(feature = "vec_as_slice", since = "1.7.0")]
1801 #[rustc_diagnostic_item = "vec_as_mut_slice"]
1802 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1803 pub const fn as_mut_slice(&mut self) -> &mut [T] {
1804 // SAFETY: `BufWriter::flush_buf` assumes that this will not
1805 // de-initialize any elements of the spare capacity.
1806
1807 // SAFETY: `slice::from_raw_parts_mut` requires pointee is a contiguous, aligned buffer of
1808 // size `len` containing properly-initialized `T`s. Data must not be accessed through any
1809 // other pointer for the returned lifetime. Further, `len * size_of::<T>` <=
1810 // `isize::MAX` and allocation does not "wrap" through overflowing memory addresses.
1811 //
1812 // * Vec API guarantees that self.buf:
1813 // * contains only properly-initialized items within 0..len
1814 // * is aligned, contiguous, and valid for `len` reads
1815 // * obeys size and address-wrapping constraints
1816 //
1817 // * We only construct references to `self.buf` through `&self` and `&mut self` methods;
1818 // borrow-check ensures that it is not possible to construct a reference to `self.buf`
1819 // within the returned lifetime.
1820 unsafe {
1821 // normally this would use `slice::from_raw_parts_mut`, but it's
1822 // instantiated often enough that avoiding the UB check is worth it
1823 &mut *core::intrinsics::aggregate_raw_ptr::<*mut [T], _, _>(self.as_mut_ptr(), self.len)
1824 }
1825 }
1826
1827 /// Returns a raw pointer to the vector's buffer, or a dangling raw pointer
1828 /// valid for zero sized reads if the vector [didn't allocate].
1829 ///
1830 /// The caller must ensure that the vector outlives the pointer this
1831 /// function returns, or else it will end up dangling.
1832 /// Modifying the vector may cause its buffer to be reallocated,
1833 /// which would also make any pointers to it invalid.
1834 ///
1835 /// The caller must also ensure that the memory the pointer (non-transitively) points to
1836 /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
1837 /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
1838 ///
1839 /// This method guarantees that for the purpose of the aliasing model, this method
1840 /// does not materialize a reference to the underlying slice, and thus the returned pointer
1841 /// will remain valid when mixed with other calls to [`as_ptr`], [`as_mut_ptr`],
1842 /// and [`as_non_null`].
1843 /// Note that calling other methods that materialize mutable references to the slice,
1844 /// or mutable references to specific elements you are planning on accessing through this pointer,
1845 /// as well as writing to those elements, may still invalidate this pointer.
1846 /// See the second example below for how this guarantee can be used.
1847 ///
1848 ///
1849 /// # Examples
1850 ///
1851 /// ```
1852 /// let x = vec![1, 2, 4];
1853 /// let x_ptr = x.as_ptr();
1854 ///
1855 /// unsafe {
1856 /// for i in 0..x.len() {
1857 /// assert_eq!(*x_ptr.add(i), 1 << i);
1858 /// }
1859 /// }
1860 /// ```
1861 ///
1862 /// Due to the aliasing guarantee, the following code is legal:
1863 ///
1864 /// ```rust
1865 /// unsafe {
1866 /// let mut v = vec![0, 1, 2];
1867 /// let ptr1 = v.as_ptr();
1868 /// let _ = ptr1.read();
1869 /// let ptr2 = v.as_mut_ptr().offset(2);
1870 /// ptr2.write(2);
1871 /// // Notably, the write to `ptr2` did *not* invalidate `ptr1`
1872 /// // because it mutated a different element:
1873 /// let _ = ptr1.read();
1874 /// }
1875 /// ```
1876 ///
1877 /// [`as_mut_ptr`]: Vec::as_mut_ptr
1878 /// [`as_ptr`]: Vec::as_ptr
1879 /// [`as_non_null`]: Vec::as_non_null
1880 /// [didn't allocate]: self#memory-layout
1881 #[stable(feature = "vec_as_ptr", since = "1.37.0")]
1882 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1883 #[inline]
1884 #[lint::as_ptr]
1885 #[lint::never_returns_null_ptr]
1886 pub const fn as_ptr(&self) -> *const T {
1887 // We shadow the slice method of the same name to avoid going through
1888 // `deref`, which creates an intermediate reference.
1889 self.buf.ptr()
1890 }
1891
1892 /// Returns a raw mutable pointer to the vector's buffer, or a dangling
1893 /// raw pointer valid for zero sized reads if the vector [didn't allocate].
1894 ///
1895 /// The caller must ensure that the vector outlives the pointer this
1896 /// function returns, or else it will end up dangling.
1897 /// Modifying the vector may cause its buffer to be reallocated,
1898 /// which would also make any pointers to it invalid.
1899 ///
1900 /// This method guarantees that for the purpose of the aliasing model, this method
1901 /// does not materialize a reference to the underlying slice, and thus the returned pointer
1902 /// will remain valid when mixed with other calls to [`as_ptr`], [`as_mut_ptr`],
1903 /// and [`as_non_null`].
1904 /// Note that calling other methods that materialize references to the slice,
1905 /// or references to specific elements you are planning on accessing through this pointer,
1906 /// may still invalidate this pointer.
1907 /// See the second example below for how this guarantee can be used.
1908 ///
1909 /// The method also guarantees that, as long as `T` is not zero-sized and the capacity is
1910 /// nonzero, the pointer may be passed into [`dealloc`] with a layout of
1911 /// `Layout::array::<T>(capacity)` in order to deallocate the backing memory. If this is done,
1912 /// be careful not to run the destructor of the `Vec`, as dropping it will result in
1913 /// double-frees. Wrapping the `Vec` in a [`ManuallyDrop`] is the typical way to achieve this.
1914 ///
1915 /// # Examples
1916 ///
1917 /// ```
1918 /// // Allocate vector big enough for 4 elements.
1919 /// let size = 4;
1920 /// let mut x: Vec<i32> = Vec::with_capacity(size);
1921 /// let x_ptr = x.as_mut_ptr();
1922 ///
1923 /// // Initialize elements via raw pointer writes, then set length.
1924 /// unsafe {
1925 /// for i in 0..size {
1926 /// *x_ptr.add(i) = i as i32;
1927 /// }
1928 /// x.set_len(size);
1929 /// }
1930 /// assert_eq!(&*x, &[0, 1, 2, 3]);
1931 /// ```
1932 ///
1933 /// Due to the aliasing guarantee, the following code is legal:
1934 ///
1935 /// ```rust
1936 /// unsafe {
1937 /// let mut v = vec![0];
1938 /// let ptr1 = v.as_mut_ptr();
1939 /// ptr1.write(1);
1940 /// let ptr2 = v.as_mut_ptr();
1941 /// ptr2.write(2);
1942 /// // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
1943 /// ptr1.write(3);
1944 /// }
1945 /// ```
1946 ///
1947 /// Deallocating a vector using [`Box`] (which uses [`dealloc`] internally):
1948 ///
1949 /// ```
1950 /// use std::mem::{ManuallyDrop, MaybeUninit};
1951 ///
1952 /// let mut v = ManuallyDrop::new(vec![0, 1, 2]);
1953 /// let ptr = v.as_mut_ptr();
1954 /// let capacity = v.capacity();
1955 /// let slice_ptr: *mut [MaybeUninit<i32>] =
1956 /// std::ptr::slice_from_raw_parts_mut(ptr.cast(), capacity);
1957 /// drop(unsafe { Box::from_raw(slice_ptr) });
1958 /// ```
1959 ///
1960 /// [`as_mut_ptr`]: Vec::as_mut_ptr
1961 /// [`as_ptr`]: Vec::as_ptr
1962 /// [`as_non_null`]: Vec::as_non_null
1963 /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
1964 /// [`ManuallyDrop`]: core::mem::ManuallyDrop
1965 /// [didn't allocate]: self#memory-layout
1966 #[stable(feature = "vec_as_ptr", since = "1.37.0")]
1967 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1968 #[lint::as_ptr]
1969 #[lint::never_returns_null_ptr]
1970 #[inline]
1971 pub const fn as_mut_ptr(&mut self) -> *mut T {
1972 // We shadow the slice method of the same name to avoid going through
1973 // `deref_mut`, which creates an intermediate reference.
1974 self.buf.ptr()
1975 }
1976
1977 /// Returns a `NonNull` pointer to the vector's buffer, or a dangling
1978 /// `NonNull` pointer valid for zero sized reads if the vector [didn't allocate].
1979 ///
1980 /// The caller must ensure that the vector outlives the pointer this
1981 /// function returns, or else it will end up dangling.
1982 /// Modifying the vector may cause its buffer to be reallocated,
1983 /// which would also make any pointers to it invalid.
1984 ///
1985 /// This method guarantees that for the purpose of the aliasing model, this method
1986 /// does not materialize a reference to the underlying slice, and thus the returned pointer
1987 /// will remain valid when mixed with other calls to [`as_ptr`], [`as_mut_ptr`],
1988 /// and [`as_non_null`].
1989 /// Note that calling other methods that materialize references to the slice,
1990 /// or references to specific elements you are planning on accessing through this pointer,
1991 /// may still invalidate this pointer.
1992 /// See the second example below for how this guarantee can be used.
1993 ///
1994 /// # Examples
1995 ///
1996 /// ```
1997 /// #![feature(vec_as_non_null)]
1998 ///
1999 /// // Allocate vector big enough for 4 elements.
2000 /// let size = 4;
2001 /// let mut x: Vec<i32> = Vec::with_capacity(size);
2002 /// let x_ptr = x.as_non_null();
2003 ///
2004 /// // Initialize elements via raw pointer writes, then set length.
2005 /// unsafe {
2006 /// for i in 0..size {
2007 /// x_ptr.add(i).write(i as i32);
2008 /// }
2009 /// x.set_len(size);
2010 /// }
2011 /// assert_eq!(&*x, &[0, 1, 2, 3]);
2012 /// ```
2013 ///
2014 /// Due to the aliasing guarantee, the following code is legal:
2015 ///
2016 /// ```rust
2017 /// #![feature(vec_as_non_null)]
2018 ///
2019 /// unsafe {
2020 /// let mut v = vec![0];
2021 /// let ptr1 = v.as_non_null();
2022 /// ptr1.write(1);
2023 /// let ptr2 = v.as_non_null();
2024 /// ptr2.write(2);
2025 /// // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
2026 /// ptr1.write(3);
2027 /// }
2028 /// ```
2029 ///
2030 /// [`as_mut_ptr`]: Vec::as_mut_ptr
2031 /// [`as_ptr`]: Vec::as_ptr
2032 /// [`as_non_null`]: Vec::as_non_null
2033 /// [didn't allocate]: self#memory-layout
2034 #[unstable(feature = "vec_as_non_null", issue = "157843")]
2035 #[rustc_const_unstable(feature = "vec_as_non_null", issue = "157843")]
2036 #[lint::as_ptr]
2037 #[inline]
2038 pub const fn as_non_null(&mut self) -> NonNull<T> {
2039 self.buf.non_null()
2040 }
2041
2042 /// Returns a reference to the underlying allocator.
2043 #[stable(feature = "allocator_api", since = "1.100.0")]
2044 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
2045 #[inline]
2046 pub const fn allocator(&self) -> &A {
2047 self.buf.allocator()
2048 }
2049
2050 /// Forces the length of the vector to `new_len`.
2051 ///
2052 /// This is a low-level operation that maintains none of the normal
2053 /// invariants of the type. Normally changing the length of a vector
2054 /// is done using one of the safe operations instead, such as
2055 /// [`truncate`], [`resize`], [`extend`], or [`clear`].
2056 ///
2057 /// [`truncate`]: Vec::truncate
2058 /// [`resize`]: Vec::resize
2059 /// [`extend`]: Extend::extend
2060 /// [`clear`]: Vec::clear
2061 ///
2062 /// # Safety
2063 ///
2064 /// - `new_len` must be less than or equal to [`capacity()`].
2065 /// - The elements at `old_len..new_len` must be initialized.
2066 ///
2067 /// [`capacity()`]: Vec::capacity
2068 ///
2069 /// # Examples
2070 ///
2071 /// See [`spare_capacity_mut()`] for an example with safe
2072 /// initialization of capacity elements and use of this method.
2073 ///
2074 /// `set_len()` can be useful for situations in which the vector
2075 /// is serving as a buffer for other code, particularly over FFI:
2076 ///
2077 /// ```no_run
2078 /// # #![allow(dead_code)]
2079 /// # // This is just a minimal skeleton for the doc example;
2080 /// # // don't use this as a starting point for a real library.
2081 /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void }
2082 /// # const Z_OK: i32 = 0;
2083 /// # unsafe extern "C" {
2084 /// # fn deflateGetDictionary(
2085 /// # strm: *mut std::ffi::c_void,
2086 /// # dictionary: *mut u8,
2087 /// # dictLength: *mut usize,
2088 /// # ) -> i32;
2089 /// # }
2090 /// # impl StreamWrapper {
2091 /// pub fn get_dictionary(&self) -> Option<Vec<u8>> {
2092 /// // Per the FFI method's docs, "32768 bytes is always enough".
2093 /// let mut dict = Vec::with_capacity(32_768);
2094 /// let mut dict_length = 0;
2095 /// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
2096 /// // 1. `dict_length` elements were initialized.
2097 /// // 2. `dict_length` <= the capacity (32_768)
2098 /// // which makes `set_len` safe to call.
2099 /// unsafe {
2100 /// // Make the FFI call...
2101 /// let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
2102 /// if r == Z_OK {
2103 /// // ...and update the length to what was initialized.
2104 /// dict.set_len(dict_length);
2105 /// Some(dict)
2106 /// } else {
2107 /// None
2108 /// }
2109 /// }
2110 /// }
2111 /// # }
2112 /// ```
2113 ///
2114 /// While the following example is sound, there is a memory leak since
2115 /// the inner vectors were not freed prior to the `set_len` call:
2116 ///
2117 /// ```
2118 /// let mut vec = vec![vec![1, 0, 0],
2119 /// vec![0, 1, 0],
2120 /// vec![0, 0, 1]];
2121 /// // SAFETY:
2122 /// // 1. `old_len..0` is empty so no elements need to be initialized.
2123 /// // 2. `0 <= capacity` always holds whatever `capacity` is.
2124 /// unsafe {
2125 /// vec.set_len(0);
2126 /// # // FIXME(https://github.com/rust-lang/miri/issues/3670):
2127 /// # // use -Zmiri-disable-leak-check instead of unleaking in tests meant to leak.
2128 /// # vec.set_len(3);
2129 /// }
2130 /// ```
2131 ///
2132 /// Normally, here, one would use [`clear`] instead to correctly drop
2133 /// the contents and thus not leak memory.
2134 ///
2135 /// [`spare_capacity_mut()`]: Vec::spare_capacity_mut
2136 #[inline]
2137 #[stable(feature = "rust1", since = "1.0.0")]
2138 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
2139 pub const unsafe fn set_len(&mut self, new_len: usize) {
2140 ub_checks::assert_unsafe_precondition!(
2141 check_library_ub,
2142 "Vec::set_len requires that new_len <= capacity()",
2143 (new_len: usize = new_len, capacity: usize = self.capacity()) => new_len <= capacity
2144 );
2145
2146 self.len = new_len;
2147 }
2148
2149 /// Removes an element from the vector and returns it.
2150 ///
2151 /// The removed element is replaced by the last element of the vector.
2152 ///
2153 /// This does not preserve ordering of the remaining elements, but is *O*(1).
2154 /// If you need to preserve the element order, use [`remove`] instead.
2155 ///
2156 /// [`remove`]: Vec::remove
2157 ///
2158 /// # Panics
2159 ///
2160 /// Panics if `index` is out of bounds.
2161 ///
2162 /// # Examples
2163 ///
2164 /// ```
2165 /// let mut v = vec!["foo", "bar", "baz", "qux"];
2166 ///
2167 /// assert_eq!(v.swap_remove(1), "bar");
2168 /// assert_eq!(v, ["foo", "qux", "baz"]);
2169 ///
2170 /// assert_eq!(v.swap_remove(0), "foo");
2171 /// assert_eq!(v, ["baz", "qux"]);
2172 /// ```
2173 #[inline]
2174 #[stable(feature = "rust1", since = "1.0.0")]
2175 pub fn swap_remove(&mut self, index: usize) -> T {
2176 #[cold]
2177 #[cfg_attr(not(panic = "immediate-abort"), inline(never))]
2178 #[optimize(size)]
2179 fn assert_failed(index: usize, len: usize) -> ! {
2180 panic!("swap_remove index (is {index}) should be < len (is {len})");
2181 }
2182
2183 let len = self.len();
2184 if index >= len {
2185 assert_failed(index, len);
2186 }
2187 // ignore-tidy-undocumented-unsafe
2188 unsafe {
2189 // We replace self[index] with the last element. Note that if the
2190 // bounds check above succeeds there must be a last element (which
2191 // can be self[index] itself).
2192 let value = ptr::read(self.as_ptr().add(index));
2193 let base_ptr = self.as_mut_ptr();
2194 ptr::copy(base_ptr.add(len - 1), base_ptr.add(index), 1);
2195 self.set_len(len - 1);
2196 value
2197 }
2198 }
2199
2200 /// Inserts an element at position `index` within the vector, shifting all
2201 /// elements after it to the right.
2202 ///
2203 /// # Panics
2204 ///
2205 /// Panics if `index > len`.
2206 ///
2207 /// # Examples
2208 ///
2209 /// ```
2210 /// let mut vec = vec!['a', 'b', 'c'];
2211 /// vec.insert(1, 'd');
2212 /// assert_eq!(vec, ['a', 'd', 'b', 'c']);
2213 /// vec.insert(4, 'e');
2214 /// assert_eq!(vec, ['a', 'd', 'b', 'c', 'e']);
2215 /// ```
2216 ///
2217 /// # Time complexity
2218 ///
2219 /// Takes *O*([`Vec::len`]) time. All items after the insertion index must be
2220 /// shifted to the right. In the worst case, all elements are shifted when
2221 /// the insertion index is 0.
2222 #[cfg(not(no_global_oom_handling))]
2223 #[stable(feature = "rust1", since = "1.0.0")]
2224 #[track_caller]
2225 pub fn insert(&mut self, index: usize, element: T) {
2226 let _ = self.insert_mut(index, element);
2227 }
2228
2229 /// Inserts an element at position `index` within the vector, shifting all
2230 /// elements after it to the right, and returning a reference to the new
2231 /// element.
2232 ///
2233 /// # Panics
2234 ///
2235 /// Panics if `index > len`.
2236 ///
2237 /// # Examples
2238 ///
2239 /// ```
2240 /// let mut vec = vec![1, 3, 5, 9];
2241 /// let x = vec.insert_mut(3, 6);
2242 /// *x += 1;
2243 /// assert_eq!(vec, [1, 3, 5, 7, 9]);
2244 /// ```
2245 ///
2246 /// # Time complexity
2247 ///
2248 /// Takes *O*([`Vec::len`]) time. All items after the insertion index must be
2249 /// shifted to the right. In the worst case, all elements are shifted when
2250 /// the insertion index is 0.
2251 #[cfg(not(no_global_oom_handling))]
2252 #[inline]
2253 #[stable(feature = "push_mut", since = "1.95.0")]
2254 #[track_caller]
2255 #[must_use = "if you don't need a reference to the value, use `Vec::insert` instead"]
2256 pub fn insert_mut(&mut self, index: usize, element: T) -> &mut T {
2257 #[cold]
2258 #[cfg_attr(not(panic = "immediate-abort"), inline(never))]
2259 #[track_caller]
2260 #[optimize(size)]
2261 fn assert_failed(index: usize, len: usize) -> ! {
2262 panic!("insertion index (is {index}) should be <= len (is {len})");
2263 }
2264
2265 let len = self.len();
2266 if index > len {
2267 assert_failed(index, len);
2268 }
2269
2270 // space for the new element
2271 if len == self.buf.capacity() {
2272 self.buf.grow_one();
2273 }
2274
2275 // ignore-tidy-undocumented-unsafe
2276 unsafe {
2277 // infallible
2278 // The spot to put the new value
2279 let p = self.as_mut_ptr().add(index);
2280 {
2281 if index < len {
2282 // Shift everything over to make space. (Duplicating the
2283 // `index`th element into two consecutive places.)
2284 ptr::copy(p, p.add(1), len - index);
2285 }
2286 // Write it in, overwriting the first copy of the `index`th
2287 // element.
2288 ptr::write(p, element);
2289 }
2290 self.set_len(len + 1);
2291 &mut *p
2292 }
2293 }
2294
2295 /// Removes and returns the element at position `index` within the vector,
2296 /// shifting all elements after it to the left.
2297 ///
2298 /// Note: Because this shifts over the remaining elements, it has a
2299 /// worst-case performance of *O*(*n*). If you don't need the order of elements
2300 /// to be preserved, use [`swap_remove`] instead. If you'd like to remove
2301 /// elements from the beginning of the `Vec`, consider using
2302 /// [`VecDeque::pop_front`] instead.
2303 ///
2304 /// [`swap_remove`]: Vec::swap_remove
2305 /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
2306 ///
2307 /// # Panics
2308 ///
2309 /// Panics if `index` is out of bounds.
2310 ///
2311 /// # Examples
2312 ///
2313 /// ```
2314 /// let mut v = vec!['a', 'b', 'c'];
2315 /// assert_eq!(v.remove(1), 'b');
2316 /// assert_eq!(v, ['a', 'c']);
2317 /// ```
2318 #[stable(feature = "rust1", since = "1.0.0")]
2319 #[track_caller]
2320 #[rustc_confusables("delete", "take")]
2321 pub fn remove(&mut self, index: usize) -> T {
2322 #[cold]
2323 #[cfg_attr(not(panic = "immediate-abort"), inline(never))]
2324 #[track_caller]
2325 #[optimize(size)]
2326 fn assert_failed(index: usize, len: usize) -> ! {
2327 panic!("removal index (is {index}) should be < len (is {len})");
2328 }
2329
2330 match self.try_remove(index) {
2331 Some(elem) => elem,
2332 None => assert_failed(index, self.len()),
2333 }
2334 }
2335
2336 /// Remove and return the element at position `index` within the vector,
2337 /// shifting all elements after it to the left, or [`None`] if it does not
2338 /// exist.
2339 ///
2340 /// Note: Because this shifts over the remaining elements, it has a
2341 /// worst-case performance of *O*(*n*). If you'd like to remove
2342 /// elements from the beginning of the `Vec`, consider using
2343 /// [`VecDeque::pop_front`] instead.
2344 ///
2345 /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
2346 ///
2347 /// # Examples
2348 ///
2349 /// ```
2350 /// let mut v = vec![1, 2, 3];
2351 /// assert_eq!(v.try_remove(0), Some(1));
2352 /// assert_eq!(v.try_remove(2), None);
2353 /// ```
2354 #[stable(feature = "vec_try_remove", since = "CURRENT_RUSTC_VERSION")]
2355 #[rustc_confusables("delete", "take", "remove")]
2356 pub fn try_remove(&mut self, index: usize) -> Option<T> {
2357 let len = self.len();
2358 if index >= len {
2359 return None;
2360 }
2361 // infallible
2362 let ret;
2363 // ignore-tidy-undocumented-unsafe
2364 unsafe {
2365 {
2366 // the place we are taking from.
2367 let ptr = self.as_mut_ptr().add(index);
2368 // copy it out, unsafely having a copy of the value on
2369 // the stack and in the vector at the same time.
2370 ret = ptr::read(ptr);
2371
2372 // Shift everything down to fill in that spot.
2373 ptr::copy(ptr.add(1), ptr, len - index - 1);
2374 }
2375 self.set_len(len - 1);
2376 }
2377 Some(ret)
2378 }
2379
2380 /// Retains only the elements specified by the predicate.
2381 ///
2382 /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
2383 /// This method operates in place, visiting each element exactly once in the
2384 /// original order, and preserves the order of the retained elements.
2385 ///
2386 /// # Examples
2387 ///
2388 /// ```
2389 /// let mut vec = vec![1, 2, 3, 4];
2390 /// vec.retain(|&x| x % 2 == 0);
2391 /// assert_eq!(vec, [2, 4]);
2392 /// ```
2393 ///
2394 /// Because the elements are visited exactly once in the original order,
2395 /// external state may be used to decide which elements to keep.
2396 ///
2397 /// ```
2398 /// let mut vec = vec![1, 2, 3, 4, 5];
2399 /// let keep = [false, true, true, false, true];
2400 /// let mut iter = keep.iter();
2401 /// vec.retain(|_| *iter.next().unwrap());
2402 /// assert_eq!(vec, [2, 3, 5]);
2403 /// ```
2404 #[stable(feature = "rust1", since = "1.0.0")]
2405 pub fn retain<F>(&mut self, mut f: F)
2406 where
2407 F: FnMut(&T) -> bool,
2408 {
2409 self.retain_mut(|elem| f(elem));
2410 }
2411
2412 /// Retains only the elements specified by the predicate, passing a mutable reference to it.
2413 ///
2414 /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
2415 /// This method operates in place, visiting each element exactly once in the
2416 /// original order, and preserves the order of the retained elements.
2417 ///
2418 /// # Examples
2419 ///
2420 /// ```
2421 /// let mut vec = vec![1, 2, 3, 4];
2422 /// vec.retain_mut(|x| if *x <= 3 {
2423 /// *x += 1;
2424 /// true
2425 /// } else {
2426 /// false
2427 /// });
2428 /// assert_eq!(vec, [2, 3, 4]);
2429 /// ```
2430 #[stable(feature = "vec_retain_mut", since = "1.61.0")]
2431 pub fn retain_mut<F>(&mut self, mut f: F)
2432 where
2433 F: FnMut(&mut T) -> bool,
2434 {
2435 let original_len = self.len();
2436
2437 if original_len == 0 {
2438 // Empty case: explicit return allows better optimization, vs letting compiler infer it
2439 return;
2440 }
2441
2442 #[cfg(all(target_arch = "aarch64", target_feature = "sve"))]
2443 {
2444 let long_enough = match mem::size_of::<T>() {
2445 1 => original_len >= sve_retain::MIN_SVE_SIZE_1,
2446 2 => original_len >= sve_retain::MIN_SVE_SIZE_2,
2447 4 => original_len >= sve_retain::MIN_SVE_SIZE_4,
2448 8 => original_len >= sve_retain::MIN_SVE_SIZE_8,
2449 _ => false,
2450 };
2451 if long_enough {
2452 // SAFETY: size_of::<T>() is 1, 2, 4 or 8, matching
2453 // the kernel lane widths.
2454 return unsafe { sve_retain::chunked_retain(self, f) };
2455 }
2456 }
2457
2458 // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked]
2459 // | ^- write ^- read |
2460 // |<- original_len ->|
2461 // Kept: Elements which predicate returns true on.
2462 // Hole: Moved or dropped element slot.
2463 // Unchecked: Unchecked valid elements.
2464 //
2465 // This drop guard will be invoked when predicate or `drop` of element panicked.
2466 // It shifts unchecked elements to cover holes and `set_len` to the correct length.
2467 // In cases when predicate and `drop` never panick, it will be optimized out.
2468 struct PanicGuard<'a, T, A: Allocator> {
2469 v: &'a mut Vec<T, A>,
2470 read: usize,
2471 write: usize,
2472 original_len: usize,
2473 }
2474
2475 impl<T, A: Allocator> Drop for PanicGuard<'_, T, A> {
2476 #[cold]
2477 fn drop(&mut self) {
2478 let remaining = self.original_len - self.read;
2479 // SAFETY: Trailing unchecked items must be valid since we never touch them.
2480 unsafe {
2481 ptr::copy(
2482 self.v.as_ptr().add(self.read),
2483 self.v.as_mut_ptr().add(self.write),
2484 remaining,
2485 );
2486 }
2487 // SAFETY: After filling holes, all items are in contiguous memory.
2488 unsafe {
2489 self.v.set_len(self.write + remaining);
2490 }
2491 }
2492 }
2493
2494 let mut read = 0;
2495 loop {
2496 // SAFETY: read < original_len
2497 let cur = unsafe { self.get_unchecked_mut(read) };
2498 if hint::unlikely(!f(cur)) {
2499 break;
2500 }
2501 read += 1;
2502 if read == original_len {
2503 // All elements are kept, return early.
2504 return;
2505 }
2506 }
2507
2508 // Critical section starts here and at least one element is going to be removed.
2509 // Advance `g.read` early to avoid double drop if `drop_in_place` panicked.
2510 let mut g = PanicGuard { v: self, read: read + 1, write: read, original_len };
2511 // SAFETY: previous `read` is always less than original_len.
2512 unsafe { ptr::drop_in_place(&mut *g.v.as_mut_ptr().add(read)) };
2513
2514 while g.read < g.original_len {
2515 // SAFETY: `read` is always less than original_len.
2516 let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.read) };
2517 if !f(cur) {
2518 // Advance `read` early to avoid double drop if `drop_in_place` panicked.
2519 g.read += 1;
2520 // SAFETY: We never touch this element again after dropped.
2521 unsafe { ptr::drop_in_place(cur) };
2522 } else {
2523 // SAFETY: `read` > `write`, so the slots don't overlap.
2524 // We use copy for move, and never touch the source element again.
2525 unsafe {
2526 let hole = g.v.as_mut_ptr().add(g.write);
2527 ptr::copy_nonoverlapping(cur, hole, 1);
2528 }
2529 g.write += 1;
2530 g.read += 1;
2531 }
2532 }
2533
2534 // We are leaving the critical section and no panic happened,
2535 // Commit the length change and forget the guard.
2536 // SAFETY: `write` is always less than or equal to original_len.
2537 unsafe { g.v.set_len(g.write) };
2538 mem::forget(g);
2539 }
2540
2541 /// Retains only the elements specified by the predicate, passing a mutable reference to it.
2542 ///
2543 /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
2544 /// This method does not maintain the relative order of the retained elements. If order matters,
2545 /// consider using [`Vec::retain_mut`] instead. However, if no items are removed, then all items
2546 /// are left in their original positions.
2547 ///
2548 /// [`Vec::retain_mut`]: crate::vec::Vec::retain_mut
2549 ///
2550 /// Time complexity: *O*(*n*)
2551 ///
2552 ///
2553 /// # Examples
2554 ///
2555 /// ```
2556 /// #![feature(retain_unstable)]
2557 /// let mut vec = vec![4, 3, 2, 1];
2558 /// vec.retain_unstable(|x| if *x <= 3 {
2559 /// *x += 1;
2560 /// true
2561 /// } else {
2562 /// false
2563 /// });
2564 ///
2565 /// vec.sort(); // it might be in any order, so normalize before asserting
2566 /// assert_eq!(vec, [2, 3, 4]);
2567 /// ```
2568 #[unstable(feature = "retain_unstable", issue = "164152")]
2569 pub fn retain_unstable<F>(&mut self, mut f: F)
2570 where
2571 F: FnMut(&mut T) -> bool,
2572 {
2573 // Currently this does the following:
2574 // 1) Search backward until you find an element you want to remove
2575 // 2) Swap this element with an element that was kept in the back
2576 // (or if there are no remaining elements, simply truncate the vec)
2577 // 3) Repeat from 1) until there's no element to iterate through
2578
2579 let original_len = self.len();
2580
2581 if original_len == 0 {
2582 // Empty case: explicit return allows better optimization, vs letting compiler infer it
2583 return;
2584 }
2585
2586 let mut read_back = original_len;
2587 let mut hole = loop {
2588 if read_back == 0 {
2589 // All elements are kept
2590 return;
2591 }
2592 // SAFETY: read_back - 1 < original_len
2593 let cur = unsafe { &mut *self.as_mut_ptr().add(read_back - 1) };
2594 if hint::unlikely(!f(cur)) {
2595 break cur;
2596 }
2597 read_back -= 1;
2598 };
2599
2600 if read_back < self.len {
2601 let swap = self.pop().unwrap();
2602 *hole = swap;
2603 } else {
2604 self.truncate(self.len - 1);
2605 }
2606 read_back -= 1;
2607
2608 while read_back > 0 {
2609 // SAFETY: read_back - 1 is always less than current length of
2610 // the vector and the loop condition, read_back > 0, prevents
2611 // read_back from underflowing
2612 hole = unsafe { &mut *self.as_mut_ptr().add(read_back - 1) };
2613 if !f(hole) {
2614 if read_back < self.len {
2615 let swap = self.pop().unwrap();
2616 *hole = swap;
2617 } else {
2618 self.truncate(self.len - 1);
2619 }
2620 }
2621 read_back -= 1;
2622 }
2623 }
2624
2625 /// Removes all but the first of consecutive elements in the vector that resolve to the same
2626 /// key.
2627 ///
2628 /// If the vector is sorted, this removes all duplicates.
2629 ///
2630 /// # Examples
2631 ///
2632 /// ```
2633 /// let mut vec = vec![10, 20, 21, 30, 20];
2634 ///
2635 /// vec.dedup_by_key(|i| *i / 10);
2636 ///
2637 /// assert_eq!(vec, [10, 20, 30, 20]);
2638 /// ```
2639 #[stable(feature = "dedup_by", since = "1.16.0")]
2640 #[inline]
2641 pub fn dedup_by_key<F, K>(&mut self, mut key: F)
2642 where
2643 F: FnMut(&mut T) -> K,
2644 K: PartialEq,
2645 {
2646 self.dedup_by(|a, b| key(a) == key(b))
2647 }
2648
2649 /// Removes all but the first of consecutive elements in the vector that are
2650 /// "equal" according to the given predicate function.
2651 ///
2652 /// The predicate `same_bucket(x, p)` is passed references to two elements.
2653 /// If it returns `true`, the element `x` is removed from the vector.
2654 ///
2655 /// The element `p` occurs *before* `x` in the vector (`[.., p, .., x, ..]`),
2656 /// so `same_bucket(x, p)` is receiving them in reversed order (unlike [`windows`]).
2657 ///
2658 /// If the vector is sorted, this removes all duplicates. For more complicated predicates
2659 /// however, the order (ascending vs. descending) can matter.
2660 ///
2661 /// [`windows`]: slice::windows
2662 ///
2663 /// # Examples
2664 ///
2665 /// ```
2666 /// let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
2667 /// vec.dedup_by(|x, p| x.eq_ignore_ascii_case(p));
2668 /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
2669 /// ```
2670 ///
2671 /// Both references passed to `same_bucket` are mutable.
2672 /// This allows merging elements by mutating `p` and returning `true`:
2673 ///
2674 /// ```
2675 /// let mut ranges = vec![1..2, 2..4, 2..5, 8..9];
2676 ///
2677 /// // Sort ranges by start, and if equal, by end (lexicographically)
2678 /// // Sorting in reverse instead (`x.start.cmp(&p.start)...`) would later fail
2679 /// ranges.sort_unstable_by(|p, x| p.start.cmp(&x.start).then(p.end.cmp(&x.end)));
2680 ///
2681 /// // Merge touching (`1..2` and `2..4`) and then overlapping (`1..4` and `2..5`) ranges
2682 /// ranges.dedup_by(|x, p| {
2683 /// if p.end >= x.start {
2684 /// p.end = p.end.max(x.end);
2685 /// true
2686 /// } else {
2687 /// false
2688 /// }
2689 /// });
2690 ///
2691 /// assert_eq!(ranges, [1..5, 8..9]);
2692 /// ```
2693 #[stable(feature = "dedup_by", since = "1.16.0")]
2694 pub fn dedup_by<F>(&mut self, mut same_bucket: F)
2695 where
2696 F: FnMut(&mut T, &mut T) -> bool,
2697 {
2698 let len = self.len();
2699 if len <= 1 {
2700 return;
2701 }
2702
2703 // Check if we ever want to remove anything.
2704 // This allows to use copy_non_overlapping in next cycle.
2705 // And avoids any memory writes if we don't need to remove anything.
2706 let mut first_duplicate_idx: usize = 1;
2707 let start = self.as_mut_ptr();
2708 while first_duplicate_idx != len {
2709 let found_duplicate = {
2710 // SAFETY: first_duplicate always in range [1..len).
2711 // Note that we start iteration from 1 so we never overflow.
2712 let prev = unsafe { start.add(first_duplicate_idx.wrapping_sub(1)) };
2713 // ignore-tidy-undocumented-unsafe
2714 let current = unsafe { start.add(first_duplicate_idx) };
2715 // We explicitly say in docs that references are reversed.
2716 // ignore-tidy-undocumented-unsafe
2717 unsafe { same_bucket(&mut *current, &mut *prev) }
2718 };
2719 if found_duplicate {
2720 break;
2721 }
2722 first_duplicate_idx += 1;
2723 }
2724 // Don't need to remove anything.
2725 // We cannot get bigger than len.
2726 if first_duplicate_idx == len {
2727 return;
2728 }
2729 // SAFETY: first_duplicate_idx always in range [1..len)
2730 unsafe {
2731 self.dedup_tail(same_bucket, first_duplicate_idx);
2732 }
2733 }
2734
2735 /// Continues deduplication after the first duplicate is found.
2736 ///
2737 /// The function treats `self[first_duplicate]` as the first duplicated
2738 /// element and drops it.
2739 ///
2740 /// # Safety
2741 ///
2742 /// `1 <= first_duplicate < self.len()`
2743 unsafe fn dedup_tail<F>(&mut self, mut same_bucket: F, first_duplicate: usize)
2744 where
2745 F: FnMut(&mut T, &mut T) -> bool,
2746 {
2747 /* INVARIANT: vec.len() > read > write > write-1 >= 0 */
2748 struct FillGapOnDrop<'a, T, A: core::alloc::Allocator> {
2749 /* Offset of the element we want to check if it is duplicate */
2750 read: usize,
2751
2752 /* Offset of the place where we want to place the non-duplicate
2753 * when we find it. */
2754 write: usize,
2755
2756 /* The Vec that would need correction if `same_bucket` panicked */
2757 vec: &'a mut Vec<T, A>,
2758 }
2759
2760 impl<'a, T, A: core::alloc::Allocator> Drop for FillGapOnDrop<'a, T, A> {
2761 fn drop(&mut self) {
2762 /* This code gets executed when `same_bucket` panics */
2763
2764 // SAFETY: invariant guarantees that `read - write`
2765 // and `len - read` never overflow and that the copy is always
2766 // in-bounds.
2767 unsafe {
2768 let ptr = self.vec.as_mut_ptr();
2769 let len = self.vec.len();
2770
2771 /* How many items were left when `same_bucket` panicked.
2772 * Basically vec[read..].len() */
2773 let items_left = len.wrapping_sub(self.read);
2774
2775 /* Pointer to first item in vec[write..write+items_left] slice */
2776 let dropped_ptr = ptr.add(self.write);
2777 /* Pointer to first item in vec[read..] slice */
2778 let valid_ptr = ptr.add(self.read);
2779
2780 /* Copy `vec[read..]` to `vec[write..write+items_left]`.
2781 * The slices can overlap, so `copy_nonoverlapping` cannot be used */
2782 ptr::copy(valid_ptr, dropped_ptr, items_left);
2783
2784 /* How many items have been already dropped
2785 * Basically vec[read..write].len() */
2786 let dropped = self.read.wrapping_sub(self.write);
2787
2788 self.vec.set_len(len - dropped);
2789 }
2790 }
2791 }
2792
2793 let start = self.as_mut_ptr();
2794 let len = self.len();
2795
2796 /* Drop items while going through Vec, it should be more efficient than
2797 * doing slice partition_dedup + truncate */
2798
2799 // Construct gap first and then drop item to avoid memory corruption if `T::drop` panics.
2800 let mut gap =
2801 FillGapOnDrop { read: first_duplicate + 1, write: first_duplicate, vec: self };
2802
2803 // SAFETY: By this function's safety contract, `first_duplicate < self.len()`.
2804 // If drop panics, `gap` would remove this item without drop.
2805 unsafe {
2806 ptr::drop_in_place(start.add(first_duplicate));
2807 }
2808
2809 // SAFETY: Because of the invariant, read_ptr, prev_ptr and write_ptr
2810 // are always in-bounds and read_ptr never aliases prev_ptr
2811 unsafe {
2812 while gap.read < len {
2813 let read_ptr = start.add(gap.read);
2814 let prev_ptr = start.add(gap.write.wrapping_sub(1));
2815
2816 // We explicitly say in docs that references are reversed.
2817 let found_duplicate = same_bucket(&mut *read_ptr, &mut *prev_ptr);
2818 if found_duplicate {
2819 // Increase `gap.read` now since the drop may panic.
2820 gap.read += 1;
2821 /* We have found duplicate, drop it in-place */
2822 ptr::drop_in_place(read_ptr);
2823 } else {
2824 let write_ptr = start.add(gap.write);
2825
2826 /* read_ptr cannot be equal to write_ptr because at this point
2827 * we guaranteed to skip at least one element (before loop starts).
2828 */
2829 ptr::copy_nonoverlapping(read_ptr, write_ptr, 1);
2830
2831 /* We have filled that place, so go further */
2832 gap.write += 1;
2833 gap.read += 1;
2834 }
2835 }
2836
2837 /* Technically we could let `gap` clean up with its Drop, but
2838 * when `same_bucket` is guaranteed to not panic, this bloats a little
2839 * the codegen, so we just do it manually */
2840 gap.vec.set_len(gap.write);
2841 mem::forget(gap);
2842 }
2843 }
2844
2845 /// Appends an element and returns a reference to it if there is sufficient spare capacity,
2846 /// otherwise an error is returned with the element.
2847 ///
2848 /// Unlike [`push`] this method will not reallocate when there's insufficient capacity.
2849 /// The caller should use [`reserve`] or [`try_reserve`] to ensure that there is enough capacity.
2850 ///
2851 /// [`push`]: Vec::push
2852 /// [`reserve`]: Vec::reserve
2853 /// [`try_reserve`]: Vec::try_reserve
2854 ///
2855 /// # Examples
2856 ///
2857 /// A manual, panic-free alternative to [`FromIterator`]:
2858 ///
2859 /// ```
2860 /// #![feature(vec_push_within_capacity)]
2861 ///
2862 /// use std::collections::TryReserveError;
2863 /// fn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {
2864 /// let mut vec = Vec::new();
2865 /// for value in iter {
2866 /// if let Err(value) = vec.push_within_capacity(value) {
2867 /// vec.try_reserve(1)?;
2868 /// // this cannot fail, the previous line either returned or added at least 1 free slot
2869 /// let _ = vec.push_within_capacity(value);
2870 /// }
2871 /// }
2872 /// Ok(vec)
2873 /// }
2874 /// assert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
2875 /// ```
2876 ///
2877 /// # Time complexity
2878 ///
2879 /// Takes *O*(1) time.
2880 #[inline]
2881 #[unstable(feature = "vec_push_within_capacity", issue = "100486")]
2882 pub fn push_within_capacity(&mut self, value: T) -> Result<&mut T, T> {
2883 if self.len == self.buf.capacity() {
2884 return Err(value);
2885 }
2886
2887 // ignore-tidy-undocumented-unsafe
2888 let end = unsafe { self.as_mut_ptr().add(self.len) };
2889 // ignore-tidy-undocumented-unsafe
2890 unsafe { ptr::write(end, value) };
2891 self.len += 1;
2892
2893 // SAFETY: We just wrote a value to the pointer that will live the lifetime of the reference.
2894 Ok(unsafe { &mut *end })
2895 }
2896
2897 /// Removes the last element from a vector and returns it, or [`None`] if it
2898 /// is empty.
2899 ///
2900 /// If you'd like to pop the first element, consider using
2901 /// [`VecDeque::pop_front`] instead.
2902 ///
2903 /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
2904 ///
2905 /// # Examples
2906 ///
2907 /// ```
2908 /// let mut vec = vec![1, 2, 3];
2909 /// assert_eq!(vec.pop(), Some(3));
2910 /// assert_eq!(vec, [1, 2]);
2911 /// ```
2912 ///
2913 /// # Time complexity
2914 ///
2915 /// Takes *O*(1) time.
2916 #[inline]
2917 #[stable(feature = "rust1", since = "1.0.0")]
2918 #[rustc_diagnostic_item = "vec_pop"]
2919 pub fn pop(&mut self) -> Option<T> {
2920 if self.len == 0 {
2921 None
2922 } else {
2923 self.len -= 1;
2924 // ignore-tidy-undocumented-unsafe
2925 unsafe {
2926 core::hint::assert_unchecked(self.len < self.capacity());
2927 Some(ptr::read(self.as_ptr().add(self.len())))
2928 }
2929 }
2930 }
2931
2932 /// Removes and returns the last element from a vector if the predicate
2933 /// returns `true`, or [`None`] if the predicate returns false or the vector
2934 /// is empty (the predicate will not be called in that case).
2935 ///
2936 /// # Examples
2937 ///
2938 /// ```
2939 /// let mut vec = vec![1, 2, 3, 4];
2940 /// let pred = |x: &mut i32| *x % 2 == 0;
2941 ///
2942 /// assert_eq!(vec.pop_if(pred), Some(4));
2943 /// assert_eq!(vec, [1, 2, 3]);
2944 /// assert_eq!(vec.pop_if(pred), None);
2945 /// ```
2946 #[stable(feature = "vec_pop_if", since = "1.86.0")]
2947 pub fn pop_if(&mut self, predicate: impl FnOnce(&mut T) -> bool) -> Option<T> {
2948 let last = self.last_mut()?;
2949 if predicate(last) { self.pop() } else { None }
2950 }
2951
2952 /// Returns a mutable reference to the last item in the vector, or
2953 /// `None` if it is empty.
2954 ///
2955 /// # Examples
2956 ///
2957 /// Basic usage:
2958 ///
2959 /// ```
2960 /// #![feature(vec_peek_mut)]
2961 /// let mut vec = Vec::new();
2962 /// assert!(vec.peek_mut().is_none());
2963 ///
2964 /// vec.push(1);
2965 /// vec.push(5);
2966 /// vec.push(2);
2967 /// assert_eq!(vec.last(), Some(&2));
2968 /// if let Some(mut val) = vec.peek_mut() {
2969 /// *val = 0;
2970 /// }
2971 /// assert_eq!(vec.last(), Some(&0));
2972 /// ```
2973 #[inline]
2974 #[unstable(feature = "vec_peek_mut", issue = "122742")]
2975 pub fn peek_mut(&mut self) -> Option<PeekMut<'_, T, A>>
2976 where
2977 A: AllocatorNightly,
2978 {
2979 PeekMut::new(self)
2980 }
2981
2982 /// Moves all the elements of `other` into `self`, leaving `other` empty.
2983 ///
2984 /// # Panics
2985 ///
2986 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
2987 ///
2988 /// # Examples
2989 ///
2990 /// ```
2991 /// let mut vec = vec![1, 2, 3];
2992 /// let mut vec2 = vec![4, 5, 6];
2993 /// vec.append(&mut vec2);
2994 /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
2995 /// assert_eq!(vec2, []);
2996 /// ```
2997 #[cfg(not(no_global_oom_handling))]
2998 #[inline]
2999 #[stable(feature = "append", since = "1.4.0")]
3000 pub fn append(&mut self, other: &mut Self) {
3001 // ignore-tidy-undocumented-unsafe
3002 unsafe {
3003 self.append_elements(other.as_slice() as _);
3004 other.set_len(0);
3005 }
3006 }
3007
3008 /// Appends elements to `self` from other buffer.
3009 #[cfg(not(no_global_oom_handling))]
3010 #[inline]
3011 unsafe fn append_elements(&mut self, other: *const [T]) {
3012 self.reserve(other.len());
3013 // ignore-tidy-undocumented-unsafe
3014 unsafe {
3015 self.append_elements_unreserved(other);
3016 }
3017 }
3018
3019 /// Appends elements to `self` from other buffer, returning [`TryReserveError`] on OOM.
3020 #[inline]
3021 unsafe fn try_append_elements(&mut self, other: *const [T]) -> Result<(), TryReserveError> {
3022 self.try_reserve(other.len())?;
3023 // ignore-tidy-undocumented-unsafe
3024 unsafe {
3025 self.append_elements_unreserved(other);
3026 }
3027 Ok(())
3028 }
3029
3030 /// Appends elements to `self` from other buffer without reserving additional capacity.
3031 #[inline]
3032 unsafe fn append_elements_unreserved(&mut self, other: *const [T]) {
3033 let count = other.len();
3034 let len = self.len();
3035 if count > 0 {
3036 // ignore-tidy-undocumented-unsafe
3037 unsafe {
3038 ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count)
3039 };
3040 }
3041 self.len += count;
3042 }
3043
3044 /// Removes the subslice indicated by the given range from the vector,
3045 /// returning a double-ended iterator over the removed subslice.
3046 ///
3047 /// If the iterator is dropped before being fully consumed,
3048 /// it drops the remaining removed elements.
3049 ///
3050 /// The returned iterator keeps a mutable borrow on the vector to optimize
3051 /// its implementation.
3052 ///
3053 /// # Panics
3054 ///
3055 /// Panics if the range has `start_bound > end_bound`, or, if the range is
3056 /// bounded on either end and past the length of the vector.
3057 ///
3058 /// # Leaking
3059 ///
3060 /// If the returned iterator goes out of scope without being dropped (due to
3061 /// [`mem::forget`], for example), the vector may have lost and leaked
3062 /// elements arbitrarily, including elements outside the range.
3063 ///
3064 /// # Examples
3065 ///
3066 /// ```
3067 /// let mut v = vec![1, 2, 3];
3068 /// let u: Vec<_> = v.drain(1..).collect();
3069 /// assert_eq!(v, &[1]);
3070 /// assert_eq!(u, &[2, 3]);
3071 ///
3072 /// // A full range clears the vector, like `clear()` does
3073 /// v.drain(..);
3074 /// assert_eq!(v, &[]);
3075 /// ```
3076 #[stable(feature = "drain", since = "1.6.0")]
3077 pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
3078 where
3079 A: AllocatorNightly,
3080 R: RangeBounds<usize>,
3081 {
3082 // Memory safety
3083 //
3084 // When the Drain is first created, it shortens the length of
3085 // the source vector to make sure no uninitialized or moved-from elements
3086 // are accessible at all if the Drain's destructor never gets to run.
3087 //
3088 // Drain will ptr::read out the values to remove.
3089 // When finished, remaining tail of the vec is copied back to cover
3090 // the hole, and the vector length is restored to the new length.
3091 //
3092 let len = self.len();
3093 let Range { start, end } = slice::range(range, ..len);
3094
3095 // ignore-tidy-undocumented-unsafe
3096 unsafe {
3097 // set self.vec length's to start, to be safe in case Drain is leaked
3098 self.set_len(start);
3099 let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
3100 Drain {
3101 tail_start: end,
3102 tail_len: len - end,
3103 iter: range_slice.iter(),
3104 vec: NonNull::from(self),
3105 }
3106 }
3107 }
3108
3109 /// Clears the vector, removing all values.
3110 ///
3111 /// Note that this method has no effect on the allocated capacity
3112 /// of the vector.
3113 ///
3114 /// # Examples
3115 ///
3116 /// ```
3117 /// let mut v = vec![1, 2, 3];
3118 ///
3119 /// v.clear();
3120 ///
3121 /// assert!(v.is_empty());
3122 /// ```
3123 #[inline]
3124 #[stable(feature = "rust1", since = "1.0.0")]
3125 pub fn clear(&mut self) {
3126 // Though this is equivalent to `truncate(0)`, the manual version
3127 // optimizes better, justifying the additional complexity
3128 // (see #96002 and #154095 for context).
3129
3130 let elems: *mut [T] = self.as_mut_slice();
3131
3132 // SAFETY:
3133 // - `elems` comes directly from `as_mut_slice` and is therefore valid.
3134 // - Setting `self.len` before calling `drop_in_place` means that,
3135 // if an element's `Drop` impl panics, the vector's `Drop` impl will
3136 // do nothing (leaking the rest of the elements) instead of dropping
3137 // some twice.
3138 unsafe {
3139 self.len = 0;
3140 ptr::drop_in_place(elems);
3141 }
3142 }
3143
3144 /// Returns the number of elements in the vector, also referred to
3145 /// as its 'length'.
3146 ///
3147 /// # Examples
3148 ///
3149 /// ```
3150 /// let a = vec![1, 2, 3];
3151 /// assert_eq!(a.len(), 3);
3152 /// ```
3153 #[inline]
3154 #[stable(feature = "rust1", since = "1.0.0")]
3155 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
3156 #[rustc_confusables("length", "size")]
3157 pub const fn len(&self) -> usize {
3158 let len = self.len;
3159
3160 // SAFETY: The maximum capacity of `Vec<T>` is `isize::MAX` bytes, so the maximum value can
3161 // be returned is `usize::checked_div(size_of::<T>()).unwrap_or(usize::MAX)`, which
3162 // matches the definition of `T::MAX_SLICE_LEN`.
3163 unsafe { intrinsics::assume(len <= T::MAX_SLICE_LEN) };
3164
3165 len
3166 }
3167
3168 /// Returns `true` if the vector contains no elements.
3169 ///
3170 /// # Examples
3171 ///
3172 /// ```
3173 /// let mut v = Vec::new();
3174 /// assert!(v.is_empty());
3175 ///
3176 /// v.push(1);
3177 /// assert!(!v.is_empty());
3178 /// ```
3179 #[stable(feature = "rust1", since = "1.0.0")]
3180 #[rustc_diagnostic_item = "vec_is_empty"]
3181 #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
3182 pub const fn is_empty(&self) -> bool {
3183 self.len() == 0
3184 }
3185
3186 /// Splits the collection into two at the given index.
3187 ///
3188 /// Returns a newly allocated vector containing the elements in the range
3189 /// `[at, len)`. After the call, the original vector will be left containing
3190 /// the elements `[0, at)` with its previous capacity unchanged.
3191 ///
3192 /// - If you want to take ownership of the entire contents and capacity of
3193 /// the vector, see [`mem::take`] or [`mem::replace`].
3194 /// - If you don't need the returned vector at all, see [`Vec::truncate`].
3195 /// - If you want to take ownership of an arbitrary subslice, or you don't
3196 /// necessarily want to store the removed items in a vector, see [`Vec::drain`].
3197 ///
3198 /// # Panics
3199 ///
3200 /// Panics if `at > len`.
3201 ///
3202 /// # Examples
3203 ///
3204 /// ```
3205 /// let mut vec = vec!['a', 'b', 'c'];
3206 /// let vec2 = vec.split_off(1);
3207 /// assert_eq!(vec, ['a']);
3208 /// assert_eq!(vec2, ['b', 'c']);
3209 /// ```
3210 #[cfg(not(no_global_oom_handling))]
3211 #[inline]
3212 #[must_use = "use `.truncate()` if you don't need the other half"]
3213 #[stable(feature = "split_off", since = "1.4.0")]
3214 #[track_caller]
3215 pub fn split_off(&mut self, at: usize) -> Self
3216 where
3217 A: Clone,
3218 {
3219 #[cold]
3220 #[cfg_attr(not(panic = "immediate-abort"), inline(never))]
3221 #[track_caller]
3222 #[optimize(size)]
3223 fn assert_failed(at: usize, len: usize) -> ! {
3224 panic!("`at` split index (is {at}) should be <= len (is {len})");
3225 }
3226
3227 if at > self.len() {
3228 assert_failed(at, self.len());
3229 }
3230
3231 let other_len = self.len - at;
3232 let mut other = Vec::with_capacity_in(other_len, self.allocator().clone());
3233
3234 // Unsafely `set_len` and copy items to `other`.
3235 // ignore-tidy-undocumented-unsafe
3236 unsafe {
3237 self.set_len(at);
3238 other.set_len(other_len);
3239
3240 ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len());
3241 }
3242 other
3243 }
3244
3245 /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
3246 ///
3247 /// If `new_len` is greater than `len`, the `Vec` is extended by the
3248 /// difference, with each additional slot filled with the result of
3249 /// calling the closure `f`. The return values from `f` will end up
3250 /// in the `Vec` in the order they have been generated.
3251 ///
3252 /// If `new_len` is less than or equal to `len`, the `Vec` is simply
3253 /// truncated.
3254 ///
3255 /// This method uses a closure to create new values on every push. If
3256 /// you'd rather [`Clone`] a given value, use [`Vec::resize`]. If you
3257 /// want to use the [`Default`] trait to generate values, you can
3258 /// pass [`Default::default`] as the second argument.
3259 ///
3260 /// # Panics
3261 ///
3262 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
3263 ///
3264 /// # Examples
3265 ///
3266 /// ```
3267 /// let mut vec = vec![1, 2, 3];
3268 /// vec.resize_with(5, Default::default);
3269 /// assert_eq!(vec, [1, 2, 3, 0, 0]);
3270 ///
3271 /// let mut vec = vec![];
3272 /// let mut p = 1;
3273 /// vec.resize_with(4, || { p *= 2; p });
3274 /// assert_eq!(vec, [2, 4, 8, 16]);
3275 /// ```
3276 #[cfg(not(no_global_oom_handling))]
3277 #[stable(feature = "vec_resize_with", since = "1.33.0")]
3278 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
3279 where
3280 F: FnMut() -> T,
3281 {
3282 let len = self.len();
3283 if new_len > len {
3284 self.extend_trusted(iter::repeat_with(f).take(new_len - len));
3285 } else {
3286 self.truncate(new_len);
3287 }
3288 }
3289
3290 /// Consumes and leaks the `Vec`, returning a mutable reference to the contents,
3291 /// `&'a mut [T]`.
3292 ///
3293 /// Note that the type `T` must outlive the chosen lifetime `'a`. If the type
3294 /// has only static references, or none at all, then this may be chosen to be
3295 /// `'static`.
3296 ///
3297 /// As of Rust 1.57, this method does not reallocate or shrink the `Vec`,
3298 /// so the leaked allocation may include unused capacity that is not part
3299 /// of the returned slice.
3300 ///
3301 /// This function is mainly useful for data that lives for the remainder of
3302 /// the program's life. Dropping the returned reference will cause a memory
3303 /// leak.
3304 ///
3305 /// # Examples
3306 ///
3307 /// Simple usage:
3308 ///
3309 /// ```
3310 /// let x = vec![1, 2, 3];
3311 /// let static_ref: &'static mut [usize] = x.leak();
3312 /// static_ref[0] += 1;
3313 /// assert_eq!(static_ref, &[2, 2, 3]);
3314 /// # // FIXME(https://github.com/rust-lang/miri/issues/3670):
3315 /// # // use -Zmiri-disable-leak-check instead of unleaking in tests meant to leak.
3316 /// # drop(unsafe { Box::from_raw(static_ref) });
3317 /// ```
3318 #[stable(feature = "vec_leak", since = "1.47.0")]
3319 #[inline]
3320 pub fn leak<'a>(self) -> &'a mut [T]
3321 where
3322 A: 'a,
3323 {
3324 let mut me = ManuallyDrop::new(self);
3325 // ignore-tidy-undocumented-unsafe
3326 unsafe { slice::from_raw_parts_mut(me.as_mut_ptr(), me.len) }
3327 }
3328
3329 /// Returns the remaining spare capacity of the vector as a slice of
3330 /// `MaybeUninit<T>`.
3331 ///
3332 /// The returned slice can be used to fill the vector with data (e.g. by
3333 /// reading from a file) before marking the data as initialized using the
3334 /// [`set_len`] method.
3335 ///
3336 /// [`set_len`]: Vec::set_len
3337 ///
3338 /// # Examples
3339 ///
3340 /// ```
3341 /// // Allocate vector big enough for 10 elements.
3342 /// let mut v = Vec::with_capacity(10);
3343 ///
3344 /// // Fill in the first 3 elements.
3345 /// let uninit = v.spare_capacity_mut();
3346 /// uninit[0].write(0);
3347 /// uninit[1].write(1);
3348 /// uninit[2].write(2);
3349 ///
3350 /// // Mark the first 3 elements of the vector as being initialized.
3351 /// unsafe {
3352 /// v.set_len(3);
3353 /// }
3354 ///
3355 /// assert_eq!(&v, &[0, 1, 2]);
3356 /// ```
3357 #[stable(feature = "vec_spare_capacity", since = "1.60.0")]
3358 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
3359 #[inline]
3360 pub const fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
3361 // Note:
3362 // This method is not implemented in terms of `split_at_spare_mut`,
3363 // to prevent invalidation of pointers to the buffer.
3364 // ignore-tidy-undocumented-unsafe
3365 unsafe {
3366 slice::from_raw_parts_mut(
3367 self.as_mut_ptr().add(self.len) as *mut MaybeUninit<T>,
3368 self.buf.capacity() - self.len,
3369 )
3370 }
3371 }
3372
3373 /// Returns vector content as a slice of `T`, along with the remaining spare
3374 /// capacity of the vector as a slice of `MaybeUninit<T>`.
3375 ///
3376 /// The returned spare capacity slice can be used to fill the vector with data
3377 /// (e.g. by reading from a file) before marking the data as initialized using
3378 /// the [`set_len`] method.
3379 ///
3380 /// [`set_len`]: Vec::set_len
3381 ///
3382 /// Note that this is a low-level API, which should be used with care for
3383 /// optimization purposes. If you need to append data to a `Vec`
3384 /// you can use [`push`], [`extend`], [`extend_from_slice`],
3385 /// [`extend_from_within`], [`insert`], [`append`], [`resize`] or
3386 /// [`resize_with`], depending on your exact needs.
3387 ///
3388 /// [`push`]: Vec::push
3389 /// [`extend`]: Vec::extend
3390 /// [`extend_from_slice`]: Vec::extend_from_slice
3391 /// [`extend_from_within`]: Vec::extend_from_within
3392 /// [`insert`]: Vec::insert
3393 /// [`append`]: Vec::append
3394 /// [`resize`]: Vec::resize
3395 /// [`resize_with`]: Vec::resize_with
3396 ///
3397 /// # Examples
3398 ///
3399 /// ```
3400 /// #![feature(vec_split_at_spare)]
3401 ///
3402 /// let mut v = vec![1, 1, 2];
3403 ///
3404 /// // Reserve additional space big enough for 10 elements.
3405 /// v.reserve(10);
3406 ///
3407 /// let (init, uninit) = v.split_at_spare_mut();
3408 /// let sum = init.iter().copied().sum::<u32>();
3409 ///
3410 /// // Fill in the next 4 elements.
3411 /// uninit[0].write(sum);
3412 /// uninit[1].write(sum * 2);
3413 /// uninit[2].write(sum * 3);
3414 /// uninit[3].write(sum * 4);
3415 ///
3416 /// // Mark the 4 elements of the vector as being initialized.
3417 /// unsafe {
3418 /// let len = v.len();
3419 /// v.set_len(len + 4);
3420 /// }
3421 ///
3422 /// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
3423 /// ```
3424 #[unstable(feature = "vec_split_at_spare", issue = "81944")]
3425 #[rustc_const_unstable(feature = "const_heap", issue = "79597")]
3426 #[inline]
3427 pub const fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
3428 // SAFETY:
3429 // - len is ignored and so never changed
3430 let (init, spare, _) = unsafe { self.split_at_spare_mut_with_len() };
3431 (init, spare)
3432 }
3433
3434 /// Safety: changing returned .2 (&mut usize) is considered the same as calling `.set_len(_)`.
3435 ///
3436 /// This method provides unique access to all vec parts at once in `extend_from_within`.
3437 const unsafe fn split_at_spare_mut_with_len(
3438 &mut self,
3439 ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
3440 let ptr = self.as_mut_ptr();
3441 // SAFETY:
3442 // - `ptr` is guaranteed to be valid for `self.len` elements
3443 // - but the allocation extends out to `self.buf.capacity()` elements, possibly
3444 // uninitialized
3445 let spare_ptr = unsafe { ptr.add(self.len) };
3446 let spare_ptr = spare_ptr.cast_uninit();
3447 let spare_len = self.buf.capacity() - self.len;
3448
3449 // SAFETY:
3450 // - `ptr` is guaranteed to be valid for `self.len` elements
3451 // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized`
3452 unsafe {
3453 let initialized = slice::from_raw_parts_mut(ptr, self.len);
3454 let spare = slice::from_raw_parts_mut(spare_ptr, spare_len);
3455
3456 (initialized, spare, &mut self.len)
3457 }
3458 }
3459
3460 /// Groups every `N` elements in the `Vec<T>` into chunks to produce a `Vec<[T; N]>`, dropping
3461 /// elements in the remainder. `N` must be greater than zero.
3462 ///
3463 /// If the capacity is not a multiple of the chunk size, the buffer will shrink down to the
3464 /// nearest multiple with a reallocation or deallocation.
3465 ///
3466 /// This function can be used to reverse [`Vec::into_flattened`].
3467 ///
3468 /// # Examples
3469 ///
3470 /// ```
3471 /// #![feature(vec_into_chunks)]
3472 ///
3473 /// let vec = vec![0, 1, 2, 3, 4, 5, 6, 7];
3474 /// assert_eq!(vec.into_chunks::<3>(), [[0, 1, 2], [3, 4, 5]]);
3475 ///
3476 /// let vec = vec![0, 1, 2, 3];
3477 /// let chunks: Vec<[u8; 10]> = vec.into_chunks();
3478 /// assert!(chunks.is_empty());
3479 ///
3480 /// let flat = vec![0; 8 * 8 * 8];
3481 /// let reshaped: Vec<[[[u8; 8]; 8]; 8]> = flat.into_chunks().into_chunks().into_chunks();
3482 /// assert_eq!(reshaped.len(), 1);
3483 /// ```
3484 #[cfg(not(no_global_oom_handling))]
3485 #[unstable(feature = "vec_into_chunks", issue = "142137")]
3486 pub fn into_chunks<const N: usize>(mut self) -> Vec<[T; N], A> {
3487 const {
3488 assert!(N != 0, "chunk size must be greater than zero");
3489 }
3490
3491 let (len, cap) = (self.len(), self.capacity());
3492
3493 let len_remainder = len % N;
3494 if len_remainder != 0 {
3495 self.truncate(len - len_remainder);
3496 }
3497
3498 let cap_remainder = cap % N;
3499 if !T::IS_ZST && cap_remainder != 0 {
3500 self.buf.shrink_to_fit(cap - cap_remainder);
3501 }
3502
3503 let (ptr, _, _, alloc) = self.into_raw_parts_with_allocator();
3504
3505 // SAFETY:
3506 // - `ptr` and `alloc` were just returned from `self.into_raw_parts_with_allocator()`
3507 // - `[T; N]` has the same alignment as `T`
3508 // - `size_of::<[T; N]>() * cap / N == size_of::<T>() * cap`
3509 // - `len / N <= cap / N` because `len <= cap`
3510 // - the allocated memory consists of `len / N` valid values of type `[T; N]`
3511 // - `cap / N` fits the size of the allocated memory after shrinking
3512 unsafe { Vec::from_raw_parts_in(ptr.cast(), len / N, cap / N, alloc) }
3513 }
3514
3515 /// This clears out this `Vec` and recycles the allocation into a new `Vec`.
3516 /// The item type of the resulting `Vec` needs to have the same size and
3517 /// alignment as the item type of the original `Vec`.
3518 ///
3519 /// # Examples
3520 ///
3521 /// ```
3522 /// #![feature(vec_recycle, transmutability)]
3523 /// let a: Vec<u8> = vec![0; 100];
3524 /// let capacity = a.capacity();
3525 /// let addr = a.as_ptr().addr();
3526 /// let b: Vec<i8> = a.recycle();
3527 /// assert_eq!(b.len(), 0);
3528 /// assert_eq!(b.capacity(), capacity);
3529 /// assert_eq!(b.as_ptr().addr(), addr);
3530 /// ```
3531 ///
3532 /// The `Recyclable` bound prevents this method from being called when `T` and `U` have different sizes; e.g.:
3533 ///
3534 /// ```compile_fail,E0277
3535 /// #![feature(vec_recycle, transmutability)]
3536 /// let vec: Vec<[u8; 2]> = Vec::new();
3537 /// let _: Vec<[u8; 1]> = vec.recycle();
3538 /// ```
3539 /// ...or different alignments:
3540 ///
3541 /// ```compile_fail,E0277
3542 /// #![feature(vec_recycle, transmutability)]
3543 /// let vec: Vec<[u16; 0]> = Vec::new();
3544 /// let _: Vec<[u8; 0]> = vec.recycle();
3545 /// ```
3546 ///
3547 /// However, due to temporary implementation limitations of `Recyclable`,
3548 /// this method is not yet callable when `T` or `U` are slices, trait objects,
3549 /// or other exotic types; e.g.:
3550 ///
3551 /// ```compile_fail,E0277
3552 /// #![feature(vec_recycle, transmutability)]
3553 /// # let inputs = ["a b c", "d e f"];
3554 /// # fn process(_: &[&str]) {}
3555 /// let mut storage: Vec<&[&str]> = Vec::new();
3556 ///
3557 /// for input in inputs {
3558 /// let mut buffer: Vec<&str> = storage.recycle();
3559 /// buffer.extend(input.split(" "));
3560 /// process(&buffer);
3561 /// storage = buffer.recycle();
3562 /// }
3563 /// ```
3564 #[unstable(feature = "vec_recycle", issue = "148227")]
3565 #[expect(private_bounds)]
3566 pub fn recycle<U>(mut self) -> Vec<U, A>
3567 where
3568 U: Recyclable<T>,
3569 {
3570 self.clear();
3571 const {
3572 // FIXME(const-hack, 146097): compare `Layout`s
3573 assert!(size_of::<T>() == size_of::<U>());
3574 assert!(align_of::<T>() == align_of::<U>());
3575 };
3576 let (ptr, length, capacity, alloc) = self.into_parts_with_allocator();
3577 debug_assert_eq!(length, 0);
3578 // SAFETY:
3579 // - `ptr` and `alloc` were just returned from `self.into_raw_parts_with_allocator()`
3580 // - `T` & `U` have the same layout, so `capacity` does not need to be changed and we can safely use `alloc.dealloc` later
3581 // - the original vector was cleared, so there is no problem with "transmuting" the stored values
3582 unsafe { Vec::from_parts_in(ptr.cast::<U>(), length, capacity, alloc) }
3583 }
3584}
3585
3586/// Denotes that an allocation of `From` can be recycled into an allocation of `Self`.
3587///
3588/// # Safety
3589///
3590/// `Self` is `Recyclable<From>` if `Layout::new::<Self>() == Layout::new::<From>()`.
3591unsafe trait Recyclable<From: Sized>: Sized {}
3592
3593#[unstable_feature_bound(transmutability)]
3594// SAFETY: enforced by `TransmuteFrom`
3595unsafe impl<From, To> Recyclable<From> for To
3596where
3597 for<'a> &'a MaybeUninit<To>: TransmuteFrom<&'a MaybeUninit<From>, { Assume::SAFETY }>,
3598 for<'a> &'a MaybeUninit<From>: TransmuteFrom<&'a MaybeUninit<To>, { Assume::SAFETY }>,
3599{
3600}
3601
3602impl<T: Clone, A: Allocator> Vec<T, A> {
3603 /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
3604 ///
3605 /// If `new_len` is greater than `len`, the `Vec` is extended by the
3606 /// difference, with each additional slot filled with `value`.
3607 /// If `new_len` is less than or equal to `len`, the `Vec` is simply
3608 /// truncated.
3609 ///
3610 /// This method requires `T` to implement [`Clone`],
3611 /// in order to be able to clone the passed value.
3612 /// If you need more flexibility (or want to rely on [`Default`] instead of
3613 /// [`Clone`]), use [`Vec::resize_with`].
3614 /// If you only need to resize to a smaller size, use [`Vec::truncate`].
3615 ///
3616 /// # Panics
3617 ///
3618 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
3619 ///
3620 /// # Examples
3621 ///
3622 /// ```
3623 /// let mut vec = vec!["hello"];
3624 /// vec.resize(3, "world");
3625 /// assert_eq!(vec, ["hello", "world", "world"]);
3626 ///
3627 /// let mut vec = vec!['a', 'b', 'c', 'd'];
3628 /// vec.resize(2, '_');
3629 /// assert_eq!(vec, ['a', 'b']);
3630 /// ```
3631 #[cfg(not(no_global_oom_handling))]
3632 #[stable(feature = "vec_resize", since = "1.5.0")]
3633 pub fn resize(&mut self, new_len: usize, value: T) {
3634 let len = self.len();
3635
3636 if new_len > len {
3637 self.extend_with(new_len - len, value)
3638 } else {
3639 self.truncate(new_len);
3640 }
3641 }
3642
3643 /// Clones and appends all elements in a slice to the `Vec`.
3644 ///
3645 /// Iterates over the slice `other`, clones each element, and then appends
3646 /// it to this `Vec`. The `other` slice is traversed in-order.
3647 ///
3648 /// Note that this function is the same as [`extend`],
3649 /// except that it also works with slice elements that are Clone but not Copy.
3650 /// If Rust gets specialization this function may be deprecated.
3651 ///
3652 /// # Panics
3653 ///
3654 /// Panics if the new capacity exceeds `isize::MAX` _bytes_.
3655 ///
3656 /// # Examples
3657 ///
3658 /// ```
3659 /// let mut vec = vec![1];
3660 /// vec.extend_from_slice(&[2, 3, 4]);
3661 /// assert_eq!(vec, [1, 2, 3, 4]);
3662 /// ```
3663 ///
3664 /// [`extend`]: Vec::extend
3665 #[cfg(not(no_global_oom_handling))]
3666 #[stable(feature = "vec_extend_from_slice", since = "1.6.0")]
3667 pub fn extend_from_slice(&mut self, other: &[T]) {
3668 self.spec_extend(other.iter())
3669 }
3670
3671 /// Given a range `src`, clones a slice of elements in that range and appends it to the end.
3672 ///
3673 /// `src` must be a range that can form a valid subslice of the `Vec`.
3674 ///
3675 /// # Panics
3676 ///
3677 /// Panics if starting index is greater than the end index, if the index is
3678 /// greater than the length of the vector, or if the new capacity exceeds
3679 /// `isize::MAX` _bytes_.
3680 ///
3681 /// # Examples
3682 ///
3683 /// ```
3684 /// let mut characters = vec!['a', 'b', 'c', 'd', 'e'];
3685 /// characters.extend_from_within(2..);
3686 /// assert_eq!(characters, ['a', 'b', 'c', 'd', 'e', 'c', 'd', 'e']);
3687 ///
3688 /// let mut numbers = vec![0, 1, 2, 3, 4];
3689 /// numbers.extend_from_within(..2);
3690 /// assert_eq!(numbers, [0, 1, 2, 3, 4, 0, 1]);
3691 ///
3692 /// let mut strings = vec![String::from("hello"), String::from("world"), String::from("!")];
3693 /// strings.extend_from_within(1..=2);
3694 /// assert_eq!(strings, ["hello", "world", "!", "world", "!"]);
3695 /// ```
3696 #[cfg(not(no_global_oom_handling))]
3697 #[stable(feature = "vec_extend_from_within", since = "1.53.0")]
3698 pub fn extend_from_within<R>(&mut self, src: R)
3699 where
3700 R: RangeBounds<usize>,
3701 {
3702 let range = slice::range(src, ..self.len());
3703 self.reserve(range.len());
3704
3705 // SAFETY:
3706 // - `slice::range` guarantees that the given range is valid for indexing self
3707 unsafe {
3708 self.spec_extend_from_within(range);
3709 }
3710 }
3711}
3712
3713impl<A: Allocator> Vec<u8, A> {
3714 #[cfg_attr(
3715 not(no_global_oom_handling),
3716 expect(
3717 dead_code,
3718 reason = "currently only used in IO module when global OOM handling is disabled"
3719 )
3720 )]
3721 pub(crate) fn try_extend_from_slice_of_bytes(
3722 &mut self,
3723 other: &[u8],
3724 ) -> Result<(), TryReserveError> {
3725 // ignore-tidy-undocumented-unsafe
3726 unsafe { self.try_append_elements(other) }
3727 }
3728}
3729
3730impl<T, A: Allocator, const N: usize> Vec<[T; N], A> {
3731 /// Takes a `Vec<[T; N]>` and flattens it into a `Vec<T>`.
3732 ///
3733 /// # Panics
3734 ///
3735 /// Panics if the length of the resulting vector would overflow a `usize`.
3736 ///
3737 /// This is only possible when flattening a vector of arrays of zero-sized
3738 /// types, and thus tends to be irrelevant in practice. If
3739 /// `size_of::<T>() > 0`, this will never panic.
3740 ///
3741 /// # Examples
3742 ///
3743 /// ```
3744 /// let mut vec = vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]];
3745 /// assert_eq!(vec.pop(), Some([7, 8, 9]));
3746 ///
3747 /// let mut flattened = vec.into_flattened();
3748 /// assert_eq!(flattened.pop(), Some(6));
3749 /// ```
3750 #[stable(feature = "slice_flatten", since = "1.80.0")]
3751 pub fn into_flattened(self) -> Vec<T, A> {
3752 let (ptr, len, cap, alloc) = self.into_raw_parts_with_allocator();
3753 let (new_len, new_cap) = if T::IS_ZST {
3754 (
3755 len.checked_mul(N).expect("the product of vec len and N shouldn't overflow"),
3756 usize::MAX,
3757 )
3758 } else {
3759 // SAFETY:
3760 // - `cap * N` cannot overflow because the allocation is already in
3761 // the address space.
3762 // - Each `[T; N]` has `N` valid elements, so there are `len * N`
3763 // valid elements in the allocation.
3764 unsafe { (len.unchecked_mul(N), cap.unchecked_mul(N)) }
3765 };
3766 // SAFETY:
3767 // - `ptr` was allocated by `self`
3768 // - `ptr` is well-aligned because `[T; N]` has the same alignment as `T`.
3769 // - `new_cap` refers to the same sized allocation as `cap` because
3770 // `new_cap * size_of::<T>()` == `cap * size_of::<[T; N]>()`
3771 // - `len` <= `cap`, so `len * N` <= `cap * N`.
3772 unsafe { Vec::<T, A>::from_raw_parts_in(ptr.cast(), new_len, new_cap, alloc) }
3773 }
3774}
3775
3776impl<T: Clone, A: Allocator> Vec<T, A> {
3777 #[cfg(not(no_global_oom_handling))]
3778 /// Extend the vector by `n` clones of value.
3779 fn extend_with(&mut self, n: usize, value: T) {
3780 self.spec_extend_with(n, value);
3781 }
3782}
3783
3784impl<T: PartialEq, A: Allocator> Vec<T, A> {
3785 /// Removes consecutive repeated elements in the vector according to the
3786 /// [`PartialEq`] trait implementation.
3787 ///
3788 /// If the vector is sorted, this removes all duplicates.
3789 ///
3790 /// # Examples
3791 ///
3792 /// ```
3793 /// let mut vec = vec![1, 2, 2, 3, 2];
3794 ///
3795 /// vec.dedup();
3796 ///
3797 /// assert_eq!(vec, [1, 2, 3, 2]);
3798 /// ```
3799 #[stable(feature = "rust1", since = "1.0.0")]
3800 #[inline]
3801 pub fn dedup(&mut self) {
3802 // Vectorize the process of finding first duplicate if possible
3803 if let Some(chunk_size) = dedup_simd_chunk_size::<T>() {
3804 // Unlike dedup_by, we don't guarantee the order
3805 // and time in which we call `PartialEq::eq`.
3806 let Some(first_duplicate) = find_first_duplicate(self.as_slice(), chunk_size) else {
3807 return;
3808 };
3809
3810 // SAFETY: `1 <= first_duplicate < self.len()`
3811 unsafe {
3812 self.dedup_tail(|a, b| a == b, first_duplicate);
3813 }
3814 } else {
3815 self.dedup_by(|a, b| a == b);
3816 }
3817 }
3818}
3819
3820const fn dedup_simd_chunk_size<T>() -> Option<usize> {
3821 // The minimal SIMD width on supported platforms
3822 #[allow(unused)]
3823 const SIMD_WIDTH: usize = 16;
3824 let size = size_of::<T>();
3825
3826 // We only have SIMD implementations for these element sizes.
3827 if !matches!(size, 1 | 2 | 4 | 8) {
3828 return None;
3829 }
3830
3831 let simd_width: Option<usize> = cfg_select! {
3832 all(target_arch = "arm", target_feature = "neon") => {
3833 // Packed 64-bit integer lane equality is unavailable on arm neon
3834 if size == 8 { None } else { Some(SIMD_WIDTH) }
3835 }
3836
3837 all(target_arch = "aarch64", target_feature = "neon") => {
3838 Some(SIMD_WIDTH)
3839 }
3840
3841 all(
3842 any(target_arch = "x86", target_arch = "x86_64"),
3843 target_feature = "sse4.1"
3844 ) => Some(SIMD_WIDTH),
3845
3846 all(
3847 any(target_arch = "x86", target_arch = "x86_64"),
3848 target_feature = "sse2"
3849 ) => {
3850 // Packed 64-bit integer lane equality is only available on sse4.1
3851 if size == 8 { None } else { Some(SIMD_WIDTH) }
3852 }
3853
3854 all(
3855 any(target_arch = "riscv32", target_arch = "riscv64"),
3856 target_feature = "v"
3857 ) => Some(SIMD_WIDTH),
3858
3859 all(
3860 any(target_arch = "loongarch32", target_arch = "loongarch64"),
3861 target_feature = "lsx"
3862 ) => Some(SIMD_WIDTH),
3863
3864 _ => None,
3865 };
3866
3867 if let Some(simd_width) = simd_width { Some(simd_width * 2 / size) } else { None }
3868}
3869
3870fn find_first_duplicate<T: PartialEq>(v: &[T], chunk_size: usize) -> Option<usize> {
3871 let len = v.len();
3872 if len <= 1 {
3873 return None;
3874 }
3875
3876 let mut i = 1;
3877
3878 // The scalar fallback path if the length is not long enough
3879 if len < chunk_size + 1 {
3880 while i < len {
3881 // It keeps the same comparison order as `dedup_tail`
3882 //
3883 // SAFETY: i always in range [1..len)
3884 if unsafe { v.get_unchecked(i) == v.get_unchecked(i - 1) } {
3885 return Some(i);
3886 }
3887 i += 1;
3888 }
3889 return None;
3890 }
3891
3892 /// # Safety
3893 /// - `start > 0` and `start + chunk_size <= v.len()`
3894 /// - `0 < chunk_size <= 32`
3895 #[inline(always)]
3896 unsafe fn find_duplicate<T: PartialEq>(
3897 v: &[T],
3898 start: usize,
3899 chunk_size: usize,
3900 ) -> Option<usize> {
3901 let mut mask: u32 = 0;
3902 debug_assert!(
3903 u32::BITS as usize >= chunk_size,
3904 "the bit width of mask must be greater than or equal to chunk_size"
3905 );
3906 for j in 0..chunk_size {
3907 // SAFETY: start + j always in range [1..v.len())
3908 let eq = unsafe { v.get_unchecked(start + j) == v.get_unchecked(start + j - 1) };
3909 mask |= (eq as u32) << j;
3910 }
3911 if mask != 0 {
3912 return Some(start + mask.trailing_zeros() as usize);
3913 }
3914 None
3915 }
3916
3917 // This loop performs chunk_size comparisons in parallel without early exit,
3918 // which is what allows for SIMD optimization.
3919 while i + chunk_size <= len {
3920 // SAFETY: `i >= 1` and `i + chunk_size <= len`
3921 if let Some(duplicate) = unsafe { find_duplicate(v, i, chunk_size) } {
3922 return Some(duplicate);
3923 }
3924 i += chunk_size;
3925 }
3926
3927 // This may check the same elements multiple times.
3928 // However we don't guarantee `PartialEq::eq` is only called once per pair.
3929 if i < len {
3930 let start = len - chunk_size;
3931 // SAFETY: `len - chunk_size >= 1` and `start + chunk_size <= len`
3932 if let Some(duplicate) = unsafe { find_duplicate(v, start, chunk_size) } {
3933 return Some(duplicate);
3934 }
3935 }
3936
3937 None
3938}
3939
3940////////////////////////////////////////////////////////////////////////////////
3941// Internal methods and functions
3942////////////////////////////////////////////////////////////////////////////////
3943
3944// This function is no longer used internally (`from_elem_global` is used instead).
3945// It is only kept so as not to break a few crates who mistakenly used it at a
3946// time when we didn't have the ability to gate internal methods used by public macros.
3947#[doc(hidden)]
3948#[cfg(not(no_global_oom_handling))]
3949#[stable(feature = "rust1", since = "1.0.0")]
3950// NOTE: the real deprecation version is the same as the stabilization version.
3951// I.e. it should never have been used even in version 1.0.
3952#[deprecated(since = "CURRENT_RUSTC_VERSION", note = "use the `vec!` macro instead")]
3953pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
3954 vec![elem; n]
3955}
3956
3957#[doc(hidden)]
3958#[cfg(not(no_global_oom_handling))]
3959#[unstable(feature = "liballoc_internals", issue = "none")]
3960#[rustc_diagnostic_item = "vec_from_elem"]
3961pub fn from_elem_global<T: Clone>(elem: T, n: usize) -> Vec<T> {
3962 <T as SpecFromElem>::from_elem(elem, n, Global)
3963}
3964
3965#[doc(hidden)]
3966#[cfg(not(no_global_oom_handling))]
3967#[unstable(feature = "allocator_ext", issue = "163177", implied_by = "allocator_api")]
3968pub fn from_elem_in<T: Clone, A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
3969 <T as SpecFromElem>::from_elem(elem, n, alloc)
3970}
3971
3972#[cfg(not(no_global_oom_handling))]
3973trait ExtendFromWithinSpec {
3974 /// # Safety
3975 ///
3976 /// - `src` needs to be valid index
3977 /// - `self.capacity() - self.len()` must be `>= src.len()`
3978 unsafe fn spec_extend_from_within(&mut self, src: Range<usize>);
3979}
3980
3981#[cfg(not(no_global_oom_handling))]
3982impl<T: Clone, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
3983 default unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
3984 // SAFETY:
3985 // - len is increased only after initializing elements
3986 let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() };
3987
3988 // SAFETY:
3989 // - caller guarantees that src is a valid index
3990 let to_clone = unsafe { this.get_unchecked(src) };
3991
3992 iter::zip(to_clone, spare)
3993 .map(|(src, dst)| dst.write(src.clone()))
3994 // Note:
3995 // - Element was just initialized with `MaybeUninit::write`, so it's ok to increase len
3996 // - len is increased after each element to prevent leaks (see issue #82533)
3997 .for_each(|_| *len += 1);
3998 }
3999}
4000
4001#[cfg(not(no_global_oom_handling))]
4002impl<T: TrivialClone, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
4003 unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
4004 let count = src.len();
4005 {
4006 let (init, spare) = self.split_at_spare_mut();
4007
4008 // SAFETY:
4009 // - caller guarantees that `src` is a valid index
4010 let source = unsafe { init.get_unchecked(src) };
4011
4012 // SAFETY:
4013 // - Both pointers are created from unique slice references (`&mut [_]`)
4014 // so they are valid and do not overlap.
4015 // - Elements implement `TrivialClone` so this is equivalent to calling
4016 // `clone` on every one of them.
4017 // - `count` is equal to the len of `source`, so source is valid for
4018 // `count` reads
4019 // - `.reserve(count)` guarantees that `spare.len() >= count` so spare
4020 // is valid for `count` writes
4021 unsafe { ptr::copy_nonoverlapping(source.as_ptr(), spare.as_mut_ptr() as _, count) };
4022 }
4023
4024 // SAFETY:
4025 // - The elements were just initialized by `copy_nonoverlapping`
4026 self.len += count;
4027 }
4028}
4029
4030////////////////////////////////////////////////////////////////////////////////
4031// Common trait implementations for Vec
4032////////////////////////////////////////////////////////////////////////////////
4033
4034#[stable(feature = "rust1", since = "1.0.0")]
4035#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
4036const impl<T, A: Allocator> ops::Deref for Vec<T, A> {
4037 type Target = [T];
4038
4039 #[inline]
4040 fn deref(&self) -> &[T] {
4041 self.as_slice()
4042 }
4043}
4044
4045#[stable(feature = "rust1", since = "1.0.0")]
4046#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
4047const impl<T, A: Allocator> ops::DerefMut for Vec<T, A> {
4048 #[inline]
4049 fn deref_mut(&mut self) -> &mut [T] {
4050 self.as_mut_slice()
4051 }
4052}
4053
4054#[unstable(feature = "deref_pure_trait", issue = "87121")]
4055unsafe impl<T, A: Allocator> ops::DerefPure for Vec<T, A> {}
4056
4057#[cfg(not(no_global_oom_handling))]
4058#[stable(feature = "rust1", since = "1.0.0")]
4059impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
4060 /// Creates a new `Vec` by deep-copying the contents of an existing `Vec`.
4061 ///
4062 /// This method will allocate a new `Vec` and `clone` all of `self`'s contents
4063 /// into it. The capacity of the duplicate `Vec` is not forced to match the
4064 /// capacity of the original.
4065 fn clone(&self) -> Self {
4066 let alloc = self.allocator().clone();
4067 <[T]>::to_vec_in(self, alloc)
4068 }
4069
4070 /// Overwrites the contents of `self` with a clone of the contents of `source`.
4071 ///
4072 /// This method is preferred over simply assigning `source.clone()` to `self`,
4073 /// as it avoids reallocation if possible. Additionally, if the element type
4074 /// `T` overrides `clone_from()`, this will reuse the resources of `self`'s
4075 /// elements as well.
4076 ///
4077 /// # Examples
4078 ///
4079 /// ```
4080 /// let x = vec![5, 6, 7];
4081 /// let mut y = vec![8, 9, 10];
4082 /// let yp: *const i32 = y.as_ptr();
4083 ///
4084 /// y.clone_from(&x);
4085 ///
4086 /// // The value is the same
4087 /// assert_eq!(x, y);
4088 ///
4089 /// // And no reallocation occurred
4090 /// assert_eq!(yp, y.as_ptr());
4091 /// ```
4092 fn clone_from(&mut self, source: &Self) {
4093 crate::slice::SpecCloneIntoVec::clone_into(source.as_slice(), self);
4094 }
4095}
4096
4097/// The hash of a vector is the same as that of the corresponding slice,
4098/// as required by the `core::borrow::Borrow` implementation.
4099///
4100/// ```
4101/// use std::hash::BuildHasher;
4102///
4103/// let b = std::hash::RandomState::new();
4104/// let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
4105/// let s: &[u8] = &[0xa8, 0x3c, 0x09];
4106/// assert_eq!(b.hash_one(v), b.hash_one(s));
4107/// ```
4108#[stable(feature = "rust1", since = "1.0.0")]
4109impl<T: Hash, A: Allocator> Hash for Vec<T, A> {
4110 #[inline]
4111 fn hash<H: Hasher>(&self, state: &mut H) {
4112 Hash::hash(&**self, state)
4113 }
4114}
4115
4116#[stable(feature = "rust1", since = "1.0.0")]
4117#[rustc_const_unstable(feature = "const_index", issue = "143775")]
4118const impl<T, I: [const] SliceIndex<[T]>, A: Allocator> Index<I> for Vec<T, A> {
4119 type Output = I::Output;
4120
4121 #[inline]
4122 fn index(&self, index: I) -> &Self::Output {
4123 Index::index(&**self, index)
4124 }
4125}
4126
4127#[stable(feature = "rust1", since = "1.0.0")]
4128#[rustc_const_unstable(feature = "const_index", issue = "143775")]
4129const impl<T, I: [const] SliceIndex<[T]>, A: Allocator> IndexMut<I> for Vec<T, A> {
4130 #[inline]
4131 fn index_mut(&mut self, index: I) -> &mut Self::Output {
4132 IndexMut::index_mut(&mut **self, index)
4133 }
4134}
4135
4136/// Collects an iterator into a Vec, commonly called via [`Iterator::collect()`]
4137///
4138/// # Allocation behavior
4139///
4140/// In general `Vec` does not guarantee any particular growth or allocation strategy.
4141/// That also applies to this trait impl.
4142///
4143/// **Note:** This section covers implementation details and is therefore exempt from
4144/// stability guarantees.
4145///
4146/// Vec may use any or none of the following strategies,
4147/// depending on the supplied iterator:
4148///
4149/// * preallocate based on [`Iterator::size_hint()`]
4150/// * and panic if the number of items is outside the provided lower/upper bounds
4151/// * use an amortized growth strategy similar to `pushing` one item at a time
4152/// * perform the iteration in-place on the original allocation backing the iterator
4153///
4154/// The last case warrants some attention. It is an optimization that in many cases reduces peak memory
4155/// consumption and improves cache locality. But when big, short-lived allocations are created,
4156/// only a small fraction of their items get collected, no further use is made of the spare capacity
4157/// and the resulting `Vec` is moved into a longer-lived structure, then this can lead to the large
4158/// allocations having their lifetimes unnecessarily extended which can result in increased memory
4159/// footprint.
4160///
4161/// In cases where this is an issue, the excess capacity can be discarded with [`Vec::shrink_to()`],
4162/// [`Vec::shrink_to_fit()`] or by collecting into [`Box<[T]>`][owned slice] instead, which additionally reduces
4163/// the size of the long-lived struct.
4164///
4165/// [owned slice]: Box
4166///
4167/// ```rust
4168/// # use std::sync::Mutex;
4169/// static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());
4170///
4171/// for i in 0..10 {
4172/// let big_temporary: Vec<u16> = (0..1024).collect();
4173/// // discard most items
4174/// let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();
4175/// // without this a lot of unused capacity might be moved into the global
4176/// result.shrink_to_fit();
4177/// LONG_LIVED.lock().unwrap().push(result);
4178/// }
4179/// ```
4180#[cfg(not(no_global_oom_handling))]
4181#[stable(feature = "rust1", since = "1.0.0")]
4182impl<T> FromIterator<T> for Vec<T> {
4183 #[inline]
4184 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Vec<T> {
4185 <Self as SpecFromIter<T, I::IntoIter>>::from_iter(iter.into_iter())
4186 }
4187}
4188
4189#[stable(feature = "rust1", since = "1.0.0")]
4190impl<T, A: Allocator> IntoIterator for Vec<T, A> {
4191 type Item = T;
4192 type IntoIter = IntoIter<T, A>;
4193
4194 /// Creates a consuming iterator, that is, one that moves each value out of
4195 /// the vector (from start to end). The vector cannot be used after calling
4196 /// this.
4197 ///
4198 /// # Examples
4199 ///
4200 /// ```
4201 /// let v = vec!["a".to_string(), "b".to_string()];
4202 /// let mut v_iter = v.into_iter();
4203 ///
4204 /// let first_element: Option<String> = v_iter.next();
4205 ///
4206 /// assert_eq!(first_element, Some("a".to_string()));
4207 /// assert_eq!(v_iter.next(), Some("b".to_string()));
4208 /// assert_eq!(v_iter.next(), None);
4209 /// ```
4210 #[inline]
4211 fn into_iter(self) -> Self::IntoIter {
4212 let me = ManuallyDrop::new(self);
4213 // ignore-tidy-undocumented-unsafe
4214 unsafe {
4215 let alloc = ManuallyDrop::new(ptr::read(me.allocator()));
4216 let buf = me.buf.non_null();
4217 let begin = buf.as_ptr();
4218 let end = if T::IS_ZST {
4219 begin.wrapping_byte_add(me.len())
4220 } else {
4221 begin.add(me.len()) as *const T
4222 };
4223 let cap = me.buf.capacity();
4224 IntoIter { buf, phantom: PhantomData, cap, alloc, ptr: buf, end }
4225 }
4226 }
4227}
4228
4229#[stable(feature = "rust1", since = "1.0.0")]
4230impl<'a, T, A: Allocator> IntoIterator for &'a Vec<T, A> {
4231 type Item = &'a T;
4232 type IntoIter = slice::Iter<'a, T>;
4233
4234 fn into_iter(self) -> Self::IntoIter {
4235 self.iter()
4236 }
4237}
4238
4239#[stable(feature = "rust1", since = "1.0.0")]
4240impl<'a, T, A: Allocator> IntoIterator for &'a mut Vec<T, A> {
4241 type Item = &'a mut T;
4242 type IntoIter = slice::IterMut<'a, T>;
4243
4244 fn into_iter(self) -> Self::IntoIter {
4245 self.iter_mut()
4246 }
4247}
4248
4249#[cfg(not(no_global_oom_handling))]
4250#[stable(feature = "rust1", since = "1.0.0")]
4251impl<T, A: Allocator> Extend<T> for Vec<T, A> {
4252 #[inline]
4253 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
4254 <Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter())
4255 }
4256
4257 #[inline]
4258 fn extend_one(&mut self, item: T) {
4259 self.push(item);
4260 }
4261
4262 #[inline]
4263 fn extend_reserve(&mut self, additional: usize) {
4264 self.reserve(additional);
4265 }
4266
4267 #[inline]
4268 unsafe fn extend_one_unchecked(&mut self, item: T) {
4269 // SAFETY: Our preconditions ensure the space has been reserved, and `extend_reserve` is implemented correctly.
4270 unsafe {
4271 let len = self.len();
4272 ptr::write(self.as_mut_ptr().add(len), item);
4273 self.set_len(len + 1);
4274 }
4275 }
4276}
4277
4278impl<T, A: Allocator> Vec<T, A> {
4279 // leaf method to which various SpecFrom/SpecExtend implementations delegate when
4280 // they have no further optimizations to apply
4281 #[cfg(not(no_global_oom_handling))]
4282 fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
4283 // This is the case for a general iterator.
4284 //
4285 // This function should be the moral equivalent of:
4286 //
4287 // for item in iterator {
4288 // self.push(item);
4289 // }
4290 while let Some(element) = iterator.next() {
4291 let len = self.len();
4292 if len == self.capacity() {
4293 let (lower, _) = iterator.size_hint();
4294 self.reserve(lower.saturating_add(1));
4295 }
4296 // ignore-tidy-undocumented-unsafe
4297 unsafe {
4298 ptr::write(self.as_mut_ptr().add(len), element);
4299 // Since next() executes user code which can panic we have to bump the length
4300 // after each step.
4301 // NB can't overflow since we would have had to alloc the address space
4302 self.set_len(len + 1);
4303 }
4304 }
4305 }
4306
4307 // specific extend for `TrustedLen` iterators, called both by the specializations
4308 // and internal places where resolving specialization makes compilation slower
4309 #[cfg(not(no_global_oom_handling))]
4310 fn extend_trusted(&mut self, iterator: impl iter::TrustedLen<Item = T>) {
4311 let (low, high) = iterator.size_hint();
4312 if let Some(additional) = high {
4313 debug_assert_eq!(
4314 low,
4315 additional,
4316 "TrustedLen iterator's size hint is not exact: {:?}",
4317 (low, high)
4318 );
4319 self.reserve(additional);
4320 let ptr = self.as_mut_ptr();
4321 let mut local_len = SetLenOnDrop::new(&mut self.len);
4322 // ignore-tidy-undocumented-unsafe
4323 unsafe {
4324 iterator.for_each(move |element| {
4325 ptr::write(ptr.add(local_len.current_len()), element);
4326 // Since the loop executes user code which can panic we have to update
4327 // the length every step to correctly drop what we've written.
4328 // NB can't overflow since we would have had to alloc the address space
4329 local_len.increment_len(1);
4330 });
4331 }
4332 } else {
4333 // Per TrustedLen contract a `None` upper bound means that the iterator length
4334 // truly exceeds usize::MAX, which would eventually lead to a capacity overflow anyway.
4335 // Since the other branch already panics eagerly (via `reserve()`) we do the same here.
4336 // This avoids additional codegen for a fallback code path which would eventually
4337 // panic anyway.
4338 panic!("capacity overflow");
4339 }
4340 }
4341
4342 /// Creates a splicing iterator that replaces the specified range in the vector
4343 /// with the given `replace_with` iterator and yields the removed items.
4344 /// `replace_with` does not need to be the same length as `range`.
4345 ///
4346 /// `range` is removed even if the `Splice` iterator is not consumed before it is dropped.
4347 ///
4348 /// It is unspecified how many elements are removed from the vector
4349 /// if the `Splice` value is leaked.
4350 ///
4351 /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped.
4352 ///
4353 /// This is optimal if:
4354 ///
4355 /// * The tail (elements in the vector after `range`) is empty,
4356 /// * or `replace_with` yields fewer or equal elements than `range`'s length
4357 /// * or the lower bound of its `size_hint()` is exact.
4358 ///
4359 /// Otherwise, a temporary vector is allocated and the tail is moved twice.
4360 ///
4361 /// # Panics
4362 ///
4363 /// Panics if the range has `start_bound > end_bound`, or, if the range is
4364 /// bounded on either end and past the length of the vector.
4365 ///
4366 /// # Examples
4367 ///
4368 /// ```
4369 /// let mut v = vec![1, 2, 3, 4];
4370 /// let new = [7, 8, 9];
4371 /// let u: Vec<_> = v.splice(1..3, new).collect();
4372 /// assert_eq!(v, [1, 7, 8, 9, 4]);
4373 /// assert_eq!(u, [2, 3]);
4374 /// ```
4375 ///
4376 /// Using `splice` to insert new items into a vector efficiently at a specific position
4377 /// indicated by an empty range:
4378 ///
4379 /// ```
4380 /// let mut v = vec![1, 5];
4381 /// let new = [2, 3, 4];
4382 /// v.splice(1..1, new);
4383 /// assert_eq!(v, [1, 2, 3, 4, 5]);
4384 /// ```
4385 #[cfg(not(no_global_oom_handling))]
4386 #[inline]
4387 #[stable(feature = "vec_splice", since = "1.21.0")]
4388 pub fn splice<R, I>(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter, A>
4389 where
4390 A: AllocatorNightly,
4391 R: RangeBounds<usize>,
4392 I: IntoIterator<Item = T>,
4393 {
4394 Splice { drain: self.drain(range), replace_with: replace_with.into_iter() }
4395 }
4396
4397 /// Creates an iterator which uses a closure to determine if an element in the range should be removed.
4398 ///
4399 /// If the closure returns `true`, the element is removed from the vector
4400 /// and yielded. If the closure returns `false`, or panics, the element
4401 /// remains in the vector and will not be yielded.
4402 ///
4403 /// Only elements that fall in the provided range are considered for extraction, but any elements
4404 /// after the range will still have to be moved if any element has been extracted.
4405 ///
4406 /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating
4407 /// or the iteration short-circuits, then the remaining elements will be retained.
4408 /// Use `extract_if().for_each(drop)` if you do not need the returned iterator,
4409 /// or [`retain_mut`] with a negated predicate if you also do not need to restrict the range.
4410 ///
4411 /// [`retain_mut`]: Vec::retain_mut
4412 ///
4413 /// Using this method is equivalent to the following code:
4414 ///
4415 /// ```
4416 /// # let some_predicate = |x: &mut i32| { *x % 2 == 1 };
4417 /// # let mut vec = vec![0, 1, 2, 3, 4, 5, 6];
4418 /// # let mut vec2 = vec.clone();
4419 /// # let range = 1..5;
4420 /// let mut i = range.start;
4421 /// let end_items = vec.len() - range.end;
4422 /// # let mut extracted = vec![];
4423 ///
4424 /// while i < vec.len() - end_items {
4425 /// if some_predicate(&mut vec[i]) {
4426 /// let val = vec.remove(i);
4427 /// // your code here
4428 /// # extracted.push(val);
4429 /// } else {
4430 /// i += 1;
4431 /// }
4432 /// }
4433 ///
4434 /// # let extracted2: Vec<_> = vec2.extract_if(range, some_predicate).collect();
4435 /// # assert_eq!(vec, vec2);
4436 /// # assert_eq!(extracted, extracted2);
4437 /// ```
4438 ///
4439 /// But `extract_if` is easier to use. `extract_if` is also more efficient,
4440 /// because it can backshift the elements of the array in bulk.
4441 ///
4442 /// The iterator also lets you mutate the value of each element in the
4443 /// closure, regardless of whether you choose to keep or remove it.
4444 ///
4445 /// # Panics
4446 ///
4447 /// If `range` is out of bounds.
4448 ///
4449 /// # Examples
4450 ///
4451 /// Splitting a vector into even and odd values, reusing the original vector:
4452 ///
4453 /// ```
4454 /// let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
4455 ///
4456 /// let evens = numbers.extract_if(.., |x| *x % 2 == 0).collect::<Vec<_>>();
4457 /// let odds = numbers;
4458 ///
4459 /// assert_eq!(evens, vec![2, 4, 6, 8, 14]);
4460 /// assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
4461 /// ```
4462 ///
4463 /// Using the range argument to only process a part of the vector:
4464 ///
4465 /// ```
4466 /// let mut items = vec![0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2];
4467 /// let ones = items.extract_if(7.., |x| *x == 1).collect::<Vec<_>>();
4468 /// assert_eq!(items, vec![0, 0, 0, 0, 0, 0, 0, 2, 2, 2]);
4469 /// assert_eq!(ones.len(), 3);
4470 /// ```
4471 #[stable(feature = "extract_if", since = "1.87.0")]
4472 pub fn extract_if<F, R>(&mut self, range: R, filter: F) -> ExtractIf<'_, T, F, A>
4473 where
4474 A: AllocatorNightly,
4475 F: FnMut(&mut T) -> bool,
4476 R: RangeBounds<usize>,
4477 {
4478 ExtractIf::new(self, filter, range)
4479 }
4480}
4481
4482/// Extend implementation that copies elements out of references before pushing them onto the Vec.
4483///
4484/// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to
4485/// append the entire slice at once.
4486///
4487/// [`copy_from_slice`]: slice::copy_from_slice
4488#[cfg(not(no_global_oom_handling))]
4489#[stable(feature = "extend_ref", since = "1.2.0")]
4490impl<'a, T: Copy + 'a, A: Allocator> Extend<&'a T> for Vec<T, A> {
4491 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
4492 self.spec_extend(iter.into_iter())
4493 }
4494
4495 #[inline]
4496 fn extend_one(&mut self, &item: &'a T) {
4497 self.push(item);
4498 }
4499
4500 #[inline]
4501 fn extend_reserve(&mut self, additional: usize) {
4502 self.reserve(additional);
4503 }
4504
4505 #[inline]
4506 unsafe fn extend_one_unchecked(&mut self, &item: &'a T) {
4507 // SAFETY: Our preconditions ensure the space has been reserved, and `extend_reserve` is implemented correctly.
4508 unsafe {
4509 let len = self.len();
4510 ptr::write(self.as_mut_ptr().add(len), item);
4511 self.set_len(len + 1);
4512 }
4513 }
4514}
4515
4516/// Implements comparison of vectors, [lexicographically](Ord#lexicographical-comparison).
4517#[stable(feature = "rust1", since = "1.0.0")]
4518impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
4519where
4520 T: PartialOrd,
4521 A1: Allocator,
4522 A2: Allocator,
4523{
4524 #[inline]
4525 fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering> {
4526 PartialOrd::partial_cmp(&**self, &**other)
4527 }
4528}
4529
4530#[stable(feature = "rust1", since = "1.0.0")]
4531impl<T: Eq, A: Allocator> Eq for Vec<T, A> {}
4532
4533/// Implements ordering of vectors, [lexicographically](Ord#lexicographical-comparison).
4534#[stable(feature = "rust1", since = "1.0.0")]
4535impl<T: Ord, A: Allocator> Ord for Vec<T, A> {
4536 #[inline]
4537 fn cmp(&self, other: &Self) -> Ordering {
4538 Ord::cmp(&**self, &**other)
4539 }
4540}
4541
4542#[stable(feature = "rust1", since = "1.0.0")]
4543#[rustc_const_unstable(feature = "const_heap", issue = "79597")]
4544const unsafe impl<#[may_dangle] T: [const] Destruct, A: [const] Allocator + [const] Destruct> Drop
4545 for Vec<T, A>
4546{
4547 fn drop(&mut self) {
4548 // ignore-tidy-undocumented-unsafe
4549 unsafe {
4550 // use drop for [T]
4551 // use a raw slice to refer to the elements of the vector as weakest necessary type;
4552 // could avoid questions of validity in certain cases
4553 self.as_mut_ptr().cast_slice(self.len).drop_in_place()
4554 }
4555 // RawVec handles deallocation
4556 }
4557}
4558
4559#[stable(feature = "rust1", since = "1.0.0")]
4560#[rustc_const_unstable(feature = "const_default", issue = "143894")]
4561const impl<T> Default for Vec<T> {
4562 /// Creates an empty `Vec<T>`.
4563 ///
4564 /// The vector will not allocate until elements are pushed onto it.
4565 fn default() -> Vec<T> {
4566 Vec::new()
4567 }
4568}
4569
4570#[stable(feature = "rust1", since = "1.0.0")]
4571impl<T: fmt::Debug, A: Allocator> fmt::Debug for Vec<T, A> {
4572 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4573 fmt::Debug::fmt(&**self, f)
4574 }
4575}
4576
4577#[stable(feature = "rust1", since = "1.0.0")]
4578impl<T, A: Allocator> AsRef<Vec<T, A>> for Vec<T, A> {
4579 fn as_ref(&self) -> &Vec<T, A> {
4580 self
4581 }
4582}
4583
4584#[stable(feature = "vec_as_mut", since = "1.5.0")]
4585impl<T, A: Allocator> AsMut<Vec<T, A>> for Vec<T, A> {
4586 fn as_mut(&mut self) -> &mut Vec<T, A> {
4587 self
4588 }
4589}
4590
4591#[stable(feature = "rust1", since = "1.0.0")]
4592impl<T, A: Allocator> AsRef<[T]> for Vec<T, A> {
4593 fn as_ref(&self) -> &[T] {
4594 self
4595 }
4596}
4597
4598#[stable(feature = "vec_as_mut", since = "1.5.0")]
4599impl<T, A: Allocator> AsMut<[T]> for Vec<T, A> {
4600 fn as_mut(&mut self) -> &mut [T] {
4601 self
4602 }
4603}
4604
4605#[cfg(not(no_global_oom_handling))]
4606#[stable(feature = "rust1", since = "1.0.0")]
4607impl<T: Clone> From<&[T]> for Vec<T> {
4608 /// Allocates a `Vec<T>` and fills it by cloning `s`'s items.
4609 ///
4610 /// # Examples
4611 ///
4612 /// ```
4613 /// assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
4614 /// ```
4615 fn from(s: &[T]) -> Vec<T> {
4616 s.to_vec()
4617 }
4618}
4619
4620#[cfg(not(no_global_oom_handling))]
4621#[stable(feature = "vec_from_mut", since = "1.19.0")]
4622impl<T: Clone> From<&mut [T]> for Vec<T> {
4623 /// Allocates a `Vec<T>` and fills it by cloning `s`'s items.
4624 ///
4625 /// # Examples
4626 ///
4627 /// ```
4628 /// assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
4629 /// ```
4630 fn from(s: &mut [T]) -> Vec<T> {
4631 s.to_vec()
4632 }
4633}
4634
4635#[cfg(not(no_global_oom_handling))]
4636#[stable(feature = "vec_from_array_ref", since = "1.74.0")]
4637impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T> {
4638 /// Allocates a `Vec<T>` and fills it by cloning `s`'s items.
4639 ///
4640 /// # Examples
4641 ///
4642 /// ```
4643 /// assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
4644 /// ```
4645 fn from(s: &[T; N]) -> Vec<T> {
4646 Self::from(s.as_slice())
4647 }
4648}
4649
4650#[cfg(not(no_global_oom_handling))]
4651#[stable(feature = "vec_from_array_ref", since = "1.74.0")]
4652impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T> {
4653 /// Allocates a `Vec<T>` and fills it by cloning `s`'s items.
4654 ///
4655 /// # Examples
4656 ///
4657 /// ```
4658 /// assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
4659 /// ```
4660 fn from(s: &mut [T; N]) -> Vec<T> {
4661 Self::from(s.as_mut_slice())
4662 }
4663}
4664
4665#[cfg(not(no_global_oom_handling))]
4666#[stable(feature = "vec_from_array", since = "1.44.0")]
4667impl<T, const N: usize> From<[T; N]> for Vec<T> {
4668 /// Allocates a `Vec<T>` and moves `s`'s items into it.
4669 ///
4670 /// # Examples
4671 ///
4672 /// ```
4673 /// assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
4674 /// ```
4675 fn from(s: [T; N]) -> Vec<T> {
4676 <[T]>::into_vec(Box::new(s))
4677 }
4678}
4679
4680#[stable(feature = "vec_from_cow_slice", since = "1.14.0")]
4681impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
4682where
4683 [T]: ToOwned<Owned = Vec<T>>,
4684{
4685 /// Converts a clone-on-write slice into a vector.
4686 ///
4687 /// If `s` already owns a `Vec<T>`, it will be returned directly.
4688 /// If `s` is borrowing a slice, a new `Vec<T>` will be allocated and
4689 /// filled by cloning `s`'s items into it.
4690 ///
4691 /// # Examples
4692 ///
4693 /// ```
4694 /// # use std::borrow::Cow;
4695 /// let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);
4696 /// let b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);
4697 /// assert_eq!(Vec::from(o), Vec::from(b));
4698 /// ```
4699 fn from(s: Cow<'a, [T]>) -> Vec<T> {
4700 s.into_owned()
4701 }
4702}
4703
4704// note: test pulls in std, which causes errors here
4705#[stable(feature = "vec_from_box", since = "1.18.0")]
4706impl<T, A: Allocator> From<Box<[T], A>> for Vec<T, A> {
4707 /// Converts a boxed slice into a vector by transferring ownership of
4708 /// the existing heap allocation.
4709 ///
4710 /// # Examples
4711 ///
4712 /// ```
4713 /// let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
4714 /// assert_eq!(Vec::from(b), vec![1, 2, 3]);
4715 /// ```
4716 fn from(s: Box<[T], A>) -> Self {
4717 s.into_vec()
4718 }
4719}
4720
4721// note: test pulls in std, which causes errors here
4722#[cfg(not(no_global_oom_handling))]
4723#[stable(feature = "box_from_vec", since = "1.20.0")]
4724impl<T, A: Allocator> From<Vec<T, A>> for Box<[T], A> {
4725 /// Converts a vector into a boxed slice.
4726 ///
4727 /// This conversion is in-place if `vec.len() == vec.capacity()`. Otherwise, excess capacity
4728 /// is discarded by reallocating before doing the conversion.
4729 ///
4730 /// # Examples
4731 ///
4732 /// ```
4733 /// assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());
4734 /// ```
4735 ///
4736 /// Any excess capacity is removed:
4737 /// ```
4738 /// let mut vec = Vec::with_capacity(10);
4739 /// vec.extend([1, 2, 3]);
4740 ///
4741 /// assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice());
4742 /// ```
4743 fn from(v: Vec<T, A>) -> Self {
4744 v.into_boxed_slice()
4745 }
4746}
4747
4748#[cfg(not(no_global_oom_handling))]
4749#[stable(feature = "rust1", since = "1.0.0")]
4750impl From<&str> for Vec<u8> {
4751 /// Allocates a `Vec<u8>` and fills it with a UTF-8 string.
4752 ///
4753 /// # Examples
4754 ///
4755 /// ```
4756 /// assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']);
4757 /// ```
4758 fn from(s: &str) -> Vec<u8> {
4759 From::from(s.as_bytes())
4760 }
4761}
4762
4763#[stable(feature = "array_try_from_vec", since = "1.48.0")]
4764#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
4765const impl<T: [const] Destruct, A: [const] Allocator + [const] Destruct, const N: usize>
4766 TryFrom<Vec<T, A>> for [T; N]
4767{
4768 type Error = Vec<T, A>;
4769
4770 /// Gets the entire contents of the `Vec<T>` as an array,
4771 /// if its size exactly matches that of the requested array.
4772 ///
4773 /// # Examples
4774 ///
4775 /// ```
4776 /// assert_eq!(vec![1, 2, 3].try_into(), Ok([1, 2, 3]));
4777 /// assert_eq!(<Vec<i32>>::new().try_into(), Ok([]));
4778 /// ```
4779 ///
4780 /// If the length doesn't match, the input comes back in `Err`:
4781 /// ```
4782 /// let r: Result<[i32; 4], _> = (0..10).collect::<Vec<_>>().try_into();
4783 /// assert_eq!(r, Err(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
4784 /// ```
4785 ///
4786 /// If you're fine with just getting a prefix of the `Vec<T>`,
4787 /// you can call [`.truncate(N)`](Vec::truncate) first.
4788 /// ```
4789 /// let mut v = String::from("hello world").into_bytes();
4790 /// v.sort();
4791 /// v.truncate(2);
4792 /// let [a, b]: [_; 2] = v.try_into().unwrap();
4793 /// assert_eq!(a, b' ');
4794 /// assert_eq!(b, b'd');
4795 /// ```
4796 fn try_from(mut vec: Vec<T, A>) -> Result<[T; N], Vec<T, A>> {
4797 if vec.len() != N {
4798 return Err(vec);
4799 }
4800
4801 // SAFETY: `.set_len(0)` is always sound.
4802 unsafe { vec.set_len(0) };
4803
4804 // SAFETY: A `Vec`'s pointer is always aligned properly, and
4805 // the alignment the array needs is the same as the items.
4806 // We checked earlier that we have sufficient items.
4807 // The items will not double-drop as the `set_len`
4808 // tells the `Vec` not to also drop them.
4809 let array = unsafe { ptr::read(vec.as_ptr() as *const [T; N]) };
4810 Ok(array)
4811 }
4812}