Linux Audio

Check our new training course

Loading...
v6.8
   1// SPDX-License-Identifier: Apache-2.0 OR MIT
   2
   3//! A contiguous growable array type with heap-allocated contents, written
   4//! `Vec<T>`.
   5//!
   6//! Vectors have *O*(1) indexing, amortized *O*(1) push (to the end) and
   7//! *O*(1) pop (from the end).
   8//!
   9//! Vectors ensure they never allocate more than `isize::MAX` bytes.
  10//!
  11//! # Examples
  12//!
  13//! You can explicitly create a [`Vec`] with [`Vec::new`]:
  14//!
  15//! ```
  16//! let v: Vec<i32> = Vec::new();
  17//! ```
  18//!
  19//! ...or by using the [`vec!`] macro:
  20//!
  21//! ```
  22//! let v: Vec<i32> = vec![];
  23//!
  24//! let v = vec![1, 2, 3, 4, 5];
  25//!
  26//! let v = vec![0; 10]; // ten zeroes
  27//! ```
  28//!
  29//! You can [`push`] values onto the end of a vector (which will grow the vector
  30//! as needed):
  31//!
  32//! ```
  33//! let mut v = vec![1, 2];
  34//!
  35//! v.push(3);
  36//! ```
  37//!
  38//! Popping values works in much the same way:
  39//!
  40//! ```
  41//! let mut v = vec![1, 2];
  42//!
  43//! let two = v.pop();
  44//! ```
  45//!
  46//! Vectors also support indexing (through the [`Index`] and [`IndexMut`] traits):
  47//!
  48//! ```
  49//! let mut v = vec![1, 2, 3];
  50//! let three = v[2];
  51//! v[1] = v[1] + 5;
  52//! ```
  53//!
  54//! [`push`]: Vec::push
  55
  56#![stable(feature = "rust1", since = "1.0.0")]
  57
  58#[cfg(not(no_global_oom_handling))]
  59use core::cmp;
  60use core::cmp::Ordering;
 
  61use core::fmt;
  62use core::hash::{Hash, Hasher};
 
  63use core::iter;
 
 
  64use core::marker::PhantomData;
  65use core::mem::{self, ManuallyDrop, MaybeUninit, SizedTypeProperties};
  66use core::ops::{self, Index, IndexMut, Range, RangeBounds};
  67use core::ptr::{self, NonNull};
  68use core::slice::{self, SliceIndex};
  69
  70use crate::alloc::{Allocator, Global};
  71#[cfg(not(no_borrow))]
  72use crate::borrow::{Cow, ToOwned};
  73use crate::boxed::Box;
  74use crate::collections::{TryReserveError, TryReserveErrorKind};
  75use crate::raw_vec::RawVec;
  76
  77#[unstable(feature = "extract_if", reason = "recently added", issue = "43244")]
  78pub use self::extract_if::ExtractIf;
  79
  80mod extract_if;
  81
  82#[cfg(not(no_global_oom_handling))]
  83#[stable(feature = "vec_splice", since = "1.21.0")]
  84pub use self::splice::Splice;
  85
  86#[cfg(not(no_global_oom_handling))]
  87mod splice;
  88
  89#[stable(feature = "drain", since = "1.6.0")]
  90pub use self::drain::Drain;
  91
  92mod drain;
  93
  94#[cfg(not(no_borrow))]
  95#[cfg(not(no_global_oom_handling))]
  96mod cow;
  97
  98#[cfg(not(no_global_oom_handling))]
  99pub(crate) use self::in_place_collect::AsVecIntoIter;
 100#[stable(feature = "rust1", since = "1.0.0")]
 101pub use self::into_iter::IntoIter;
 102
 103mod into_iter;
 104
 105#[cfg(not(no_global_oom_handling))]
 106use self::is_zero::IsZero;
 107
 108mod is_zero;
 109
 110#[cfg(not(no_global_oom_handling))]
 111mod in_place_collect;
 112
 113mod partial_eq;
 114
 115#[cfg(not(no_global_oom_handling))]
 116use self::spec_from_elem::SpecFromElem;
 117
 118#[cfg(not(no_global_oom_handling))]
 119mod spec_from_elem;
 120
 
 121use self::set_len_on_drop::SetLenOnDrop;
 122
 
 123mod set_len_on_drop;
 124
 125#[cfg(not(no_global_oom_handling))]
 126use self::in_place_drop::{InPlaceDrop, InPlaceDstBufDrop};
 127
 128#[cfg(not(no_global_oom_handling))]
 129mod in_place_drop;
 130
 131#[cfg(not(no_global_oom_handling))]
 132use self::spec_from_iter_nested::SpecFromIterNested;
 133
 134#[cfg(not(no_global_oom_handling))]
 135mod spec_from_iter_nested;
 136
 137#[cfg(not(no_global_oom_handling))]
 138use self::spec_from_iter::SpecFromIter;
 139
 140#[cfg(not(no_global_oom_handling))]
 141mod spec_from_iter;
 142
 143#[cfg(not(no_global_oom_handling))]
 144use self::spec_extend::SpecExtend;
 145
 146use self::spec_extend::TrySpecExtend;
 147
 148mod spec_extend;
 149
 150/// A contiguous growable array type, written as `Vec<T>`, short for 'vector'.
 151///
 152/// # Examples
 153///
 154/// ```
 155/// let mut vec = Vec::new();
 156/// vec.push(1);
 157/// vec.push(2);
 158///
 159/// assert_eq!(vec.len(), 2);
 160/// assert_eq!(vec[0], 1);
 161///
 162/// assert_eq!(vec.pop(), Some(2));
 163/// assert_eq!(vec.len(), 1);
 164///
 165/// vec[0] = 7;
 166/// assert_eq!(vec[0], 7);
 167///
 168/// vec.extend([1, 2, 3]);
 169///
 170/// for x in &vec {
 171///     println!("{x}");
 172/// }
 173/// assert_eq!(vec, [7, 1, 2, 3]);
 174/// ```
 175///
 176/// The [`vec!`] macro is provided for convenient initialization:
 177///
 178/// ```
 179/// let mut vec1 = vec![1, 2, 3];
 180/// vec1.push(4);
 181/// let vec2 = Vec::from([1, 2, 3, 4]);
 182/// assert_eq!(vec1, vec2);
 183/// ```
 184///
 185/// It can also initialize each element of a `Vec<T>` with a given value.
 186/// This may be more efficient than performing allocation and initialization
 187/// in separate steps, especially when initializing a vector of zeros:
 188///
 189/// ```
 190/// let vec = vec![0; 5];
 191/// assert_eq!(vec, [0, 0, 0, 0, 0]);
 192///
 193/// // The following is equivalent, but potentially slower:
 194/// let mut vec = Vec::with_capacity(5);
 195/// vec.resize(5, 0);
 196/// assert_eq!(vec, [0, 0, 0, 0, 0]);
 197/// ```
 198///
 199/// For more information, see
 200/// [Capacity and Reallocation](#capacity-and-reallocation).
 201///
 202/// Use a `Vec<T>` as an efficient stack:
 203///
 204/// ```
 205/// let mut stack = Vec::new();
 206///
 207/// stack.push(1);
 208/// stack.push(2);
 209/// stack.push(3);
 210///
 211/// while let Some(top) = stack.pop() {
 212///     // Prints 3, 2, 1
 213///     println!("{top}");
 214/// }
 215/// ```
 216///
 217/// # Indexing
 218///
 219/// The `Vec` type allows access to values by index, because it implements the
 220/// [`Index`] trait. An example will be more explicit:
 221///
 222/// ```
 223/// let v = vec![0, 2, 4, 6];
 224/// println!("{}", v[1]); // it will display '2'
 225/// ```
 226///
 227/// However be careful: if you try to access an index which isn't in the `Vec`,
 228/// your software will panic! You cannot do this:
 229///
 230/// ```should_panic
 231/// let v = vec![0, 2, 4, 6];
 232/// println!("{}", v[6]); // it will panic!
 233/// ```
 234///
 235/// Use [`get`] and [`get_mut`] if you want to check whether the index is in
 236/// the `Vec`.
 237///
 238/// # Slicing
 239///
 240/// A `Vec` can be mutable. On the other hand, slices are read-only objects.
 241/// To get a [slice][prim@slice], use [`&`]. Example:
 242///
 243/// ```
 244/// fn read_slice(slice: &[usize]) {
 245///     // ...
 246/// }
 247///
 248/// let v = vec![0, 1];
 249/// read_slice(&v);
 250///
 251/// // ... and that's all!
 252/// // you can also do it like this:
 253/// let u: &[usize] = &v;
 254/// // or like this:
 255/// let u: &[_] = &v;
 256/// ```
 257///
 258/// In Rust, it's more common to pass slices as arguments rather than vectors
 259/// when you just want to provide read access. The same goes for [`String`] and
 260/// [`&str`].
 261///
 262/// # Capacity and reallocation
 263///
 264/// The capacity of a vector is the amount of space allocated for any future
 265/// elements that will be added onto the vector. This is not to be confused with
 266/// the *length* of a vector, which specifies the number of actual elements
 267/// within the vector. If a vector's length exceeds its capacity, its capacity
 268/// will automatically be increased, but its elements will have to be
 269/// reallocated.
 270///
 271/// For example, a vector with capacity 10 and length 0 would be an empty vector
 272/// with space for 10 more elements. Pushing 10 or fewer elements onto the
 273/// vector will not change its capacity or cause reallocation to occur. However,
 274/// if the vector's length is increased to 11, it will have to reallocate, which
 275/// can be slow. For this reason, it is recommended to use [`Vec::with_capacity`]
 276/// whenever possible to specify how big the vector is expected to get.
 277///
 278/// # Guarantees
 279///
 280/// Due to its incredibly fundamental nature, `Vec` makes a lot of guarantees
 281/// about its design. This ensures that it's as low-overhead as possible in
 282/// the general case, and can be correctly manipulated in primitive ways
 283/// by unsafe code. Note that these guarantees refer to an unqualified `Vec<T>`.
 284/// If additional type parameters are added (e.g., to support custom allocators),
 285/// overriding their defaults may change the behavior.
 286///
 287/// Most fundamentally, `Vec` is and always will be a (pointer, capacity, length)
 288/// triplet. No more, no less. The order of these fields is completely
 289/// unspecified, and you should use the appropriate methods to modify these.
 290/// The pointer will never be null, so this type is null-pointer-optimized.
 291///
 292/// However, the pointer might not actually point to allocated memory. In particular,
 293/// if you construct a `Vec` with capacity 0 via [`Vec::new`], [`vec![]`][`vec!`],
 294/// [`Vec::with_capacity(0)`][`Vec::with_capacity`], or by calling [`shrink_to_fit`]
 295/// on an empty Vec, it will not allocate memory. Similarly, if you store zero-sized
 296/// types inside a `Vec`, it will not allocate space for them. *Note that in this case
 297/// the `Vec` might not report a [`capacity`] of 0*. `Vec` will allocate if and only
 298/// if <code>[mem::size_of::\<T>]\() * [capacity]\() > 0</code>. In general, `Vec`'s allocation
 299/// details are very subtle --- if you intend to allocate memory using a `Vec`
 300/// and use it for something else (either to pass to unsafe code, or to build your
 301/// own memory-backed collection), be sure to deallocate this memory by using
 302/// `from_raw_parts` to recover the `Vec` and then dropping it.
 303///
 304/// If a `Vec` *has* allocated memory, then the memory it points to is on the heap
 305/// (as defined by the allocator Rust is configured to use by default), and its
 306/// pointer points to [`len`] initialized, contiguous elements in order (what
 307/// you would see if you coerced it to a slice), followed by <code>[capacity] - [len]</code>
 308/// logically uninitialized, contiguous elements.
 309///
 310/// A vector containing the elements `'a'` and `'b'` with capacity 4 can be
 311/// visualized as below. The top part is the `Vec` struct, it contains a
 312/// pointer to the head of the allocation in the heap, length and capacity.
 313/// The bottom part is the allocation on the heap, a contiguous memory block.
 314///
 315/// ```text
 316///             ptr      len  capacity
 317///        +--------+--------+--------+
 318///        | 0x0123 |      2 |      4 |
 319///        +--------+--------+--------+
 320///             |
 321///             v
 322/// Heap   +--------+--------+--------+--------+
 323///        |    'a' |    'b' | uninit | uninit |
 324///        +--------+--------+--------+--------+
 325/// ```
 326///
 327/// - **uninit** represents memory that is not initialized, see [`MaybeUninit`].
 328/// - Note: the ABI is not stable and `Vec` makes no guarantees about its memory
 329///   layout (including the order of fields).
 330///
 331/// `Vec` will never perform a "small optimization" where elements are actually
 332/// stored on the stack for two reasons:
 333///
 334/// * It would make it more difficult for unsafe code to correctly manipulate
 335///   a `Vec`. The contents of a `Vec` wouldn't have a stable address if it were
 336///   only moved, and it would be more difficult to determine if a `Vec` had
 337///   actually allocated memory.
 338///
 339/// * It would penalize the general case, incurring an additional branch
 340///   on every access.
 341///
 342/// `Vec` will never automatically shrink itself, even if completely empty. This
 343/// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec`
 344/// and then filling it back up to the same [`len`] should incur no calls to
 345/// the allocator. If you wish to free up unused memory, use
 346/// [`shrink_to_fit`] or [`shrink_to`].
 347///
 348/// [`push`] and [`insert`] will never (re)allocate if the reported capacity is
 349/// sufficient. [`push`] and [`insert`] *will* (re)allocate if
 350/// <code>[len] == [capacity]</code>. That is, the reported capacity is completely
 351/// accurate, and can be relied on. It can even be used to manually free the memory
 352/// allocated by a `Vec` if desired. Bulk insertion methods *may* reallocate, even
 353/// when not necessary.
 354///
 355/// `Vec` does not guarantee any particular growth strategy when reallocating
 356/// when full, nor when [`reserve`] is called. The current strategy is basic
 357/// and it may prove desirable to use a non-constant growth factor. Whatever
 358/// strategy is used will of course guarantee *O*(1) amortized [`push`].
 359///
 360/// `vec![x; n]`, `vec![a, b, c, d]`, and
 361/// [`Vec::with_capacity(n)`][`Vec::with_capacity`], will all produce a `Vec`
 362/// with exactly the requested capacity. If <code>[len] == [capacity]</code>,
 363/// (as is the case for the [`vec!`] macro), then a `Vec<T>` can be converted to
 364/// and from a [`Box<[T]>`][owned slice] without reallocating or moving the elements.
 365///
 366/// `Vec` will not specifically overwrite any data that is removed from it,
 367/// but also won't specifically preserve it. Its uninitialized memory is
 368/// scratch space that it may use however it wants. It will generally just do
 369/// whatever is most efficient or otherwise easy to implement. Do not rely on
 370/// removed data to be erased for security purposes. Even if you drop a `Vec`, its
 371/// buffer may simply be reused by another allocation. Even if you zero a `Vec`'s memory
 372/// first, that might not actually happen because the optimizer does not consider
 373/// this a side-effect that must be preserved. There is one case which we will
 374/// not break, however: using `unsafe` code to write to the excess capacity,
 375/// and then increasing the length to match, is always valid.
 376///
 377/// Currently, `Vec` does not guarantee the order in which elements are dropped.
 378/// The order has changed in the past and may change again.
 379///
 380/// [`get`]: slice::get
 381/// [`get_mut`]: slice::get_mut
 382/// [`String`]: crate::string::String
 383/// [`&str`]: type@str
 384/// [`shrink_to_fit`]: Vec::shrink_to_fit
 385/// [`shrink_to`]: Vec::shrink_to
 386/// [capacity]: Vec::capacity
 387/// [`capacity`]: Vec::capacity
 388/// [mem::size_of::\<T>]: core::mem::size_of
 389/// [len]: Vec::len
 390/// [`len`]: Vec::len
 391/// [`push`]: Vec::push
 392/// [`insert`]: Vec::insert
 393/// [`reserve`]: Vec::reserve
 394/// [`MaybeUninit`]: core::mem::MaybeUninit
 395/// [owned slice]: Box
 396#[stable(feature = "rust1", since = "1.0.0")]
 397#[cfg_attr(not(test), rustc_diagnostic_item = "Vec")]
 398#[rustc_insignificant_dtor]
 399pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
 400    buf: RawVec<T, A>,
 401    len: usize,
 402}
 403
 404////////////////////////////////////////////////////////////////////////////////
 405// Inherent methods
 406////////////////////////////////////////////////////////////////////////////////
 407
 408impl<T> Vec<T> {
 409    /// Constructs a new, empty `Vec<T>`.
 410    ///
 411    /// The vector will not allocate until elements are pushed onto it.
 412    ///
 413    /// # Examples
 414    ///
 415    /// ```
 416    /// # #![allow(unused_mut)]
 417    /// let mut vec: Vec<i32> = Vec::new();
 418    /// ```
 419    #[inline]
 420    #[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")]
 421    #[stable(feature = "rust1", since = "1.0.0")]
 422    #[must_use]
 423    pub const fn new() -> Self {
 424        Vec { buf: RawVec::NEW, len: 0 }
 425    }
 426
 427    /// Constructs a new, empty `Vec<T>` with at least the specified capacity.
 428    ///
 429    /// The vector will be able to hold at least `capacity` elements without
 430    /// reallocating. This method is allowed to allocate for more elements than
 431    /// `capacity`. If `capacity` is 0, the vector will not allocate.
 432    ///
 433    /// It is important to note that although the returned vector has the
 434    /// minimum *capacity* specified, the vector will have a zero *length*. For
 435    /// an explanation of the difference between length and capacity, see
 436    /// *[Capacity and reallocation]*.
 437    ///
 438    /// If it is important to know the exact allocated capacity of a `Vec`,
 439    /// always use the [`capacity`] method after construction.
 440    ///
 441    /// For `Vec<T>` where `T` is a zero-sized type, there will be no allocation
 442    /// and the capacity will always be `usize::MAX`.
 443    ///
 444    /// [Capacity and reallocation]: #capacity-and-reallocation
 445    /// [`capacity`]: Vec::capacity
 446    ///
 447    /// # Panics
 448    ///
 449    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 450    ///
 451    /// # Examples
 452    ///
 453    /// ```
 454    /// let mut vec = Vec::with_capacity(10);
 455    ///
 456    /// // The vector contains no items, even though it has capacity for more
 457    /// assert_eq!(vec.len(), 0);
 458    /// assert!(vec.capacity() >= 10);
 459    ///
 460    /// // These are all done without reallocating...
 461    /// for i in 0..10 {
 462    ///     vec.push(i);
 463    /// }
 464    /// assert_eq!(vec.len(), 10);
 465    /// assert!(vec.capacity() >= 10);
 466    ///
 467    /// // ...but this may make the vector reallocate
 468    /// vec.push(11);
 469    /// assert_eq!(vec.len(), 11);
 470    /// assert!(vec.capacity() >= 11);
 471    ///
 472    /// // A vector of a zero-sized type will always over-allocate, since no
 473    /// // allocation is necessary
 474    /// let vec_units = Vec::<()>::with_capacity(10);
 475    /// assert_eq!(vec_units.capacity(), usize::MAX);
 476    /// ```
 477    #[cfg(not(no_global_oom_handling))]
 478    #[inline]
 479    #[stable(feature = "rust1", since = "1.0.0")]
 480    #[must_use]
 481    pub fn with_capacity(capacity: usize) -> Self {
 482        Self::with_capacity_in(capacity, Global)
 483    }
 484
 485    /// Tries to construct a new, empty `Vec<T>` with at least the specified capacity.
 486    ///
 487    /// The vector will be able to hold at least `capacity` elements without
 488    /// reallocating. This method is allowed to allocate for more elements than
 489    /// `capacity`. If `capacity` is 0, the vector will not allocate.
 490    ///
 491    /// It is important to note that although the returned vector has the
 492    /// minimum *capacity* specified, the vector will have a zero *length*. For
 493    /// an explanation of the difference between length and capacity, see
 494    /// *[Capacity and reallocation]*.
 495    ///
 496    /// If it is important to know the exact allocated capacity of a `Vec`,
 497    /// always use the [`capacity`] method after construction.
 498    ///
 499    /// For `Vec<T>` where `T` is a zero-sized type, there will be no allocation
 500    /// and the capacity will always be `usize::MAX`.
 501    ///
 502    /// [Capacity and reallocation]: #capacity-and-reallocation
 503    /// [`capacity`]: Vec::capacity
 504    ///
 505    /// # Examples
 506    ///
 507    /// ```
 508    /// let mut vec = Vec::try_with_capacity(10).unwrap();
 509    ///
 510    /// // The vector contains no items, even though it has capacity for more
 511    /// assert_eq!(vec.len(), 0);
 512    /// assert!(vec.capacity() >= 10);
 513    ///
 514    /// // These are all done without reallocating...
 515    /// for i in 0..10 {
 516    ///     vec.push(i);
 517    /// }
 518    /// assert_eq!(vec.len(), 10);
 519    /// assert!(vec.capacity() >= 10);
 520    ///
 521    /// // ...but this may make the vector reallocate
 522    /// vec.push(11);
 523    /// assert_eq!(vec.len(), 11);
 524    /// assert!(vec.capacity() >= 11);
 525    ///
 526    /// let mut result = Vec::try_with_capacity(usize::MAX);
 527    /// assert!(result.is_err());
 528    ///
 529    /// // A vector of a zero-sized type will always over-allocate, since no
 530    /// // allocation is necessary
 531    /// let vec_units = Vec::<()>::try_with_capacity(10).unwrap();
 532    /// assert_eq!(vec_units.capacity(), usize::MAX);
 533    /// ```
 534    #[inline]
 535    #[stable(feature = "kernel", since = "1.0.0")]
 536    pub fn try_with_capacity(capacity: usize) -> Result<Self, TryReserveError> {
 537        Self::try_with_capacity_in(capacity, Global)
 538    }
 539
 540    /// Creates a `Vec<T>` directly from a pointer, a capacity, and a length.
 541    ///
 542    /// # Safety
 543    ///
 544    /// This is highly unsafe, due to the number of invariants that aren't
 545    /// checked:
 546    ///
 547    /// * `ptr` must have been allocated using the global allocator, such as via
 548    ///   the [`alloc::alloc`] function.
 549    /// * `T` needs to have the same alignment as what `ptr` was allocated with.
 550    ///   (`T` having a less strict alignment is not sufficient, the alignment really
 551    ///   needs to be equal to satisfy the [`dealloc`] requirement that memory must be
 552    ///   allocated and deallocated with the same layout.)
 553    /// * The size of `T` times the `capacity` (ie. the allocated size in bytes) needs
 554    ///   to be the same size as the pointer was allocated with. (Because similar to
 555    ///   alignment, [`dealloc`] must be called with the same layout `size`.)
 556    /// * `length` needs to be less than or equal to `capacity`.
 557    /// * The first `length` values must be properly initialized values of type `T`.
 558    /// * `capacity` needs to be the capacity that the pointer was allocated with.
 559    /// * The allocated size in bytes must be no larger than `isize::MAX`.
 560    ///   See the safety documentation of [`pointer::offset`].
 561    ///
 562    /// These requirements are always upheld by any `ptr` that has been allocated
 563    /// via `Vec<T>`. Other allocation sources are allowed if the invariants are
 564    /// upheld.
 565    ///
 566    /// Violating these may cause problems like corrupting the allocator's
 567    /// internal data structures. For example it is normally **not** safe
 568    /// to build a `Vec<u8>` from a pointer to a C `char` array with length
 569    /// `size_t`, doing so is only safe if the array was initially allocated by
 570    /// a `Vec` or `String`.
 571    /// It's also not safe to build one from a `Vec<u16>` and its length, because
 572    /// the allocator cares about the alignment, and these two types have different
 573    /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
 574    /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1. To avoid
 575    /// these issues, it is often preferable to do casting/transmuting using
 576    /// [`slice::from_raw_parts`] instead.
 577    ///
 578    /// The ownership of `ptr` is effectively transferred to the
 579    /// `Vec<T>` which may then deallocate, reallocate or change the
 580    /// contents of memory pointed to by the pointer at will. Ensure
 581    /// that nothing else uses the pointer after calling this
 582    /// function.
 583    ///
 584    /// [`String`]: crate::string::String
 585    /// [`alloc::alloc`]: crate::alloc::alloc
 586    /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
 587    ///
 588    /// # Examples
 589    ///
 590    /// ```
 591    /// use std::ptr;
 592    /// use std::mem;
 593    ///
 594    /// let v = vec![1, 2, 3];
 595    ///
 596    // FIXME Update this when vec_into_raw_parts is stabilized
 597    /// // Prevent running `v`'s destructor so we are in complete control
 598    /// // of the allocation.
 599    /// let mut v = mem::ManuallyDrop::new(v);
 600    ///
 601    /// // Pull out the various important pieces of information about `v`
 602    /// let p = v.as_mut_ptr();
 603    /// let len = v.len();
 604    /// let cap = v.capacity();
 605    ///
 606    /// unsafe {
 607    ///     // Overwrite memory with 4, 5, 6
 608    ///     for i in 0..len {
 609    ///         ptr::write(p.add(i), 4 + i);
 610    ///     }
 611    ///
 612    ///     // Put everything back together into a Vec
 613    ///     let rebuilt = Vec::from_raw_parts(p, len, cap);
 614    ///     assert_eq!(rebuilt, [4, 5, 6]);
 615    /// }
 616    /// ```
 617    ///
 618    /// Using memory that was allocated elsewhere:
 619    ///
 620    /// ```rust
 621    /// use std::alloc::{alloc, Layout};
 622    ///
 623    /// fn main() {
 624    ///     let layout = Layout::array::<u32>(16).expect("overflow cannot happen");
 625    ///
 626    ///     let vec = unsafe {
 627    ///         let mem = alloc(layout).cast::<u32>();
 628    ///         if mem.is_null() {
 629    ///             return;
 630    ///         }
 631    ///
 632    ///         mem.write(1_000_000);
 633    ///
 634    ///         Vec::from_raw_parts(mem, 1, 16)
 635    ///     };
 636    ///
 637    ///     assert_eq!(vec, &[1_000_000]);
 638    ///     assert_eq!(vec.capacity(), 16);
 639    /// }
 640    /// ```
 641    #[inline]
 642    #[stable(feature = "rust1", since = "1.0.0")]
 643    pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self {
 644        unsafe { Self::from_raw_parts_in(ptr, length, capacity, Global) }
 645    }
 646}
 647
 648impl<T, A: Allocator> Vec<T, A> {
 649    /// Constructs a new, empty `Vec<T, A>`.
 650    ///
 651    /// The vector will not allocate until elements are pushed onto it.
 652    ///
 653    /// # Examples
 654    ///
 655    /// ```
 656    /// #![feature(allocator_api)]
 657    ///
 658    /// use std::alloc::System;
 659    ///
 660    /// # #[allow(unused_mut)]
 661    /// let mut vec: Vec<i32, _> = Vec::new_in(System);
 662    /// ```
 663    #[inline]
 664    #[unstable(feature = "allocator_api", issue = "32838")]
 665    pub const fn new_in(alloc: A) -> Self {
 666        Vec { buf: RawVec::new_in(alloc), len: 0 }
 667    }
 668
 669    /// Constructs a new, empty `Vec<T, A>` with at least the specified capacity
 670    /// with the provided allocator.
 671    ///
 672    /// The vector will be able to hold at least `capacity` elements without
 673    /// reallocating. This method is allowed to allocate for more elements than
 674    /// `capacity`. If `capacity` is 0, the vector will not allocate.
 675    ///
 676    /// It is important to note that although the returned vector has the
 677    /// minimum *capacity* specified, the vector will have a zero *length*. For
 678    /// an explanation of the difference between length and capacity, see
 679    /// *[Capacity and reallocation]*.
 680    ///
 681    /// If it is important to know the exact allocated capacity of a `Vec`,
 682    /// always use the [`capacity`] method after construction.
 683    ///
 684    /// For `Vec<T, A>` where `T` is a zero-sized type, there will be no allocation
 685    /// and the capacity will always be `usize::MAX`.
 686    ///
 687    /// [Capacity and reallocation]: #capacity-and-reallocation
 688    /// [`capacity`]: Vec::capacity
 689    ///
 690    /// # Panics
 691    ///
 692    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 693    ///
 694    /// # Examples
 695    ///
 696    /// ```
 697    /// #![feature(allocator_api)]
 698    ///
 699    /// use std::alloc::System;
 700    ///
 701    /// let mut vec = Vec::with_capacity_in(10, System);
 702    ///
 703    /// // The vector contains no items, even though it has capacity for more
 704    /// assert_eq!(vec.len(), 0);
 705    /// assert!(vec.capacity() >= 10);
 706    ///
 707    /// // These are all done without reallocating...
 708    /// for i in 0..10 {
 709    ///     vec.push(i);
 710    /// }
 711    /// assert_eq!(vec.len(), 10);
 712    /// assert!(vec.capacity() >= 10);
 713    ///
 714    /// // ...but this may make the vector reallocate
 715    /// vec.push(11);
 716    /// assert_eq!(vec.len(), 11);
 717    /// assert!(vec.capacity() >= 11);
 718    ///
 719    /// // A vector of a zero-sized type will always over-allocate, since no
 720    /// // allocation is necessary
 721    /// let vec_units = Vec::<(), System>::with_capacity_in(10, System);
 722    /// assert_eq!(vec_units.capacity(), usize::MAX);
 723    /// ```
 724    #[cfg(not(no_global_oom_handling))]
 725    #[inline]
 726    #[unstable(feature = "allocator_api", issue = "32838")]
 727    pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
 728        Vec { buf: RawVec::with_capacity_in(capacity, alloc), len: 0 }
 729    }
 730
 731    /// Tries to construct a new, empty `Vec<T, A>` with at least the specified capacity
 732    /// with the provided allocator.
 733    ///
 734    /// The vector will be able to hold at least `capacity` elements without
 735    /// reallocating. This method is allowed to allocate for more elements than
 736    /// `capacity`. If `capacity` is 0, the vector will not allocate.
 737    ///
 738    /// It is important to note that although the returned vector has the
 739    /// minimum *capacity* specified, the vector will have a zero *length*. For
 740    /// an explanation of the difference between length and capacity, see
 741    /// *[Capacity and reallocation]*.
 742    ///
 743    /// If it is important to know the exact allocated capacity of a `Vec`,
 744    /// always use the [`capacity`] method after construction.
 745    ///
 746    /// For `Vec<T, A>` where `T` is a zero-sized type, there will be no allocation
 747    /// and the capacity will always be `usize::MAX`.
 748    ///
 749    /// [Capacity and reallocation]: #capacity-and-reallocation
 750    /// [`capacity`]: Vec::capacity
 751    ///
 752    /// # Examples
 753    ///
 754    /// ```
 755    /// #![feature(allocator_api)]
 756    ///
 757    /// use std::alloc::System;
 758    ///
 759    /// let mut vec = Vec::try_with_capacity_in(10, System).unwrap();
 760    ///
 761    /// // The vector contains no items, even though it has capacity for more
 762    /// assert_eq!(vec.len(), 0);
 763    /// assert!(vec.capacity() >= 10);
 764    ///
 765    /// // These are all done without reallocating...
 766    /// for i in 0..10 {
 767    ///     vec.push(i);
 768    /// }
 769    /// assert_eq!(vec.len(), 10);
 770    /// assert!(vec.capacity() >= 10);
 771    ///
 772    /// // ...but this may make the vector reallocate
 773    /// vec.push(11);
 774    /// assert_eq!(vec.len(), 11);
 775    /// assert!(vec.capacity() >= 11);
 776    ///
 777    /// let mut result = Vec::try_with_capacity_in(usize::MAX, System);
 778    /// assert!(result.is_err());
 779    ///
 780    /// // A vector of a zero-sized type will always over-allocate, since no
 781    /// // allocation is necessary
 782    /// let vec_units = Vec::<(), System>::try_with_capacity_in(10, System).unwrap();
 783    /// assert_eq!(vec_units.capacity(), usize::MAX);
 784    /// ```
 785    #[inline]
 786    #[stable(feature = "kernel", since = "1.0.0")]
 787    pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result<Self, TryReserveError> {
 788        Ok(Vec { buf: RawVec::try_with_capacity_in(capacity, alloc)?, len: 0 })
 789    }
 790
 791    /// Creates a `Vec<T, A>` directly from a pointer, a capacity, a length,
 792    /// and an allocator.
 793    ///
 794    /// # Safety
 795    ///
 796    /// This is highly unsafe, due to the number of invariants that aren't
 797    /// checked:
 798    ///
 799    /// * `ptr` must be [*currently allocated*] via the given allocator `alloc`.
 800    /// * `T` needs to have the same alignment as what `ptr` was allocated with.
 
 801    ///   (`T` having a less strict alignment is not sufficient, the alignment really
 802    ///   needs to be equal to satisfy the [`dealloc`] requirement that memory must be
 803    ///   allocated and deallocated with the same layout.)
 804    /// * The size of `T` times the `capacity` (ie. the allocated size in bytes) needs
 805    ///   to be the same size as the pointer was allocated with. (Because similar to
 806    ///   alignment, [`dealloc`] must be called with the same layout `size`.)
 807    /// * `length` needs to be less than or equal to `capacity`.
 808    /// * The first `length` values must be properly initialized values of type `T`.
 809    /// * `capacity` needs to [*fit*] the layout size that the pointer was allocated with.
 810    /// * The allocated size in bytes must be no larger than `isize::MAX`.
 811    ///   See the safety documentation of [`pointer::offset`].
 812    ///
 813    /// These requirements are always upheld by any `ptr` that has been allocated
 814    /// via `Vec<T, A>`. Other allocation sources are allowed if the invariants are
 815    /// upheld.
 816    ///
 817    /// Violating these may cause problems like corrupting the allocator's
 818    /// internal data structures. For example it is **not** safe
 819    /// to build a `Vec<u8>` from a pointer to a C `char` array with length `size_t`.
 820    /// It's also not safe to build one from a `Vec<u16>` and its length, because
 821    /// the allocator cares about the alignment, and these two types have different
 822    /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
 823    /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1.
 824    ///
 825    /// The ownership of `ptr` is effectively transferred to the
 826    /// `Vec<T>` which may then deallocate, reallocate or change the
 827    /// contents of memory pointed to by the pointer at will. Ensure
 828    /// that nothing else uses the pointer after calling this
 829    /// function.
 830    ///
 831    /// [`String`]: crate::string::String
 832    /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
 833    /// [*currently allocated*]: crate::alloc::Allocator#currently-allocated-memory
 834    /// [*fit*]: crate::alloc::Allocator#memory-fitting
 835    ///
 836    /// # Examples
 837    ///
 838    /// ```
 839    /// #![feature(allocator_api)]
 840    ///
 841    /// use std::alloc::System;
 842    ///
 843    /// use std::ptr;
 844    /// use std::mem;
 845    ///
 846    /// let mut v = Vec::with_capacity_in(3, System);
 847    /// v.push(1);
 848    /// v.push(2);
 849    /// v.push(3);
 850    ///
 851    // FIXME Update this when vec_into_raw_parts is stabilized
 852    /// // Prevent running `v`'s destructor so we are in complete control
 853    /// // of the allocation.
 854    /// let mut v = mem::ManuallyDrop::new(v);
 855    ///
 856    /// // Pull out the various important pieces of information about `v`
 857    /// let p = v.as_mut_ptr();
 858    /// let len = v.len();
 859    /// let cap = v.capacity();
 860    /// let alloc = v.allocator();
 861    ///
 862    /// unsafe {
 863    ///     // Overwrite memory with 4, 5, 6
 864    ///     for i in 0..len {
 865    ///         ptr::write(p.add(i), 4 + i);
 866    ///     }
 867    ///
 868    ///     // Put everything back together into a Vec
 869    ///     let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());
 870    ///     assert_eq!(rebuilt, [4, 5, 6]);
 871    /// }
 872    /// ```
 873    ///
 874    /// Using memory that was allocated elsewhere:
 875    ///
 876    /// ```rust
 877    /// #![feature(allocator_api)]
 878    ///
 879    /// use std::alloc::{AllocError, Allocator, Global, Layout};
 880    ///
 881    /// fn main() {
 882    ///     let layout = Layout::array::<u32>(16).expect("overflow cannot happen");
 883    ///
 884    ///     let vec = unsafe {
 885    ///         let mem = match Global.allocate(layout) {
 886    ///             Ok(mem) => mem.cast::<u32>().as_ptr(),
 887    ///             Err(AllocError) => return,
 888    ///         };
 889    ///
 890    ///         mem.write(1_000_000);
 891    ///
 892    ///         Vec::from_raw_parts_in(mem, 1, 16, Global)
 893    ///     };
 894    ///
 895    ///     assert_eq!(vec, &[1_000_000]);
 896    ///     assert_eq!(vec.capacity(), 16);
 897    /// }
 898    /// ```
 899    #[inline]
 900    #[unstable(feature = "allocator_api", issue = "32838")]
 901    pub unsafe fn from_raw_parts_in(ptr: *mut T, length: usize, capacity: usize, alloc: A) -> Self {
 902        unsafe { Vec { buf: RawVec::from_raw_parts_in(ptr, capacity, alloc), len: length } }
 903    }
 904
 905    /// Decomposes a `Vec<T>` into its raw components.
 906    ///
 907    /// Returns the raw pointer to the underlying data, the length of
 908    /// the vector (in elements), and the allocated capacity of the
 909    /// data (in elements). These are the same arguments in the same
 910    /// order as the arguments to [`from_raw_parts`].
 911    ///
 912    /// After calling this function, the caller is responsible for the
 913    /// memory previously managed by the `Vec`. The only way to do
 914    /// this is to convert the raw pointer, length, and capacity back
 915    /// into a `Vec` with the [`from_raw_parts`] function, allowing
 916    /// the destructor to perform the cleanup.
 917    ///
 918    /// [`from_raw_parts`]: Vec::from_raw_parts
 919    ///
 920    /// # Examples
 921    ///
 922    /// ```
 923    /// #![feature(vec_into_raw_parts)]
 924    /// let v: Vec<i32> = vec![-1, 0, 1];
 925    ///
 926    /// let (ptr, len, cap) = v.into_raw_parts();
 927    ///
 928    /// let rebuilt = unsafe {
 929    ///     // We can now make changes to the components, such as
 930    ///     // transmuting the raw pointer to a compatible type.
 931    ///     let ptr = ptr as *mut u32;
 932    ///
 933    ///     Vec::from_raw_parts(ptr, len, cap)
 934    /// };
 935    /// assert_eq!(rebuilt, [4294967295, 0, 1]);
 936    /// ```
 937    #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
 938    pub fn into_raw_parts(self) -> (*mut T, usize, usize) {
 939        let mut me = ManuallyDrop::new(self);
 940        (me.as_mut_ptr(), me.len(), me.capacity())
 941    }
 942
 943    /// Decomposes a `Vec<T>` into its raw components.
 944    ///
 945    /// Returns the raw pointer to the underlying data, the length of the vector (in elements),
 946    /// the allocated capacity of the data (in elements), and the allocator. These are the same
 947    /// arguments in the same order as the arguments to [`from_raw_parts_in`].
 948    ///
 949    /// After calling this function, the caller is responsible for the
 950    /// memory previously managed by the `Vec`. The only way to do
 951    /// this is to convert the raw pointer, length, and capacity back
 952    /// into a `Vec` with the [`from_raw_parts_in`] function, allowing
 953    /// the destructor to perform the cleanup.
 954    ///
 955    /// [`from_raw_parts_in`]: Vec::from_raw_parts_in
 956    ///
 957    /// # Examples
 958    ///
 959    /// ```
 960    /// #![feature(allocator_api, vec_into_raw_parts)]
 961    ///
 962    /// use std::alloc::System;
 963    ///
 964    /// let mut v: Vec<i32, System> = Vec::new_in(System);
 965    /// v.push(-1);
 966    /// v.push(0);
 967    /// v.push(1);
 968    ///
 969    /// let (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();
 970    ///
 971    /// let rebuilt = unsafe {
 972    ///     // We can now make changes to the components, such as
 973    ///     // transmuting the raw pointer to a compatible type.
 974    ///     let ptr = ptr as *mut u32;
 975    ///
 976    ///     Vec::from_raw_parts_in(ptr, len, cap, alloc)
 977    /// };
 978    /// assert_eq!(rebuilt, [4294967295, 0, 1]);
 979    /// ```
 980    #[unstable(feature = "allocator_api", issue = "32838")]
 981    // #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
 982    pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A) {
 983        let mut me = ManuallyDrop::new(self);
 984        let len = me.len();
 985        let capacity = me.capacity();
 986        let ptr = me.as_mut_ptr();
 987        let alloc = unsafe { ptr::read(me.allocator()) };
 988        (ptr, len, capacity, alloc)
 989    }
 990
 991    /// Returns the total number of elements the vector can hold without
 992    /// reallocating.
 993    ///
 994    /// # Examples
 995    ///
 996    /// ```
 997    /// let mut vec: Vec<i32> = Vec::with_capacity(10);
 998    /// vec.push(42);
 999    /// assert!(vec.capacity() >= 10);
1000    /// ```
1001    #[inline]
1002    #[stable(feature = "rust1", since = "1.0.0")]
1003    pub fn capacity(&self) -> usize {
1004        self.buf.capacity()
1005    }
1006
1007    /// Reserves capacity for at least `additional` more elements to be inserted
1008    /// in the given `Vec<T>`. The collection may reserve more space to
1009    /// speculatively avoid frequent reallocations. After calling `reserve`,
1010    /// capacity will be greater than or equal to `self.len() + additional`.
1011    /// Does nothing if capacity is already sufficient.
1012    ///
1013    /// # Panics
1014    ///
1015    /// Panics if the new capacity exceeds `isize::MAX` bytes.
1016    ///
1017    /// # Examples
1018    ///
1019    /// ```
1020    /// let mut vec = vec![1];
1021    /// vec.reserve(10);
1022    /// assert!(vec.capacity() >= 11);
1023    /// ```
1024    #[cfg(not(no_global_oom_handling))]
1025    #[stable(feature = "rust1", since = "1.0.0")]
1026    pub fn reserve(&mut self, additional: usize) {
1027        self.buf.reserve(self.len, additional);
1028    }
1029
1030    /// Reserves the minimum capacity for at least `additional` more elements to
1031    /// be inserted in the given `Vec<T>`. Unlike [`reserve`], this will not
1032    /// deliberately over-allocate to speculatively avoid frequent allocations.
1033    /// After calling `reserve_exact`, capacity will be greater than or equal to
1034    /// `self.len() + additional`. Does nothing if the capacity is already
1035    /// sufficient.
1036    ///
1037    /// Note that the allocator may give the collection more space than it
1038    /// requests. Therefore, capacity can not be relied upon to be precisely
1039    /// minimal. Prefer [`reserve`] if future insertions are expected.
1040    ///
1041    /// [`reserve`]: Vec::reserve
1042    ///
1043    /// # Panics
1044    ///
1045    /// Panics if the new capacity exceeds `isize::MAX` bytes.
1046    ///
1047    /// # Examples
1048    ///
1049    /// ```
1050    /// let mut vec = vec![1];
1051    /// vec.reserve_exact(10);
1052    /// assert!(vec.capacity() >= 11);
1053    /// ```
1054    #[cfg(not(no_global_oom_handling))]
1055    #[stable(feature = "rust1", since = "1.0.0")]
1056    pub fn reserve_exact(&mut self, additional: usize) {
1057        self.buf.reserve_exact(self.len, additional);
1058    }
1059
1060    /// Tries to reserve capacity for at least `additional` more elements to be inserted
1061    /// in the given `Vec<T>`. The collection may reserve more space to speculatively avoid
1062    /// frequent reallocations. After calling `try_reserve`, capacity will be
1063    /// greater than or equal to `self.len() + additional` if it returns
1064    /// `Ok(())`. Does nothing if capacity is already sufficient. This method
1065    /// preserves the contents even if an error occurs.
1066    ///
1067    /// # Errors
1068    ///
1069    /// If the capacity overflows, or the allocator reports a failure, then an error
1070    /// is returned.
1071    ///
1072    /// # Examples
1073    ///
1074    /// ```
1075    /// use std::collections::TryReserveError;
1076    ///
1077    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
1078    ///     let mut output = Vec::new();
1079    ///
1080    ///     // Pre-reserve the memory, exiting if we can't
1081    ///     output.try_reserve(data.len())?;
1082    ///
1083    ///     // Now we know this can't OOM in the middle of our complex work
1084    ///     output.extend(data.iter().map(|&val| {
1085    ///         val * 2 + 5 // very complicated
1086    ///     }));
1087    ///
1088    ///     Ok(output)
1089    /// }
1090    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
1091    /// ```
1092    #[stable(feature = "try_reserve", since = "1.57.0")]
1093    pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
1094        self.buf.try_reserve(self.len, additional)
1095    }
1096
1097    /// Tries to reserve the minimum capacity for at least `additional`
1098    /// elements to be inserted in the given `Vec<T>`. Unlike [`try_reserve`],
1099    /// this will not deliberately over-allocate to speculatively avoid frequent
1100    /// allocations. After calling `try_reserve_exact`, capacity will be greater
1101    /// than or equal to `self.len() + additional` if it returns `Ok(())`.
1102    /// Does nothing if the capacity is already sufficient.
1103    ///
1104    /// Note that the allocator may give the collection more space than it
1105    /// requests. Therefore, capacity can not be relied upon to be precisely
1106    /// minimal. Prefer [`try_reserve`] if future insertions are expected.
1107    ///
1108    /// [`try_reserve`]: Vec::try_reserve
1109    ///
1110    /// # Errors
1111    ///
1112    /// If the capacity overflows, or the allocator reports a failure, then an error
1113    /// is returned.
1114    ///
1115    /// # Examples
1116    ///
1117    /// ```
1118    /// use std::collections::TryReserveError;
1119    ///
1120    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
1121    ///     let mut output = Vec::new();
1122    ///
1123    ///     // Pre-reserve the memory, exiting if we can't
1124    ///     output.try_reserve_exact(data.len())?;
1125    ///
1126    ///     // Now we know this can't OOM in the middle of our complex work
1127    ///     output.extend(data.iter().map(|&val| {
1128    ///         val * 2 + 5 // very complicated
1129    ///     }));
1130    ///
1131    ///     Ok(output)
1132    /// }
1133    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
1134    /// ```
1135    #[stable(feature = "try_reserve", since = "1.57.0")]
1136    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
1137        self.buf.try_reserve_exact(self.len, additional)
1138    }
1139
1140    /// Shrinks the capacity of the vector as much as possible.
1141    ///
1142    /// It will drop down as close as possible to the length but the allocator
1143    /// may still inform the vector that there is space for a few more elements.
1144    ///
1145    /// # Examples
1146    ///
1147    /// ```
1148    /// let mut vec = Vec::with_capacity(10);
1149    /// vec.extend([1, 2, 3]);
1150    /// assert!(vec.capacity() >= 10);
1151    /// vec.shrink_to_fit();
1152    /// assert!(vec.capacity() >= 3);
1153    /// ```
1154    #[cfg(not(no_global_oom_handling))]
1155    #[stable(feature = "rust1", since = "1.0.0")]
1156    pub fn shrink_to_fit(&mut self) {
1157        // The capacity is never less than the length, and there's nothing to do when
1158        // they are equal, so we can avoid the panic case in `RawVec::shrink_to_fit`
1159        // by only calling it with a greater capacity.
1160        if self.capacity() > self.len {
1161            self.buf.shrink_to_fit(self.len);
1162        }
1163    }
1164
1165    /// Shrinks the capacity of the vector with a lower bound.
1166    ///
1167    /// The capacity will remain at least as large as both the length
1168    /// and the supplied value.
1169    ///
1170    /// If the current capacity is less than the lower limit, this is a no-op.
1171    ///
1172    /// # Examples
1173    ///
1174    /// ```
1175    /// let mut vec = Vec::with_capacity(10);
1176    /// vec.extend([1, 2, 3]);
1177    /// assert!(vec.capacity() >= 10);
1178    /// vec.shrink_to(4);
1179    /// assert!(vec.capacity() >= 4);
1180    /// vec.shrink_to(0);
1181    /// assert!(vec.capacity() >= 3);
1182    /// ```
1183    #[cfg(not(no_global_oom_handling))]
1184    #[stable(feature = "shrink_to", since = "1.56.0")]
1185    pub fn shrink_to(&mut self, min_capacity: usize) {
1186        if self.capacity() > min_capacity {
1187            self.buf.shrink_to_fit(cmp::max(self.len, min_capacity));
1188        }
1189    }
1190
1191    /// Converts the vector into [`Box<[T]>`][owned slice].
1192    ///
1193    /// If the vector has excess capacity, its items will be moved into a
1194    /// newly-allocated buffer with exactly the right capacity.
1195    ///
1196    /// [owned slice]: Box
1197    ///
1198    /// # Examples
1199    ///
1200    /// ```
1201    /// let v = vec![1, 2, 3];
1202    ///
1203    /// let slice = v.into_boxed_slice();
1204    /// ```
1205    ///
1206    /// Any excess capacity is removed:
1207    ///
1208    /// ```
1209    /// let mut vec = Vec::with_capacity(10);
1210    /// vec.extend([1, 2, 3]);
1211    ///
1212    /// assert!(vec.capacity() >= 10);
1213    /// let slice = vec.into_boxed_slice();
1214    /// assert_eq!(slice.into_vec().capacity(), 3);
1215    /// ```
1216    #[cfg(not(no_global_oom_handling))]
1217    #[stable(feature = "rust1", since = "1.0.0")]
1218    pub fn into_boxed_slice(mut self) -> Box<[T], A> {
1219        unsafe {
1220            self.shrink_to_fit();
1221            let me = ManuallyDrop::new(self);
1222            let buf = ptr::read(&me.buf);
1223            let len = me.len();
1224            buf.into_box(len).assume_init()
1225        }
1226    }
1227
1228    /// Shortens the vector, keeping the first `len` elements and dropping
1229    /// the rest.
1230    ///
1231    /// If `len` is greater or equal to the vector's current length, this has
1232    /// no effect.
1233    ///
1234    /// The [`drain`] method can emulate `truncate`, but causes the excess
1235    /// elements to be returned instead of dropped.
1236    ///
1237    /// Note that this method has no effect on the allocated capacity
1238    /// of the vector.
1239    ///
1240    /// # Examples
1241    ///
1242    /// Truncating a five element vector to two elements:
1243    ///
1244    /// ```
1245    /// let mut vec = vec![1, 2, 3, 4, 5];
1246    /// vec.truncate(2);
1247    /// assert_eq!(vec, [1, 2]);
1248    /// ```
1249    ///
1250    /// No truncation occurs when `len` is greater than the vector's current
1251    /// length:
1252    ///
1253    /// ```
1254    /// let mut vec = vec![1, 2, 3];
1255    /// vec.truncate(8);
1256    /// assert_eq!(vec, [1, 2, 3]);
1257    /// ```
1258    ///
1259    /// Truncating when `len == 0` is equivalent to calling the [`clear`]
1260    /// method.
1261    ///
1262    /// ```
1263    /// let mut vec = vec![1, 2, 3];
1264    /// vec.truncate(0);
1265    /// assert_eq!(vec, []);
1266    /// ```
1267    ///
1268    /// [`clear`]: Vec::clear
1269    /// [`drain`]: Vec::drain
1270    #[stable(feature = "rust1", since = "1.0.0")]
1271    pub fn truncate(&mut self, len: usize) {
1272        // This is safe because:
1273        //
1274        // * the slice passed to `drop_in_place` is valid; the `len > self.len`
1275        //   case avoids creating an invalid slice, and
1276        // * the `len` of the vector is shrunk before calling `drop_in_place`,
1277        //   such that no value will be dropped twice in case `drop_in_place`
1278        //   were to panic once (if it panics twice, the program aborts).
1279        unsafe {
1280            // Note: It's intentional that this is `>` and not `>=`.
1281            //       Changing it to `>=` has negative performance
1282            //       implications in some cases. See #78884 for more.
1283            if len > self.len {
1284                return;
1285            }
1286            let remaining_len = self.len - len;
1287            let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
1288            self.len = len;
1289            ptr::drop_in_place(s);
1290        }
1291    }
1292
1293    /// Extracts a slice containing the entire vector.
1294    ///
1295    /// Equivalent to `&s[..]`.
1296    ///
1297    /// # Examples
1298    ///
1299    /// ```
1300    /// use std::io::{self, Write};
1301    /// let buffer = vec![1, 2, 3, 5, 8];
1302    /// io::sink().write(buffer.as_slice()).unwrap();
1303    /// ```
1304    #[inline]
1305    #[stable(feature = "vec_as_slice", since = "1.7.0")]
1306    pub fn as_slice(&self) -> &[T] {
1307        self
1308    }
1309
1310    /// Extracts a mutable slice of the entire vector.
1311    ///
1312    /// Equivalent to `&mut s[..]`.
1313    ///
1314    /// # Examples
1315    ///
1316    /// ```
1317    /// use std::io::{self, Read};
1318    /// let mut buffer = vec![0; 3];
1319    /// io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
1320    /// ```
1321    #[inline]
1322    #[stable(feature = "vec_as_slice", since = "1.7.0")]
1323    pub fn as_mut_slice(&mut self) -> &mut [T] {
1324        self
1325    }
1326
1327    /// Returns a raw pointer to the vector's buffer, or a dangling raw pointer
1328    /// valid for zero sized reads if the vector didn't allocate.
1329    ///
1330    /// The caller must ensure that the vector outlives the pointer this
1331    /// function returns, or else it will end up pointing to garbage.
1332    /// Modifying the vector may cause its buffer to be reallocated,
1333    /// which would also make any pointers to it invalid.
1334    ///
1335    /// The caller must also ensure that the memory the pointer (non-transitively) points to
1336    /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
1337    /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
1338    ///
1339    /// This method guarantees that for the purpose of the aliasing model, this method
1340    /// does not materialize a reference to the underlying slice, and thus the returned pointer
1341    /// will remain valid when mixed with other calls to [`as_ptr`] and [`as_mut_ptr`].
1342    /// Note that calling other methods that materialize mutable references to the slice,
1343    /// or mutable references to specific elements you are planning on accessing through this pointer,
1344    /// as well as writing to those elements, may still invalidate this pointer.
1345    /// See the second example below for how this guarantee can be used.
1346    ///
1347    ///
1348    /// # Examples
1349    ///
1350    /// ```
1351    /// let x = vec![1, 2, 4];
1352    /// let x_ptr = x.as_ptr();
1353    ///
1354    /// unsafe {
1355    ///     for i in 0..x.len() {
1356    ///         assert_eq!(*x_ptr.add(i), 1 << i);
1357    ///     }
1358    /// }
1359    /// ```
1360    ///
1361    /// Due to the aliasing guarantee, the following code is legal:
1362    ///
1363    /// ```rust
1364    /// unsafe {
1365    ///     let mut v = vec![0, 1, 2];
1366    ///     let ptr1 = v.as_ptr();
1367    ///     let _ = ptr1.read();
1368    ///     let ptr2 = v.as_mut_ptr().offset(2);
1369    ///     ptr2.write(2);
1370    ///     // Notably, the write to `ptr2` did *not* invalidate `ptr1`
1371    ///     // because it mutated a different element:
1372    ///     let _ = ptr1.read();
1373    /// }
1374    /// ```
1375    ///
1376    /// [`as_mut_ptr`]: Vec::as_mut_ptr
1377    /// [`as_ptr`]: Vec::as_ptr
1378    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
1379    #[cfg_attr(not(bootstrap), rustc_never_returns_null_ptr)]
1380    #[inline]
1381    pub fn as_ptr(&self) -> *const T {
1382        // We shadow the slice method of the same name to avoid going through
1383        // `deref`, which creates an intermediate reference.
1384        self.buf.ptr()
 
 
 
 
1385    }
1386
1387    /// Returns an unsafe mutable pointer to the vector's buffer, or a dangling
1388    /// raw pointer valid for zero sized reads if the vector didn't allocate.
1389    ///
1390    /// The caller must ensure that the vector outlives the pointer this
1391    /// function returns, or else it will end up pointing to garbage.
1392    /// Modifying the vector may cause its buffer to be reallocated,
1393    /// which would also make any pointers to it invalid.
1394    ///
1395    /// This method guarantees that for the purpose of the aliasing model, this method
1396    /// does not materialize a reference to the underlying slice, and thus the returned pointer
1397    /// will remain valid when mixed with other calls to [`as_ptr`] and [`as_mut_ptr`].
1398    /// Note that calling other methods that materialize references to the slice,
1399    /// or references to specific elements you are planning on accessing through this pointer,
1400    /// may still invalidate this pointer.
1401    /// See the second example below for how this guarantee can be used.
1402    ///
1403    ///
1404    /// # Examples
1405    ///
1406    /// ```
1407    /// // Allocate vector big enough for 4 elements.
1408    /// let size = 4;
1409    /// let mut x: Vec<i32> = Vec::with_capacity(size);
1410    /// let x_ptr = x.as_mut_ptr();
1411    ///
1412    /// // Initialize elements via raw pointer writes, then set length.
1413    /// unsafe {
1414    ///     for i in 0..size {
1415    ///         *x_ptr.add(i) = i as i32;
1416    ///     }
1417    ///     x.set_len(size);
1418    /// }
1419    /// assert_eq!(&*x, &[0, 1, 2, 3]);
1420    /// ```
1421    ///
1422    /// Due to the aliasing guarantee, the following code is legal:
1423    ///
1424    /// ```rust
1425    /// unsafe {
1426    ///     let mut v = vec![0];
1427    ///     let ptr1 = v.as_mut_ptr();
1428    ///     ptr1.write(1);
1429    ///     let ptr2 = v.as_mut_ptr();
1430    ///     ptr2.write(2);
1431    ///     // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
1432    ///     ptr1.write(3);
1433    /// }
1434    /// ```
1435    ///
1436    /// [`as_mut_ptr`]: Vec::as_mut_ptr
1437    /// [`as_ptr`]: Vec::as_ptr
1438    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
1439    #[cfg_attr(not(bootstrap), rustc_never_returns_null_ptr)]
1440    #[inline]
1441    pub fn as_mut_ptr(&mut self) -> *mut T {
1442        // We shadow the slice method of the same name to avoid going through
1443        // `deref_mut`, which creates an intermediate reference.
1444        self.buf.ptr()
 
 
 
 
1445    }
1446
1447    /// Returns a reference to the underlying allocator.
1448    #[unstable(feature = "allocator_api", issue = "32838")]
1449    #[inline]
1450    pub fn allocator(&self) -> &A {
1451        self.buf.allocator()
1452    }
1453
1454    /// Forces the length of the vector to `new_len`.
1455    ///
1456    /// This is a low-level operation that maintains none of the normal
1457    /// invariants of the type. Normally changing the length of a vector
1458    /// is done using one of the safe operations instead, such as
1459    /// [`truncate`], [`resize`], [`extend`], or [`clear`].
1460    ///
1461    /// [`truncate`]: Vec::truncate
1462    /// [`resize`]: Vec::resize
1463    /// [`extend`]: Extend::extend
1464    /// [`clear`]: Vec::clear
1465    ///
1466    /// # Safety
1467    ///
1468    /// - `new_len` must be less than or equal to [`capacity()`].
1469    /// - The elements at `old_len..new_len` must be initialized.
1470    ///
1471    /// [`capacity()`]: Vec::capacity
1472    ///
1473    /// # Examples
1474    ///
1475    /// This method can be useful for situations in which the vector
1476    /// is serving as a buffer for other code, particularly over FFI:
1477    ///
1478    /// ```no_run
1479    /// # #![allow(dead_code)]
1480    /// # // This is just a minimal skeleton for the doc example;
1481    /// # // don't use this as a starting point for a real library.
1482    /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void }
1483    /// # const Z_OK: i32 = 0;
1484    /// # extern "C" {
1485    /// #     fn deflateGetDictionary(
1486    /// #         strm: *mut std::ffi::c_void,
1487    /// #         dictionary: *mut u8,
1488    /// #         dictLength: *mut usize,
1489    /// #     ) -> i32;
1490    /// # }
1491    /// # impl StreamWrapper {
1492    /// pub fn get_dictionary(&self) -> Option<Vec<u8>> {
1493    ///     // Per the FFI method's docs, "32768 bytes is always enough".
1494    ///     let mut dict = Vec::with_capacity(32_768);
1495    ///     let mut dict_length = 0;
1496    ///     // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
1497    ///     // 1. `dict_length` elements were initialized.
1498    ///     // 2. `dict_length` <= the capacity (32_768)
1499    ///     // which makes `set_len` safe to call.
1500    ///     unsafe {
1501    ///         // Make the FFI call...
1502    ///         let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
1503    ///         if r == Z_OK {
1504    ///             // ...and update the length to what was initialized.
1505    ///             dict.set_len(dict_length);
1506    ///             Some(dict)
1507    ///         } else {
1508    ///             None
1509    ///         }
1510    ///     }
1511    /// }
1512    /// # }
1513    /// ```
1514    ///
1515    /// While the following example is sound, there is a memory leak since
1516    /// the inner vectors were not freed prior to the `set_len` call:
1517    ///
1518    /// ```
1519    /// let mut vec = vec![vec![1, 0, 0],
1520    ///                    vec![0, 1, 0],
1521    ///                    vec![0, 0, 1]];
1522    /// // SAFETY:
1523    /// // 1. `old_len..0` is empty so no elements need to be initialized.
1524    /// // 2. `0 <= capacity` always holds whatever `capacity` is.
1525    /// unsafe {
1526    ///     vec.set_len(0);
1527    /// }
1528    /// ```
1529    ///
1530    /// Normally, here, one would use [`clear`] instead to correctly drop
1531    /// the contents and thus not leak memory.
1532    #[inline]
1533    #[stable(feature = "rust1", since = "1.0.0")]
1534    pub unsafe fn set_len(&mut self, new_len: usize) {
1535        debug_assert!(new_len <= self.capacity());
1536
1537        self.len = new_len;
1538    }
1539
1540    /// Removes an element from the vector and returns it.
1541    ///
1542    /// The removed element is replaced by the last element of the vector.
1543    ///
1544    /// This does not preserve ordering, but is *O*(1).
1545    /// If you need to preserve the element order, use [`remove`] instead.
1546    ///
1547    /// [`remove`]: Vec::remove
1548    ///
1549    /// # Panics
1550    ///
1551    /// Panics if `index` is out of bounds.
1552    ///
1553    /// # Examples
1554    ///
1555    /// ```
1556    /// let mut v = vec!["foo", "bar", "baz", "qux"];
1557    ///
1558    /// assert_eq!(v.swap_remove(1), "bar");
1559    /// assert_eq!(v, ["foo", "qux", "baz"]);
1560    ///
1561    /// assert_eq!(v.swap_remove(0), "foo");
1562    /// assert_eq!(v, ["baz", "qux"]);
1563    /// ```
1564    #[inline]
1565    #[stable(feature = "rust1", since = "1.0.0")]
1566    pub fn swap_remove(&mut self, index: usize) -> T {
1567        #[cold]
1568        #[inline(never)]
1569        fn assert_failed(index: usize, len: usize) -> ! {
1570            panic!("swap_remove index (is {index}) should be < len (is {len})");
1571        }
1572
1573        let len = self.len();
1574        if index >= len {
1575            assert_failed(index, len);
1576        }
1577        unsafe {
1578            // We replace self[index] with the last element. Note that if the
1579            // bounds check above succeeds there must be a last element (which
1580            // can be self[index] itself).
1581            let value = ptr::read(self.as_ptr().add(index));
1582            let base_ptr = self.as_mut_ptr();
1583            ptr::copy(base_ptr.add(len - 1), base_ptr.add(index), 1);
1584            self.set_len(len - 1);
1585            value
1586        }
1587    }
1588
1589    /// Inserts an element at position `index` within the vector, shifting all
1590    /// elements after it to the right.
1591    ///
1592    /// # Panics
1593    ///
1594    /// Panics if `index > len`.
1595    ///
1596    /// # Examples
1597    ///
1598    /// ```
1599    /// let mut vec = vec![1, 2, 3];
1600    /// vec.insert(1, 4);
1601    /// assert_eq!(vec, [1, 4, 2, 3]);
1602    /// vec.insert(4, 5);
1603    /// assert_eq!(vec, [1, 4, 2, 3, 5]);
1604    /// ```
1605    #[cfg(not(no_global_oom_handling))]
1606    #[stable(feature = "rust1", since = "1.0.0")]
1607    pub fn insert(&mut self, index: usize, element: T) {
1608        #[cold]
1609        #[inline(never)]
1610        fn assert_failed(index: usize, len: usize) -> ! {
1611            panic!("insertion index (is {index}) should be <= len (is {len})");
1612        }
1613
1614        let len = self.len();
 
 
 
1615
1616        // space for the new element
1617        if len == self.buf.capacity() {
1618            self.reserve(1);
1619        }
1620
1621        unsafe {
1622            // infallible
1623            // The spot to put the new value
1624            {
1625                let p = self.as_mut_ptr().add(index);
1626                if index < len {
1627                    // Shift everything over to make space. (Duplicating the
1628                    // `index`th element into two consecutive places.)
1629                    ptr::copy(p, p.add(1), len - index);
1630                } else if index == len {
1631                    // No elements need shifting.
1632                } else {
1633                    assert_failed(index, len);
1634                }
1635                // Write it in, overwriting the first copy of the `index`th
1636                // element.
1637                ptr::write(p, element);
1638            }
1639            self.set_len(len + 1);
1640        }
1641    }
1642
1643    /// Removes and returns the element at position `index` within the vector,
1644    /// shifting all elements after it to the left.
1645    ///
1646    /// Note: Because this shifts over the remaining elements, it has a
1647    /// worst-case performance of *O*(*n*). If you don't need the order of elements
1648    /// to be preserved, use [`swap_remove`] instead. If you'd like to remove
1649    /// elements from the beginning of the `Vec`, consider using
1650    /// [`VecDeque::pop_front`] instead.
1651    ///
1652    /// [`swap_remove`]: Vec::swap_remove
1653    /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
1654    ///
1655    /// # Panics
1656    ///
1657    /// Panics if `index` is out of bounds.
1658    ///
1659    /// # Examples
1660    ///
1661    /// ```
1662    /// let mut v = vec![1, 2, 3];
1663    /// assert_eq!(v.remove(1), 2);
1664    /// assert_eq!(v, [1, 3]);
1665    /// ```
1666    #[stable(feature = "rust1", since = "1.0.0")]
1667    #[track_caller]
1668    pub fn remove(&mut self, index: usize) -> T {
1669        #[cold]
1670        #[inline(never)]
1671        #[track_caller]
1672        fn assert_failed(index: usize, len: usize) -> ! {
1673            panic!("removal index (is {index}) should be < len (is {len})");
1674        }
1675
1676        let len = self.len();
1677        if index >= len {
1678            assert_failed(index, len);
1679        }
1680        unsafe {
1681            // infallible
1682            let ret;
1683            {
1684                // the place we are taking from.
1685                let ptr = self.as_mut_ptr().add(index);
1686                // copy it out, unsafely having a copy of the value on
1687                // the stack and in the vector at the same time.
1688                ret = ptr::read(ptr);
1689
1690                // Shift everything down to fill in that spot.
1691                ptr::copy(ptr.add(1), ptr, len - index - 1);
1692            }
1693            self.set_len(len - 1);
1694            ret
1695        }
1696    }
1697
1698    /// Retains only the elements specified by the predicate.
1699    ///
1700    /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
1701    /// This method operates in place, visiting each element exactly once in the
1702    /// original order, and preserves the order of the retained elements.
1703    ///
1704    /// # Examples
1705    ///
1706    /// ```
1707    /// let mut vec = vec![1, 2, 3, 4];
1708    /// vec.retain(|&x| x % 2 == 0);
1709    /// assert_eq!(vec, [2, 4]);
1710    /// ```
1711    ///
1712    /// Because the elements are visited exactly once in the original order,
1713    /// external state may be used to decide which elements to keep.
1714    ///
1715    /// ```
1716    /// let mut vec = vec![1, 2, 3, 4, 5];
1717    /// let keep = [false, true, true, false, true];
1718    /// let mut iter = keep.iter();
1719    /// vec.retain(|_| *iter.next().unwrap());
1720    /// assert_eq!(vec, [2, 3, 5]);
1721    /// ```
1722    #[stable(feature = "rust1", since = "1.0.0")]
1723    pub fn retain<F>(&mut self, mut f: F)
1724    where
1725        F: FnMut(&T) -> bool,
1726    {
1727        self.retain_mut(|elem| f(elem));
1728    }
1729
1730    /// Retains only the elements specified by the predicate, passing a mutable reference to it.
1731    ///
1732    /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
1733    /// This method operates in place, visiting each element exactly once in the
1734    /// original order, and preserves the order of the retained elements.
1735    ///
1736    /// # Examples
1737    ///
1738    /// ```
1739    /// let mut vec = vec![1, 2, 3, 4];
1740    /// vec.retain_mut(|x| if *x <= 3 {
 
 
1741    ///     *x += 1;
1742    ///     true
1743    /// } else {
1744    ///     false
1745    /// });
1746    /// assert_eq!(vec, [2, 3, 4]);
1747    /// ```
1748    #[stable(feature = "vec_retain_mut", since = "1.61.0")]
1749    pub fn retain_mut<F>(&mut self, mut f: F)
1750    where
1751        F: FnMut(&mut T) -> bool,
1752    {
1753        let original_len = self.len();
1754        // Avoid double drop if the drop guard is not executed,
1755        // since we may make some holes during the process.
1756        unsafe { self.set_len(0) };
1757
1758        // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked]
1759        //      |<-              processed len   ->| ^- next to check
1760        //                  |<-  deleted cnt     ->|
1761        //      |<-              original_len                          ->|
1762        // Kept: Elements which predicate returns true on.
1763        // Hole: Moved or dropped element slot.
1764        // Unchecked: Unchecked valid elements.
1765        //
1766        // This drop guard will be invoked when predicate or `drop` of element panicked.
1767        // It shifts unchecked elements to cover holes and `set_len` to the correct length.
1768        // In cases when predicate and `drop` never panick, it will be optimized out.
1769        struct BackshiftOnDrop<'a, T, A: Allocator> {
1770            v: &'a mut Vec<T, A>,
1771            processed_len: usize,
1772            deleted_cnt: usize,
1773            original_len: usize,
1774        }
1775
1776        impl<T, A: Allocator> Drop for BackshiftOnDrop<'_, T, A> {
1777            fn drop(&mut self) {
1778                if self.deleted_cnt > 0 {
1779                    // SAFETY: Trailing unchecked items must be valid since we never touch them.
1780                    unsafe {
1781                        ptr::copy(
1782                            self.v.as_ptr().add(self.processed_len),
1783                            self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt),
1784                            self.original_len - self.processed_len,
1785                        );
1786                    }
1787                }
1788                // SAFETY: After filling holes, all items are in contiguous memory.
1789                unsafe {
1790                    self.v.set_len(self.original_len - self.deleted_cnt);
1791                }
1792            }
1793        }
1794
1795        let mut g = BackshiftOnDrop { v: self, processed_len: 0, deleted_cnt: 0, original_len };
1796
1797        fn process_loop<F, T, A: Allocator, const DELETED: bool>(
1798            original_len: usize,
1799            f: &mut F,
1800            g: &mut BackshiftOnDrop<'_, T, A>,
1801        ) where
1802            F: FnMut(&mut T) -> bool,
1803        {
1804            while g.processed_len != original_len {
1805                // SAFETY: Unchecked element must be valid.
1806                let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) };
1807                if !f(cur) {
1808                    // Advance early to avoid double drop if `drop_in_place` panicked.
1809                    g.processed_len += 1;
1810                    g.deleted_cnt += 1;
1811                    // SAFETY: We never touch this element again after dropped.
1812                    unsafe { ptr::drop_in_place(cur) };
1813                    // We already advanced the counter.
1814                    if DELETED {
1815                        continue;
1816                    } else {
1817                        break;
1818                    }
1819                }
1820                if DELETED {
1821                    // SAFETY: `deleted_cnt` > 0, so the hole slot must not overlap with current element.
1822                    // We use copy for move, and never touch this element again.
1823                    unsafe {
1824                        let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt);
1825                        ptr::copy_nonoverlapping(cur, hole_slot, 1);
1826                    }
1827                }
1828                g.processed_len += 1;
1829            }
1830        }
1831
1832        // Stage 1: Nothing was deleted.
1833        process_loop::<F, T, A, false>(original_len, &mut f, &mut g);
1834
1835        // Stage 2: Some elements were deleted.
1836        process_loop::<F, T, A, true>(original_len, &mut f, &mut g);
1837
1838        // All item are processed. This can be optimized to `set_len` by LLVM.
1839        drop(g);
1840    }
1841
1842    /// Removes all but the first of consecutive elements in the vector that resolve to the same
1843    /// key.
1844    ///
1845    /// If the vector is sorted, this removes all duplicates.
1846    ///
1847    /// # Examples
1848    ///
1849    /// ```
1850    /// let mut vec = vec![10, 20, 21, 30, 20];
1851    ///
1852    /// vec.dedup_by_key(|i| *i / 10);
1853    ///
1854    /// assert_eq!(vec, [10, 20, 30, 20]);
1855    /// ```
1856    #[stable(feature = "dedup_by", since = "1.16.0")]
1857    #[inline]
1858    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1859    where
1860        F: FnMut(&mut T) -> K,
1861        K: PartialEq,
1862    {
1863        self.dedup_by(|a, b| key(a) == key(b))
1864    }
1865
1866    /// Removes all but the first of consecutive elements in the vector satisfying a given equality
1867    /// relation.
1868    ///
1869    /// The `same_bucket` function is passed references to two elements from the vector and
1870    /// must determine if the elements compare equal. The elements are passed in opposite order
1871    /// from their order in the slice, so if `same_bucket(a, b)` returns `true`, `a` is removed.
1872    ///
1873    /// If the vector is sorted, this removes all duplicates.
1874    ///
1875    /// # Examples
1876    ///
1877    /// ```
1878    /// let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
1879    ///
1880    /// vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1881    ///
1882    /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
1883    /// ```
1884    #[stable(feature = "dedup_by", since = "1.16.0")]
1885    pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1886    where
1887        F: FnMut(&mut T, &mut T) -> bool,
1888    {
1889        let len = self.len();
1890        if len <= 1 {
1891            return;
1892        }
1893
1894        /* INVARIANT: vec.len() > read >= write > write-1 >= 0 */
1895        struct FillGapOnDrop<'a, T, A: core::alloc::Allocator> {
1896            /* Offset of the element we want to check if it is duplicate */
1897            read: usize,
1898
1899            /* Offset of the place where we want to place the non-duplicate
1900             * when we find it. */
1901            write: usize,
1902
1903            /* The Vec that would need correction if `same_bucket` panicked */
1904            vec: &'a mut Vec<T, A>,
1905        }
1906
1907        impl<'a, T, A: core::alloc::Allocator> Drop for FillGapOnDrop<'a, T, A> {
1908            fn drop(&mut self) {
1909                /* This code gets executed when `same_bucket` panics */
1910
1911                /* SAFETY: invariant guarantees that `read - write`
1912                 * and `len - read` never overflow and that the copy is always
1913                 * in-bounds. */
1914                unsafe {
1915                    let ptr = self.vec.as_mut_ptr();
1916                    let len = self.vec.len();
1917
1918                    /* How many items were left when `same_bucket` panicked.
1919                     * Basically vec[read..].len() */
1920                    let items_left = len.wrapping_sub(self.read);
1921
1922                    /* Pointer to first item in vec[write..write+items_left] slice */
1923                    let dropped_ptr = ptr.add(self.write);
1924                    /* Pointer to first item in vec[read..] slice */
1925                    let valid_ptr = ptr.add(self.read);
1926
1927                    /* Copy `vec[read..]` to `vec[write..write+items_left]`.
1928                     * The slices can overlap, so `copy_nonoverlapping` cannot be used */
1929                    ptr::copy(valid_ptr, dropped_ptr, items_left);
1930
1931                    /* How many items have been already dropped
1932                     * Basically vec[read..write].len() */
1933                    let dropped = self.read.wrapping_sub(self.write);
1934
1935                    self.vec.set_len(len - dropped);
1936                }
1937            }
1938        }
1939
1940        let mut gap = FillGapOnDrop { read: 1, write: 1, vec: self };
1941        let ptr = gap.vec.as_mut_ptr();
1942
1943        /* Drop items while going through Vec, it should be more efficient than
1944         * doing slice partition_dedup + truncate */
1945
1946        /* SAFETY: Because of the invariant, read_ptr, prev_ptr and write_ptr
1947         * are always in-bounds and read_ptr never aliases prev_ptr */
1948        unsafe {
1949            while gap.read < len {
1950                let read_ptr = ptr.add(gap.read);
1951                let prev_ptr = ptr.add(gap.write.wrapping_sub(1));
1952
1953                if same_bucket(&mut *read_ptr, &mut *prev_ptr) {
1954                    // Increase `gap.read` now since the drop may panic.
1955                    gap.read += 1;
1956                    /* We have found duplicate, drop it in-place */
1957                    ptr::drop_in_place(read_ptr);
1958                } else {
1959                    let write_ptr = ptr.add(gap.write);
1960
1961                    /* Because `read_ptr` can be equal to `write_ptr`, we either
1962                     * have to use `copy` or conditional `copy_nonoverlapping`.
1963                     * Looks like the first option is faster. */
1964                    ptr::copy(read_ptr, write_ptr, 1);
1965
1966                    /* We have filled that place, so go further */
1967                    gap.write += 1;
1968                    gap.read += 1;
1969                }
1970            }
1971
1972            /* Technically we could let `gap` clean up with its Drop, but
1973             * when `same_bucket` is guaranteed to not panic, this bloats a little
1974             * the codegen, so we just do it manually */
1975            gap.vec.set_len(gap.write);
1976            mem::forget(gap);
1977        }
1978    }
1979
1980    /// Appends an element to the back of a collection.
1981    ///
1982    /// # Panics
1983    ///
1984    /// Panics if the new capacity exceeds `isize::MAX` bytes.
1985    ///
1986    /// # Examples
1987    ///
1988    /// ```
1989    /// let mut vec = vec![1, 2];
1990    /// vec.push(3);
1991    /// assert_eq!(vec, [1, 2, 3]);
1992    /// ```
1993    #[cfg(not(no_global_oom_handling))]
1994    #[inline]
1995    #[stable(feature = "rust1", since = "1.0.0")]
1996    pub fn push(&mut self, value: T) {
1997        // This will panic or abort if we would allocate > isize::MAX bytes
1998        // or if the length increment would overflow for zero-sized types.
1999        if self.len == self.buf.capacity() {
2000            self.buf.reserve_for_push(self.len);
2001        }
2002        unsafe {
2003            let end = self.as_mut_ptr().add(self.len);
2004            ptr::write(end, value);
2005            self.len += 1;
2006        }
2007    }
2008
2009    /// Tries to append an element to the back of a collection.
2010    ///
2011    /// # Examples
2012    ///
2013    /// ```
2014    /// let mut vec = vec![1, 2];
2015    /// vec.try_push(3).unwrap();
2016    /// assert_eq!(vec, [1, 2, 3]);
2017    /// ```
2018    #[inline]
2019    #[stable(feature = "kernel", since = "1.0.0")]
2020    pub fn try_push(&mut self, value: T) -> Result<(), TryReserveError> {
2021        if self.len == self.buf.capacity() {
2022            self.buf.try_reserve_for_push(self.len)?;
2023        }
2024        unsafe {
2025            let end = self.as_mut_ptr().add(self.len);
2026            ptr::write(end, value);
2027            self.len += 1;
2028        }
2029        Ok(())
2030    }
2031
2032    /// Appends an element if there is sufficient spare capacity, otherwise an error is returned
2033    /// with the element.
2034    ///
2035    /// Unlike [`push`] this method will not reallocate when there's insufficient capacity.
2036    /// The caller should use [`reserve`] or [`try_reserve`] to ensure that there is enough capacity.
2037    ///
2038    /// [`push`]: Vec::push
2039    /// [`reserve`]: Vec::reserve
2040    /// [`try_reserve`]: Vec::try_reserve
2041    ///
2042    /// # Examples
2043    ///
2044    /// A manual, panic-free alternative to [`FromIterator`]:
2045    ///
2046    /// ```
2047    /// #![feature(vec_push_within_capacity)]
2048    ///
2049    /// use std::collections::TryReserveError;
2050    /// fn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {
2051    ///     let mut vec = Vec::new();
2052    ///     for value in iter {
2053    ///         if let Err(value) = vec.push_within_capacity(value) {
2054    ///             vec.try_reserve(1)?;
2055    ///             // this cannot fail, the previous line either returned or added at least 1 free slot
2056    ///             let _ = vec.push_within_capacity(value);
2057    ///         }
2058    ///     }
2059    ///     Ok(vec)
2060    /// }
2061    /// assert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
2062    /// ```
2063    #[inline]
2064    #[unstable(feature = "vec_push_within_capacity", issue = "100486")]
2065    pub fn push_within_capacity(&mut self, value: T) -> Result<(), T> {
2066        if self.len == self.buf.capacity() {
2067            return Err(value);
2068        }
2069        unsafe {
2070            let end = self.as_mut_ptr().add(self.len);
2071            ptr::write(end, value);
2072            self.len += 1;
2073        }
2074        Ok(())
2075    }
2076
2077    /// Removes the last element from a vector and returns it, or [`None`] if it
2078    /// is empty.
2079    ///
2080    /// If you'd like to pop the first element, consider using
2081    /// [`VecDeque::pop_front`] instead.
2082    ///
2083    /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
2084    ///
2085    /// # Examples
2086    ///
2087    /// ```
2088    /// let mut vec = vec![1, 2, 3];
2089    /// assert_eq!(vec.pop(), Some(3));
2090    /// assert_eq!(vec, [1, 2]);
2091    /// ```
2092    #[inline]
2093    #[stable(feature = "rust1", since = "1.0.0")]
2094    pub fn pop(&mut self) -> Option<T> {
2095        if self.len == 0 {
2096            None
2097        } else {
2098            unsafe {
2099                self.len -= 1;
2100                Some(ptr::read(self.as_ptr().add(self.len())))
2101            }
2102        }
2103    }
2104
2105    /// Moves all the elements of `other` into `self`, leaving `other` empty.
2106    ///
2107    /// # Panics
2108    ///
2109    /// Panics if the new capacity exceeds `isize::MAX` bytes.
2110    ///
2111    /// # Examples
2112    ///
2113    /// ```
2114    /// let mut vec = vec![1, 2, 3];
2115    /// let mut vec2 = vec![4, 5, 6];
2116    /// vec.append(&mut vec2);
2117    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
2118    /// assert_eq!(vec2, []);
2119    /// ```
2120    #[cfg(not(no_global_oom_handling))]
2121    #[inline]
2122    #[stable(feature = "append", since = "1.4.0")]
2123    pub fn append(&mut self, other: &mut Self) {
2124        unsafe {
2125            self.append_elements(other.as_slice() as _);
2126            other.set_len(0);
2127        }
2128    }
2129
2130    /// Appends elements to `self` from other buffer.
2131    #[cfg(not(no_global_oom_handling))]
2132    #[inline]
2133    unsafe fn append_elements(&mut self, other: *const [T]) {
2134        let count = unsafe { (*other).len() };
2135        self.reserve(count);
2136        let len = self.len();
2137        unsafe { ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count) };
2138        self.len += count;
2139    }
2140
2141    /// Tries to append elements to `self` from other buffer.
2142    #[inline]
2143    unsafe fn try_append_elements(&mut self, other: *const [T]) -> Result<(), TryReserveError> {
2144        let count = unsafe { (*other).len() };
2145        self.try_reserve(count)?;
2146        let len = self.len();
2147        unsafe { ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count) };
2148        self.len += count;
2149        Ok(())
2150    }
2151
2152    /// Removes the specified range from the vector in bulk, returning all
2153    /// removed elements as an iterator. If the iterator is dropped before
2154    /// being fully consumed, it drops the remaining removed elements.
2155    ///
2156    /// The returned iterator keeps a mutable borrow on the vector to optimize
2157    /// its implementation.
2158    ///
2159    /// # Panics
2160    ///
2161    /// Panics if the starting point is greater than the end point or if
2162    /// the end point is greater than the length of the vector.
2163    ///
2164    /// # Leaking
2165    ///
2166    /// If the returned iterator goes out of scope without being dropped (due to
2167    /// [`mem::forget`], for example), the vector may have lost and leaked
2168    /// elements arbitrarily, including elements outside the range.
2169    ///
2170    /// # Examples
2171    ///
2172    /// ```
2173    /// let mut v = vec![1, 2, 3];
2174    /// let u: Vec<_> = v.drain(1..).collect();
2175    /// assert_eq!(v, &[1]);
2176    /// assert_eq!(u, &[2, 3]);
2177    ///
2178    /// // A full range clears the vector, like `clear()` does
2179    /// v.drain(..);
2180    /// assert_eq!(v, &[]);
2181    /// ```
2182    #[stable(feature = "drain", since = "1.6.0")]
2183    pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
2184    where
2185        R: RangeBounds<usize>,
2186    {
2187        // Memory safety
2188        //
2189        // When the Drain is first created, it shortens the length of
2190        // the source vector to make sure no uninitialized or moved-from elements
2191        // are accessible at all if the Drain's destructor never gets to run.
2192        //
2193        // Drain will ptr::read out the values to remove.
2194        // When finished, remaining tail of the vec is copied back to cover
2195        // the hole, and the vector length is restored to the new length.
2196        //
2197        let len = self.len();
2198        let Range { start, end } = slice::range(range, ..len);
2199
2200        unsafe {
2201            // set self.vec length's to start, to be safe in case Drain is leaked
2202            self.set_len(start);
2203            let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
 
 
2204            Drain {
2205                tail_start: end,
2206                tail_len: len - end,
2207                iter: range_slice.iter(),
2208                vec: NonNull::from(self),
2209            }
2210        }
2211    }
2212
2213    /// Clears the vector, removing all values.
2214    ///
2215    /// Note that this method has no effect on the allocated capacity
2216    /// of the vector.
2217    ///
2218    /// # Examples
2219    ///
2220    /// ```
2221    /// let mut v = vec![1, 2, 3];
2222    ///
2223    /// v.clear();
2224    ///
2225    /// assert!(v.is_empty());
2226    /// ```
2227    #[inline]
2228    #[stable(feature = "rust1", since = "1.0.0")]
2229    pub fn clear(&mut self) {
2230        let elems: *mut [T] = self.as_mut_slice();
2231
2232        // SAFETY:
2233        // - `elems` comes directly from `as_mut_slice` and is therefore valid.
2234        // - Setting `self.len` before calling `drop_in_place` means that,
2235        //   if an element's `Drop` impl panics, the vector's `Drop` impl will
2236        //   do nothing (leaking the rest of the elements) instead of dropping
2237        //   some twice.
2238        unsafe {
2239            self.len = 0;
2240            ptr::drop_in_place(elems);
2241        }
2242    }
2243
2244    /// Returns the number of elements in the vector, also referred to
2245    /// as its 'length'.
2246    ///
2247    /// # Examples
2248    ///
2249    /// ```
2250    /// let a = vec![1, 2, 3];
2251    /// assert_eq!(a.len(), 3);
2252    /// ```
2253    #[inline]
2254    #[stable(feature = "rust1", since = "1.0.0")]
2255    pub fn len(&self) -> usize {
2256        self.len
2257    }
2258
2259    /// Returns `true` if the vector contains no elements.
2260    ///
2261    /// # Examples
2262    ///
2263    /// ```
2264    /// let mut v = Vec::new();
2265    /// assert!(v.is_empty());
2266    ///
2267    /// v.push(1);
2268    /// assert!(!v.is_empty());
2269    /// ```
2270    #[stable(feature = "rust1", since = "1.0.0")]
2271    pub fn is_empty(&self) -> bool {
2272        self.len() == 0
2273    }
2274
2275    /// Splits the collection into two at the given index.
2276    ///
2277    /// Returns a newly allocated vector containing the elements in the range
2278    /// `[at, len)`. After the call, the original vector will be left containing
2279    /// the elements `[0, at)` with its previous capacity unchanged.
2280    ///
2281    /// # Panics
2282    ///
2283    /// Panics if `at > len`.
2284    ///
2285    /// # Examples
2286    ///
2287    /// ```
2288    /// let mut vec = vec![1, 2, 3];
2289    /// let vec2 = vec.split_off(1);
2290    /// assert_eq!(vec, [1]);
2291    /// assert_eq!(vec2, [2, 3]);
2292    /// ```
2293    #[cfg(not(no_global_oom_handling))]
2294    #[inline]
2295    #[must_use = "use `.truncate()` if you don't need the other half"]
2296    #[stable(feature = "split_off", since = "1.4.0")]
2297    pub fn split_off(&mut self, at: usize) -> Self
2298    where
2299        A: Clone,
2300    {
2301        #[cold]
2302        #[inline(never)]
2303        fn assert_failed(at: usize, len: usize) -> ! {
2304            panic!("`at` split index (is {at}) should be <= len (is {len})");
2305        }
2306
2307        if at > self.len() {
2308            assert_failed(at, self.len());
2309        }
2310
2311        if at == 0 {
2312            // the new vector can take over the original buffer and avoid the copy
2313            return mem::replace(
2314                self,
2315                Vec::with_capacity_in(self.capacity(), self.allocator().clone()),
2316            );
2317        }
2318
2319        let other_len = self.len - at;
2320        let mut other = Vec::with_capacity_in(other_len, self.allocator().clone());
2321
2322        // Unsafely `set_len` and copy items to `other`.
2323        unsafe {
2324            self.set_len(at);
2325            other.set_len(other_len);
2326
2327            ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len());
2328        }
2329        other
2330    }
2331
2332    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
2333    ///
2334    /// If `new_len` is greater than `len`, the `Vec` is extended by the
2335    /// difference, with each additional slot filled with the result of
2336    /// calling the closure `f`. The return values from `f` will end up
2337    /// in the `Vec` in the order they have been generated.
2338    ///
2339    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
2340    ///
2341    /// This method uses a closure to create new values on every push. If
2342    /// you'd rather [`Clone`] a given value, use [`Vec::resize`]. If you
2343    /// want to use the [`Default`] trait to generate values, you can
2344    /// pass [`Default::default`] as the second argument.
2345    ///
2346    /// # Examples
2347    ///
2348    /// ```
2349    /// let mut vec = vec![1, 2, 3];
2350    /// vec.resize_with(5, Default::default);
2351    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
2352    ///
2353    /// let mut vec = vec![];
2354    /// let mut p = 1;
2355    /// vec.resize_with(4, || { p *= 2; p });
2356    /// assert_eq!(vec, [2, 4, 8, 16]);
2357    /// ```
2358    #[cfg(not(no_global_oom_handling))]
2359    #[stable(feature = "vec_resize_with", since = "1.33.0")]
2360    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
2361    where
2362        F: FnMut() -> T,
2363    {
2364        let len = self.len();
2365        if new_len > len {
2366            self.extend_trusted(iter::repeat_with(f).take(new_len - len));
2367        } else {
2368            self.truncate(new_len);
2369        }
2370    }
2371
2372    /// Consumes and leaks the `Vec`, returning a mutable reference to the contents,
2373    /// `&'a mut [T]`. Note that the type `T` must outlive the chosen lifetime
2374    /// `'a`. If the type has only static references, or none at all, then this
2375    /// may be chosen to be `'static`.
2376    ///
2377    /// As of Rust 1.57, this method does not reallocate or shrink the `Vec`,
2378    /// so the leaked allocation may include unused capacity that is not part
2379    /// of the returned slice.
2380    ///
2381    /// This function is mainly useful for data that lives for the remainder of
2382    /// the program's life. Dropping the returned reference will cause a memory
2383    /// leak.
2384    ///
2385    /// # Examples
2386    ///
2387    /// Simple usage:
2388    ///
2389    /// ```
2390    /// let x = vec![1, 2, 3];
2391    /// let static_ref: &'static mut [usize] = x.leak();
2392    /// static_ref[0] += 1;
2393    /// assert_eq!(static_ref, &[2, 2, 3]);
2394    /// ```
 
2395    #[stable(feature = "vec_leak", since = "1.47.0")]
2396    #[inline]
2397    pub fn leak<'a>(self) -> &'a mut [T]
2398    where
2399        A: 'a,
2400    {
2401        let mut me = ManuallyDrop::new(self);
2402        unsafe { slice::from_raw_parts_mut(me.as_mut_ptr(), me.len) }
2403    }
2404
2405    /// Returns the remaining spare capacity of the vector as a slice of
2406    /// `MaybeUninit<T>`.
2407    ///
2408    /// The returned slice can be used to fill the vector with data (e.g. by
2409    /// reading from a file) before marking the data as initialized using the
2410    /// [`set_len`] method.
2411    ///
2412    /// [`set_len`]: Vec::set_len
2413    ///
2414    /// # Examples
2415    ///
2416    /// ```
2417    /// // Allocate vector big enough for 10 elements.
2418    /// let mut v = Vec::with_capacity(10);
2419    ///
2420    /// // Fill in the first 3 elements.
2421    /// let uninit = v.spare_capacity_mut();
2422    /// uninit[0].write(0);
2423    /// uninit[1].write(1);
2424    /// uninit[2].write(2);
2425    ///
2426    /// // Mark the first 3 elements of the vector as being initialized.
2427    /// unsafe {
2428    ///     v.set_len(3);
2429    /// }
2430    ///
2431    /// assert_eq!(&v, &[0, 1, 2]);
2432    /// ```
2433    #[stable(feature = "vec_spare_capacity", since = "1.60.0")]
2434    #[inline]
2435    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
2436        // Note:
2437        // This method is not implemented in terms of `split_at_spare_mut`,
2438        // to prevent invalidation of pointers to the buffer.
2439        unsafe {
2440            slice::from_raw_parts_mut(
2441                self.as_mut_ptr().add(self.len) as *mut MaybeUninit<T>,
2442                self.buf.capacity() - self.len,
2443            )
2444        }
2445    }
2446
2447    /// Returns vector content as a slice of `T`, along with the remaining spare
2448    /// capacity of the vector as a slice of `MaybeUninit<T>`.
2449    ///
2450    /// The returned spare capacity slice can be used to fill the vector with data
2451    /// (e.g. by reading from a file) before marking the data as initialized using
2452    /// the [`set_len`] method.
2453    ///
2454    /// [`set_len`]: Vec::set_len
2455    ///
2456    /// Note that this is a low-level API, which should be used with care for
2457    /// optimization purposes. If you need to append data to a `Vec`
2458    /// you can use [`push`], [`extend`], [`extend_from_slice`],
2459    /// [`extend_from_within`], [`insert`], [`append`], [`resize`] or
2460    /// [`resize_with`], depending on your exact needs.
2461    ///
2462    /// [`push`]: Vec::push
2463    /// [`extend`]: Vec::extend
2464    /// [`extend_from_slice`]: Vec::extend_from_slice
2465    /// [`extend_from_within`]: Vec::extend_from_within
2466    /// [`insert`]: Vec::insert
2467    /// [`append`]: Vec::append
2468    /// [`resize`]: Vec::resize
2469    /// [`resize_with`]: Vec::resize_with
2470    ///
2471    /// # Examples
2472    ///
2473    /// ```
2474    /// #![feature(vec_split_at_spare)]
2475    ///
2476    /// let mut v = vec![1, 1, 2];
2477    ///
2478    /// // Reserve additional space big enough for 10 elements.
2479    /// v.reserve(10);
2480    ///
2481    /// let (init, uninit) = v.split_at_spare_mut();
2482    /// let sum = init.iter().copied().sum::<u32>();
2483    ///
2484    /// // Fill in the next 4 elements.
2485    /// uninit[0].write(sum);
2486    /// uninit[1].write(sum * 2);
2487    /// uninit[2].write(sum * 3);
2488    /// uninit[3].write(sum * 4);
2489    ///
2490    /// // Mark the 4 elements of the vector as being initialized.
2491    /// unsafe {
2492    ///     let len = v.len();
2493    ///     v.set_len(len + 4);
2494    /// }
2495    ///
2496    /// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
2497    /// ```
2498    #[unstable(feature = "vec_split_at_spare", issue = "81944")]
2499    #[inline]
2500    pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
2501        // SAFETY:
2502        // - len is ignored and so never changed
2503        let (init, spare, _) = unsafe { self.split_at_spare_mut_with_len() };
2504        (init, spare)
2505    }
2506
2507    /// Safety: changing returned .2 (&mut usize) is considered the same as calling `.set_len(_)`.
2508    ///
2509    /// This method provides unique access to all vec parts at once in `extend_from_within`.
2510    unsafe fn split_at_spare_mut_with_len(
2511        &mut self,
2512    ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
2513        let ptr = self.as_mut_ptr();
2514        // SAFETY:
2515        // - `ptr` is guaranteed to be valid for `self.len` elements
2516        // - but the allocation extends out to `self.buf.capacity()` elements, possibly
2517        // uninitialized
2518        let spare_ptr = unsafe { ptr.add(self.len) };
2519        let spare_ptr = spare_ptr.cast::<MaybeUninit<T>>();
2520        let spare_len = self.buf.capacity() - self.len;
2521
2522        // SAFETY:
2523        // - `ptr` is guaranteed to be valid for `self.len` elements
2524        // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized`
2525        unsafe {
2526            let initialized = slice::from_raw_parts_mut(ptr, self.len);
2527            let spare = slice::from_raw_parts_mut(spare_ptr, spare_len);
2528
2529            (initialized, spare, &mut self.len)
2530        }
2531    }
2532}
2533
2534impl<T: Clone, A: Allocator> Vec<T, A> {
2535    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
2536    ///
2537    /// If `new_len` is greater than `len`, the `Vec` is extended by the
2538    /// difference, with each additional slot filled with `value`.
2539    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
2540    ///
2541    /// This method requires `T` to implement [`Clone`],
2542    /// in order to be able to clone the passed value.
2543    /// If you need more flexibility (or want to rely on [`Default`] instead of
2544    /// [`Clone`]), use [`Vec::resize_with`].
2545    /// If you only need to resize to a smaller size, use [`Vec::truncate`].
2546    ///
2547    /// # Examples
2548    ///
2549    /// ```
2550    /// let mut vec = vec!["hello"];
2551    /// vec.resize(3, "world");
2552    /// assert_eq!(vec, ["hello", "world", "world"]);
2553    ///
2554    /// let mut vec = vec![1, 2, 3, 4];
2555    /// vec.resize(2, 0);
2556    /// assert_eq!(vec, [1, 2]);
2557    /// ```
2558    #[cfg(not(no_global_oom_handling))]
2559    #[stable(feature = "vec_resize", since = "1.5.0")]
2560    pub fn resize(&mut self, new_len: usize, value: T) {
2561        let len = self.len();
2562
2563        if new_len > len {
2564            self.extend_with(new_len - len, value)
2565        } else {
2566            self.truncate(new_len);
2567        }
2568    }
2569
2570    /// Tries to resize the `Vec` in-place so that `len` is equal to `new_len`.
2571    ///
2572    /// If `new_len` is greater than `len`, the `Vec` is extended by the
2573    /// difference, with each additional slot filled with `value`.
2574    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
2575    ///
2576    /// This method requires `T` to implement [`Clone`],
2577    /// in order to be able to clone the passed value.
2578    /// If you need more flexibility (or want to rely on [`Default`] instead of
2579    /// [`Clone`]), use [`Vec::resize_with`].
2580    /// If you only need to resize to a smaller size, use [`Vec::truncate`].
2581    ///
2582    /// # Examples
2583    ///
2584    /// ```
2585    /// let mut vec = vec!["hello"];
2586    /// vec.try_resize(3, "world").unwrap();
2587    /// assert_eq!(vec, ["hello", "world", "world"]);
2588    ///
2589    /// let mut vec = vec![1, 2, 3, 4];
2590    /// vec.try_resize(2, 0).unwrap();
2591    /// assert_eq!(vec, [1, 2]);
2592    ///
2593    /// let mut vec = vec![42];
2594    /// let result = vec.try_resize(usize::MAX, 0);
2595    /// assert!(result.is_err());
2596    /// ```
2597    #[stable(feature = "kernel", since = "1.0.0")]
2598    pub fn try_resize(&mut self, new_len: usize, value: T) -> Result<(), TryReserveError> {
2599        let len = self.len();
2600
2601        if new_len > len {
2602            self.try_extend_with(new_len - len, value)
2603        } else {
2604            self.truncate(new_len);
2605            Ok(())
2606        }
2607    }
2608
2609    /// Clones and appends all elements in a slice to the `Vec`.
2610    ///
2611    /// Iterates over the slice `other`, clones each element, and then appends
2612    /// it to this `Vec`. The `other` slice is traversed in-order.
2613    ///
2614    /// Note that this function is same as [`extend`] except that it is
2615    /// specialized to work with slices instead. If and when Rust gets
2616    /// specialization this function will likely be deprecated (but still
2617    /// available).
2618    ///
2619    /// # Examples
2620    ///
2621    /// ```
2622    /// let mut vec = vec![1];
2623    /// vec.extend_from_slice(&[2, 3, 4]);
2624    /// assert_eq!(vec, [1, 2, 3, 4]);
2625    /// ```
2626    ///
2627    /// [`extend`]: Vec::extend
2628    #[cfg(not(no_global_oom_handling))]
2629    #[stable(feature = "vec_extend_from_slice", since = "1.6.0")]
2630    pub fn extend_from_slice(&mut self, other: &[T]) {
2631        self.spec_extend(other.iter())
2632    }
2633
2634    /// Tries to clone and append all elements in a slice to the `Vec`.
2635    ///
2636    /// Iterates over the slice `other`, clones each element, and then appends
2637    /// it to this `Vec`. The `other` slice is traversed in-order.
2638    ///
2639    /// Note that this function is same as [`extend`] except that it is
2640    /// specialized to work with slices instead. If and when Rust gets
2641    /// specialization this function will likely be deprecated (but still
2642    /// available).
2643    ///
2644    /// # Examples
2645    ///
2646    /// ```
2647    /// let mut vec = vec![1];
2648    /// vec.try_extend_from_slice(&[2, 3, 4]).unwrap();
2649    /// assert_eq!(vec, [1, 2, 3, 4]);
2650    /// ```
2651    ///
2652    /// [`extend`]: Vec::extend
2653    #[stable(feature = "kernel", since = "1.0.0")]
2654    pub fn try_extend_from_slice(&mut self, other: &[T]) -> Result<(), TryReserveError> {
2655        self.try_spec_extend(other.iter())
2656    }
2657
2658    /// Copies elements from `src` range to the end of the vector.
2659    ///
2660    /// # Panics
2661    ///
2662    /// Panics if the starting point is greater than the end point or if
2663    /// the end point is greater than the length of the vector.
2664    ///
2665    /// # Examples
2666    ///
2667    /// ```
2668    /// let mut vec = vec![0, 1, 2, 3, 4];
2669    ///
2670    /// vec.extend_from_within(2..);
2671    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
2672    ///
2673    /// vec.extend_from_within(..2);
2674    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
2675    ///
2676    /// vec.extend_from_within(4..8);
2677    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
2678    /// ```
2679    #[cfg(not(no_global_oom_handling))]
2680    #[stable(feature = "vec_extend_from_within", since = "1.53.0")]
2681    pub fn extend_from_within<R>(&mut self, src: R)
2682    where
2683        R: RangeBounds<usize>,
2684    {
2685        let range = slice::range(src, ..self.len());
2686        self.reserve(range.len());
2687
2688        // SAFETY:
2689        // - `slice::range` guarantees that the given range is valid for indexing self
2690        unsafe {
2691            self.spec_extend_from_within(range);
2692        }
2693    }
2694}
2695
2696impl<T, A: Allocator, const N: usize> Vec<[T; N], A> {
2697    /// Takes a `Vec<[T; N]>` and flattens it into a `Vec<T>`.
2698    ///
2699    /// # Panics
2700    ///
2701    /// Panics if the length of the resulting vector would overflow a `usize`.
2702    ///
2703    /// This is only possible when flattening a vector of arrays of zero-sized
2704    /// types, and thus tends to be irrelevant in practice. If
2705    /// `size_of::<T>() > 0`, this will never panic.
2706    ///
2707    /// # Examples
2708    ///
2709    /// ```
2710    /// #![feature(slice_flatten)]
2711    ///
2712    /// let mut vec = vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]];
2713    /// assert_eq!(vec.pop(), Some([7, 8, 9]));
2714    ///
2715    /// let mut flattened = vec.into_flattened();
2716    /// assert_eq!(flattened.pop(), Some(6));
2717    /// ```
2718    #[unstable(feature = "slice_flatten", issue = "95629")]
2719    pub fn into_flattened(self) -> Vec<T, A> {
2720        let (ptr, len, cap, alloc) = self.into_raw_parts_with_alloc();
2721        let (new_len, new_cap) = if T::IS_ZST {
2722            (len.checked_mul(N).expect("vec len overflow"), usize::MAX)
2723        } else {
2724            // SAFETY:
2725            // - `cap * N` cannot overflow because the allocation is already in
2726            // the address space.
2727            // - Each `[T; N]` has `N` valid elements, so there are `len * N`
2728            // valid elements in the allocation.
2729            unsafe { (len.unchecked_mul(N), cap.unchecked_mul(N)) }
2730        };
2731        // SAFETY:
2732        // - `ptr` was allocated by `self`
2733        // - `ptr` is well-aligned because `[T; N]` has the same alignment as `T`.
2734        // - `new_cap` refers to the same sized allocation as `cap` because
2735        // `new_cap * size_of::<T>()` == `cap * size_of::<[T; N]>()`
2736        // - `len` <= `cap`, so `len * N` <= `cap * N`.
2737        unsafe { Vec::<T, A>::from_raw_parts_in(ptr.cast(), new_len, new_cap, alloc) }
2738    }
2739}
2740
2741impl<T: Clone, A: Allocator> Vec<T, A> {
2742    #[cfg(not(no_global_oom_handling))]
2743    /// Extend the vector by `n` clones of value.
2744    fn extend_with(&mut self, n: usize, value: T) {
2745        self.reserve(n);
2746
2747        unsafe {
2748            let mut ptr = self.as_mut_ptr().add(self.len());
2749            // Use SetLenOnDrop to work around bug where compiler
2750            // might not realize the store through `ptr` through self.set_len()
2751            // don't alias.
2752            let mut local_len = SetLenOnDrop::new(&mut self.len);
2753
2754            // Write all elements except the last one
2755            for _ in 1..n {
2756                ptr::write(ptr, value.clone());
2757                ptr = ptr.add(1);
2758                // Increment the length in every step in case clone() panics
2759                local_len.increment_len(1);
2760            }
2761
2762            if n > 0 {
2763                // We can write the last element directly without cloning needlessly
2764                ptr::write(ptr, value);
2765                local_len.increment_len(1);
2766            }
 
 
 
 
2767
2768            // len set by scope guard
2769        }
 
 
 
 
 
2770    }
 
2771
2772    /// Try to extend the vector by `n` clones of value.
2773    fn try_extend_with(&mut self, n: usize, value: T) -> Result<(), TryReserveError> {
2774        self.try_reserve(n)?;
 
 
2775
2776        unsafe {
2777            let mut ptr = self.as_mut_ptr().add(self.len());
2778            // Use SetLenOnDrop to work around bug where compiler
2779            // might not realize the store through `ptr` through self.set_len()
2780            // don't alias.
2781            let mut local_len = SetLenOnDrop::new(&mut self.len);
2782
2783            // Write all elements except the last one
2784            for _ in 1..n {
2785                ptr::write(ptr, value.clone());
2786                ptr = ptr.add(1);
2787                // Increment the length in every step in case clone() panics
2788                local_len.increment_len(1);
2789            }
2790
2791            if n > 0 {
2792                // We can write the last element directly without cloning needlessly
2793                ptr::write(ptr, value);
2794                local_len.increment_len(1);
2795            }
2796
2797            // len set by scope guard
2798            Ok(())
2799        }
2800    }
2801}
2802
2803impl<T: PartialEq, A: Allocator> Vec<T, A> {
2804    /// Removes consecutive repeated elements in the vector according to the
2805    /// [`PartialEq`] trait implementation.
2806    ///
2807    /// If the vector is sorted, this removes all duplicates.
2808    ///
2809    /// # Examples
2810    ///
2811    /// ```
2812    /// let mut vec = vec![1, 2, 2, 3, 2];
2813    ///
2814    /// vec.dedup();
2815    ///
2816    /// assert_eq!(vec, [1, 2, 3, 2]);
2817    /// ```
2818    #[stable(feature = "rust1", since = "1.0.0")]
2819    #[inline]
2820    pub fn dedup(&mut self) {
2821        self.dedup_by(|a, b| a == b)
2822    }
2823}
2824
2825////////////////////////////////////////////////////////////////////////////////
2826// Internal methods and functions
2827////////////////////////////////////////////////////////////////////////////////
2828
2829#[doc(hidden)]
2830#[cfg(not(no_global_oom_handling))]
2831#[stable(feature = "rust1", since = "1.0.0")]
2832pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
2833    <T as SpecFromElem>::from_elem(elem, n, Global)
2834}
2835
2836#[doc(hidden)]
2837#[cfg(not(no_global_oom_handling))]
2838#[unstable(feature = "allocator_api", issue = "32838")]
2839pub fn from_elem_in<T: Clone, A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
2840    <T as SpecFromElem>::from_elem(elem, n, alloc)
2841}
2842
2843trait ExtendFromWithinSpec {
2844    /// # Safety
2845    ///
2846    /// - `src` needs to be valid index
2847    /// - `self.capacity() - self.len()` must be `>= src.len()`
2848    unsafe fn spec_extend_from_within(&mut self, src: Range<usize>);
2849}
2850
2851impl<T: Clone, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
2852    default unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
2853        // SAFETY:
2854        // - len is increased only after initializing elements
2855        let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() };
2856
2857        // SAFETY:
2858        // - caller guarantees that src is a valid index
2859        let to_clone = unsafe { this.get_unchecked(src) };
2860
2861        iter::zip(to_clone, spare)
2862            .map(|(src, dst)| dst.write(src.clone()))
2863            // Note:
2864            // - Element was just initialized with `MaybeUninit::write`, so it's ok to increase len
2865            // - len is increased after each element to prevent leaks (see issue #82533)
2866            .for_each(|_| *len += 1);
2867    }
2868}
2869
2870impl<T: Copy, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
2871    unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
2872        let count = src.len();
2873        {
2874            let (init, spare) = self.split_at_spare_mut();
2875
2876            // SAFETY:
2877            // - caller guarantees that `src` is a valid index
2878            let source = unsafe { init.get_unchecked(src) };
2879
2880            // SAFETY:
2881            // - Both pointers are created from unique slice references (`&mut [_]`)
2882            //   so they are valid and do not overlap.
2883            // - Elements are :Copy so it's OK to copy them, without doing
2884            //   anything with the original values
2885            // - `count` is equal to the len of `source`, so source is valid for
2886            //   `count` reads
2887            // - `.reserve(count)` guarantees that `spare.len() >= count` so spare
2888            //   is valid for `count` writes
2889            unsafe { ptr::copy_nonoverlapping(source.as_ptr(), spare.as_mut_ptr() as _, count) };
2890        }
2891
2892        // SAFETY:
2893        // - The elements were just initialized by `copy_nonoverlapping`
2894        self.len += count;
2895    }
2896}
2897
2898////////////////////////////////////////////////////////////////////////////////
2899// Common trait implementations for Vec
2900////////////////////////////////////////////////////////////////////////////////
2901
2902#[stable(feature = "rust1", since = "1.0.0")]
2903impl<T, A: Allocator> ops::Deref for Vec<T, A> {
2904    type Target = [T];
2905
2906    #[inline]
2907    fn deref(&self) -> &[T] {
2908        unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
2909    }
2910}
2911
2912#[stable(feature = "rust1", since = "1.0.0")]
2913impl<T, A: Allocator> ops::DerefMut for Vec<T, A> {
2914    #[inline]
2915    fn deref_mut(&mut self) -> &mut [T] {
2916        unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
2917    }
2918}
2919
2920#[cfg(not(no_global_oom_handling))]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2921#[stable(feature = "rust1", since = "1.0.0")]
2922impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
2923    #[cfg(not(test))]
2924    fn clone(&self) -> Self {
2925        let alloc = self.allocator().clone();
2926        <[T]>::to_vec_in(&**self, alloc)
2927    }
2928
2929    // HACK(japaric): with cfg(test) the inherent `[T]::to_vec` method, which is
2930    // required for this method definition, is not available. Instead use the
2931    // `slice::to_vec` function which is only available with cfg(test)
2932    // NB see the slice::hack module in slice.rs for more information
2933    #[cfg(test)]
2934    fn clone(&self) -> Self {
2935        let alloc = self.allocator().clone();
2936        crate::slice::to_vec(&**self, alloc)
2937    }
2938
2939    fn clone_from(&mut self, other: &Self) {
2940        crate::slice::SpecCloneIntoVec::clone_into(other.as_slice(), self);
2941    }
2942}
2943
2944/// The hash of a vector is the same as that of the corresponding slice,
2945/// as required by the `core::borrow::Borrow` implementation.
2946///
2947/// ```
 
2948/// use std::hash::BuildHasher;
2949///
2950/// let b = std::collections::hash_map::RandomState::new();
2951/// let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
2952/// let s: &[u8] = &[0xa8, 0x3c, 0x09];
2953/// assert_eq!(b.hash_one(v), b.hash_one(s));
2954/// ```
2955#[stable(feature = "rust1", since = "1.0.0")]
2956impl<T: Hash, A: Allocator> Hash for Vec<T, A> {
2957    #[inline]
2958    fn hash<H: Hasher>(&self, state: &mut H) {
2959        Hash::hash(&**self, state)
2960    }
2961}
2962
2963#[stable(feature = "rust1", since = "1.0.0")]
2964#[rustc_on_unimplemented(
2965    message = "vector indices are of type `usize` or ranges of `usize`",
2966    label = "vector indices are of type `usize` or ranges of `usize`"
2967)]
2968impl<T, I: SliceIndex<[T]>, A: Allocator> Index<I> for Vec<T, A> {
2969    type Output = I::Output;
2970
2971    #[inline]
2972    fn index(&self, index: I) -> &Self::Output {
2973        Index::index(&**self, index)
2974    }
2975}
2976
2977#[stable(feature = "rust1", since = "1.0.0")]
2978#[rustc_on_unimplemented(
2979    message = "vector indices are of type `usize` or ranges of `usize`",
2980    label = "vector indices are of type `usize` or ranges of `usize`"
2981)]
2982impl<T, I: SliceIndex<[T]>, A: Allocator> IndexMut<I> for Vec<T, A> {
2983    #[inline]
2984    fn index_mut(&mut self, index: I) -> &mut Self::Output {
2985        IndexMut::index_mut(&mut **self, index)
2986    }
2987}
2988
2989#[cfg(not(no_global_oom_handling))]
2990#[stable(feature = "rust1", since = "1.0.0")]
2991impl<T> FromIterator<T> for Vec<T> {
2992    #[inline]
2993    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Vec<T> {
2994        <Self as SpecFromIter<T, I::IntoIter>>::from_iter(iter.into_iter())
2995    }
2996}
2997
2998#[stable(feature = "rust1", since = "1.0.0")]
2999impl<T, A: Allocator> IntoIterator for Vec<T, A> {
3000    type Item = T;
3001    type IntoIter = IntoIter<T, A>;
3002
3003    /// Creates a consuming iterator, that is, one that moves each value out of
3004    /// the vector (from start to end). The vector cannot be used after calling
3005    /// this.
3006    ///
3007    /// # Examples
3008    ///
3009    /// ```
3010    /// let v = vec!["a".to_string(), "b".to_string()];
3011    /// let mut v_iter = v.into_iter();
3012    ///
3013    /// let first_element: Option<String> = v_iter.next();
3014    ///
3015    /// assert_eq!(first_element, Some("a".to_string()));
3016    /// assert_eq!(v_iter.next(), Some("b".to_string()));
3017    /// assert_eq!(v_iter.next(), None);
3018    /// ```
3019    #[inline]
3020    fn into_iter(self) -> Self::IntoIter {
3021        unsafe {
3022            let mut me = ManuallyDrop::new(self);
3023            let alloc = ManuallyDrop::new(ptr::read(me.allocator()));
3024            let begin = me.as_mut_ptr();
3025            let end = if T::IS_ZST {
3026                begin.wrapping_byte_add(me.len())
3027            } else {
3028                begin.add(me.len()) as *const T
3029            };
3030            let cap = me.buf.capacity();
3031            IntoIter {
3032                buf: NonNull::new_unchecked(begin),
3033                phantom: PhantomData,
3034                cap,
3035                alloc,
3036                ptr: begin,
3037                end,
3038            }
3039        }
3040    }
3041}
3042
3043#[stable(feature = "rust1", since = "1.0.0")]
3044impl<'a, T, A: Allocator> IntoIterator for &'a Vec<T, A> {
3045    type Item = &'a T;
3046    type IntoIter = slice::Iter<'a, T>;
3047
3048    fn into_iter(self) -> Self::IntoIter {
3049        self.iter()
3050    }
3051}
3052
3053#[stable(feature = "rust1", since = "1.0.0")]
3054impl<'a, T, A: Allocator> IntoIterator for &'a mut Vec<T, A> {
3055    type Item = &'a mut T;
3056    type IntoIter = slice::IterMut<'a, T>;
3057
3058    fn into_iter(self) -> Self::IntoIter {
3059        self.iter_mut()
3060    }
3061}
3062
3063#[cfg(not(no_global_oom_handling))]
3064#[stable(feature = "rust1", since = "1.0.0")]
3065impl<T, A: Allocator> Extend<T> for Vec<T, A> {
3066    #[inline]
3067    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
3068        <Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter())
3069    }
3070
3071    #[inline]
3072    fn extend_one(&mut self, item: T) {
3073        self.push(item);
3074    }
3075
3076    #[inline]
3077    fn extend_reserve(&mut self, additional: usize) {
3078        self.reserve(additional);
3079    }
3080}
3081
3082impl<T, A: Allocator> Vec<T, A> {
3083    // leaf method to which various SpecFrom/SpecExtend implementations delegate when
3084    // they have no further optimizations to apply
3085    #[cfg(not(no_global_oom_handling))]
3086    fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
3087        // This is the case for a general iterator.
3088        //
3089        // This function should be the moral equivalent of:
3090        //
3091        //      for item in iterator {
3092        //          self.push(item);
3093        //      }
3094        while let Some(element) = iterator.next() {
3095            let len = self.len();
3096            if len == self.capacity() {
3097                let (lower, _) = iterator.size_hint();
3098                self.reserve(lower.saturating_add(1));
3099            }
3100            unsafe {
3101                ptr::write(self.as_mut_ptr().add(len), element);
3102                // Since next() executes user code which can panic we have to bump the length
3103                // after each step.
3104                // NB can't overflow since we would have had to alloc the address space
3105                self.set_len(len + 1);
3106            }
3107        }
3108    }
3109
3110    // leaf method to which various SpecFrom/SpecExtend implementations delegate when
3111    // they have no further optimizations to apply
3112    fn try_extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) -> Result<(), TryReserveError> {
3113        // This is the case for a general iterator.
3114        //
3115        // This function should be the moral equivalent of:
3116        //
3117        //      for item in iterator {
3118        //          self.push(item);
3119        //      }
3120        while let Some(element) = iterator.next() {
3121            let len = self.len();
3122            if len == self.capacity() {
3123                let (lower, _) = iterator.size_hint();
3124                self.try_reserve(lower.saturating_add(1))?;
3125            }
3126            unsafe {
3127                ptr::write(self.as_mut_ptr().add(len), element);
3128                // Since next() executes user code which can panic we have to bump the length
3129                // after each step.
3130                // NB can't overflow since we would have had to alloc the address space
3131                self.set_len(len + 1);
3132            }
3133        }
3134
3135        Ok(())
3136    }
3137
3138    // specific extend for `TrustedLen` iterators, called both by the specializations
3139    // and internal places where resolving specialization makes compilation slower
3140    #[cfg(not(no_global_oom_handling))]
3141    fn extend_trusted(&mut self, iterator: impl iter::TrustedLen<Item = T>) {
3142        let (low, high) = iterator.size_hint();
3143        if let Some(additional) = high {
3144            debug_assert_eq!(
3145                low,
3146                additional,
3147                "TrustedLen iterator's size hint is not exact: {:?}",
3148                (low, high)
3149            );
3150            self.reserve(additional);
3151            unsafe {
3152                let ptr = self.as_mut_ptr();
3153                let mut local_len = SetLenOnDrop::new(&mut self.len);
3154                iterator.for_each(move |element| {
3155                    ptr::write(ptr.add(local_len.current_len()), element);
3156                    // Since the loop executes user code which can panic we have to update
3157                    // the length every step to correctly drop what we've written.
3158                    // NB can't overflow since we would have had to alloc the address space
3159                    local_len.increment_len(1);
3160                });
3161            }
3162        } else {
3163            // Per TrustedLen contract a `None` upper bound means that the iterator length
3164            // truly exceeds usize::MAX, which would eventually lead to a capacity overflow anyway.
3165            // Since the other branch already panics eagerly (via `reserve()`) we do the same here.
3166            // This avoids additional codegen for a fallback code path which would eventually
3167            // panic anyway.
3168            panic!("capacity overflow");
3169        }
3170    }
3171
3172    // specific extend for `TrustedLen` iterators, called both by the specializations
3173    // and internal places where resolving specialization makes compilation slower
3174    fn try_extend_trusted(&mut self, iterator: impl iter::TrustedLen<Item = T>) -> Result<(), TryReserveError> {
3175        let (low, high) = iterator.size_hint();
3176        if let Some(additional) = high {
3177            debug_assert_eq!(
3178                low,
3179                additional,
3180                "TrustedLen iterator's size hint is not exact: {:?}",
3181                (low, high)
3182            );
3183            self.try_reserve(additional)?;
3184            unsafe {
3185                let ptr = self.as_mut_ptr();
3186                let mut local_len = SetLenOnDrop::new(&mut self.len);
3187                iterator.for_each(move |element| {
3188                    ptr::write(ptr.add(local_len.current_len()), element);
3189                    // Since the loop executes user code which can panic we have to update
3190                    // the length every step to correctly drop what we've written.
3191                    // NB can't overflow since we would have had to alloc the address space
3192                    local_len.increment_len(1);
3193                });
3194            }
3195            Ok(())
3196        } else {
3197            Err(TryReserveErrorKind::CapacityOverflow.into())
3198        }
3199    }
3200
3201    /// Creates a splicing iterator that replaces the specified range in the vector
3202    /// with the given `replace_with` iterator and yields the removed items.
3203    /// `replace_with` does not need to be the same length as `range`.
3204    ///
3205    /// `range` is removed even if the iterator is not consumed until the end.
3206    ///
3207    /// It is unspecified how many elements are removed from the vector
3208    /// if the `Splice` value is leaked.
3209    ///
3210    /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped.
3211    ///
3212    /// This is optimal if:
3213    ///
3214    /// * The tail (elements in the vector after `range`) is empty,
3215    /// * or `replace_with` yields fewer or equal elements than `range`’s length
3216    /// * or the lower bound of its `size_hint()` is exact.
3217    ///
3218    /// Otherwise, a temporary vector is allocated and the tail is moved twice.
3219    ///
3220    /// # Panics
3221    ///
3222    /// Panics if the starting point is greater than the end point or if
3223    /// the end point is greater than the length of the vector.
3224    ///
3225    /// # Examples
3226    ///
3227    /// ```
3228    /// let mut v = vec![1, 2, 3, 4];
3229    /// let new = [7, 8, 9];
3230    /// let u: Vec<_> = v.splice(1..3, new).collect();
3231    /// assert_eq!(v, &[1, 7, 8, 9, 4]);
3232    /// assert_eq!(u, &[2, 3]);
3233    /// ```
3234    #[cfg(not(no_global_oom_handling))]
3235    #[inline]
3236    #[stable(feature = "vec_splice", since = "1.21.0")]
3237    pub fn splice<R, I>(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter, A>
3238    where
3239        R: RangeBounds<usize>,
3240        I: IntoIterator<Item = T>,
3241    {
3242        Splice { drain: self.drain(range), replace_with: replace_with.into_iter() }
3243    }
3244
3245    /// Creates an iterator which uses a closure to determine if an element should be removed.
3246    ///
3247    /// If the closure returns true, then the element is removed and yielded.
3248    /// If the closure returns false, the element will remain in the vector and will not be yielded
3249    /// by the iterator.
3250    ///
3251    /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating
3252    /// or the iteration short-circuits, then the remaining elements will be retained.
3253    /// Use [`retain`] with a negated predicate if you do not need the returned iterator.
3254    ///
3255    /// [`retain`]: Vec::retain
3256    ///
3257    /// Using this method is equivalent to the following code:
3258    ///
3259    /// ```
3260    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6 };
3261    /// # let mut vec = vec![1, 2, 3, 4, 5, 6];
3262    /// let mut i = 0;
3263    /// while i < vec.len() {
3264    ///     if some_predicate(&mut vec[i]) {
3265    ///         let val = vec.remove(i);
3266    ///         // your code here
3267    ///     } else {
3268    ///         i += 1;
3269    ///     }
3270    /// }
3271    ///
3272    /// # assert_eq!(vec, vec![1, 4, 5]);
3273    /// ```
3274    ///
3275    /// But `extract_if` is easier to use. `extract_if` is also more efficient,
3276    /// because it can backshift the elements of the array in bulk.
3277    ///
3278    /// Note that `extract_if` also lets you mutate every element in the filter closure,
3279    /// regardless of whether you choose to keep or remove it.
3280    ///
3281    /// # Examples
3282    ///
3283    /// Splitting an array into evens and odds, reusing the original allocation:
3284    ///
3285    /// ```
3286    /// #![feature(extract_if)]
3287    /// let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
3288    ///
3289    /// let evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();
3290    /// let odds = numbers;
3291    ///
3292    /// assert_eq!(evens, vec![2, 4, 6, 8, 14]);
3293    /// assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
3294    /// ```
3295    #[unstable(feature = "extract_if", reason = "recently added", issue = "43244")]
3296    pub fn extract_if<F>(&mut self, filter: F) -> ExtractIf<'_, T, F, A>
3297    where
3298        F: FnMut(&mut T) -> bool,
3299    {
3300        let old_len = self.len();
3301
3302        // Guard against us getting leaked (leak amplification)
3303        unsafe {
3304            self.set_len(0);
3305        }
3306
3307        ExtractIf { vec: self, idx: 0, del: 0, old_len, pred: filter }
3308    }
3309}
3310
3311/// Extend implementation that copies elements out of references before pushing them onto the Vec.
3312///
3313/// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to
3314/// append the entire slice at once.
3315///
3316/// [`copy_from_slice`]: slice::copy_from_slice
3317#[cfg(not(no_global_oom_handling))]
3318#[stable(feature = "extend_ref", since = "1.2.0")]
3319impl<'a, T: Copy + 'a, A: Allocator> Extend<&'a T> for Vec<T, A> {
3320    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
3321        self.spec_extend(iter.into_iter())
3322    }
3323
3324    #[inline]
3325    fn extend_one(&mut self, &item: &'a T) {
3326        self.push(item);
3327    }
3328
3329    #[inline]
3330    fn extend_reserve(&mut self, additional: usize) {
3331        self.reserve(additional);
3332    }
3333}
3334
3335/// Implements comparison of vectors, [lexicographically](Ord#lexicographical-comparison).
3336#[stable(feature = "rust1", since = "1.0.0")]
3337impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
3338where
3339    T: PartialOrd,
3340    A1: Allocator,
3341    A2: Allocator,
3342{
3343    #[inline]
3344    fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering> {
3345        PartialOrd::partial_cmp(&**self, &**other)
3346    }
3347}
3348
3349#[stable(feature = "rust1", since = "1.0.0")]
3350impl<T: Eq, A: Allocator> Eq for Vec<T, A> {}
3351
3352/// Implements ordering of vectors, [lexicographically](Ord#lexicographical-comparison).
3353#[stable(feature = "rust1", since = "1.0.0")]
3354impl<T: Ord, A: Allocator> Ord for Vec<T, A> {
3355    #[inline]
3356    fn cmp(&self, other: &Self) -> Ordering {
3357        Ord::cmp(&**self, &**other)
3358    }
3359}
3360
3361#[stable(feature = "rust1", since = "1.0.0")]
3362unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
3363    fn drop(&mut self) {
3364        unsafe {
3365            // use drop for [T]
3366            // use a raw slice to refer to the elements of the vector as weakest necessary type;
3367            // could avoid questions of validity in certain cases
3368            ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
3369        }
3370        // RawVec handles deallocation
3371    }
3372}
3373
3374#[stable(feature = "rust1", since = "1.0.0")]
3375impl<T> Default for Vec<T> {
 
3376    /// Creates an empty `Vec<T>`.
3377    ///
3378    /// The vector will not allocate until elements are pushed onto it.
3379    fn default() -> Vec<T> {
3380        Vec::new()
3381    }
3382}
3383
3384#[stable(feature = "rust1", since = "1.0.0")]
3385impl<T: fmt::Debug, A: Allocator> fmt::Debug for Vec<T, A> {
3386    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3387        fmt::Debug::fmt(&**self, f)
3388    }
3389}
3390
3391#[stable(feature = "rust1", since = "1.0.0")]
3392impl<T, A: Allocator> AsRef<Vec<T, A>> for Vec<T, A> {
3393    fn as_ref(&self) -> &Vec<T, A> {
3394        self
3395    }
3396}
3397
3398#[stable(feature = "vec_as_mut", since = "1.5.0")]
3399impl<T, A: Allocator> AsMut<Vec<T, A>> for Vec<T, A> {
3400    fn as_mut(&mut self) -> &mut Vec<T, A> {
3401        self
3402    }
3403}
3404
3405#[stable(feature = "rust1", since = "1.0.0")]
3406impl<T, A: Allocator> AsRef<[T]> for Vec<T, A> {
3407    fn as_ref(&self) -> &[T] {
3408        self
3409    }
3410}
3411
3412#[stable(feature = "vec_as_mut", since = "1.5.0")]
3413impl<T, A: Allocator> AsMut<[T]> for Vec<T, A> {
3414    fn as_mut(&mut self) -> &mut [T] {
3415        self
3416    }
3417}
3418
3419#[cfg(not(no_global_oom_handling))]
3420#[stable(feature = "rust1", since = "1.0.0")]
3421impl<T: Clone> From<&[T]> for Vec<T> {
3422    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3423    ///
3424    /// # Examples
3425    ///
3426    /// ```
3427    /// assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
3428    /// ```
3429    #[cfg(not(test))]
3430    fn from(s: &[T]) -> Vec<T> {
3431        s.to_vec()
3432    }
3433    #[cfg(test)]
3434    fn from(s: &[T]) -> Vec<T> {
3435        crate::slice::to_vec(s, Global)
3436    }
3437}
3438
3439#[cfg(not(no_global_oom_handling))]
3440#[stable(feature = "vec_from_mut", since = "1.19.0")]
3441impl<T: Clone> From<&mut [T]> for Vec<T> {
3442    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3443    ///
3444    /// # Examples
3445    ///
3446    /// ```
3447    /// assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
3448    /// ```
3449    #[cfg(not(test))]
3450    fn from(s: &mut [T]) -> Vec<T> {
3451        s.to_vec()
3452    }
3453    #[cfg(test)]
3454    fn from(s: &mut [T]) -> Vec<T> {
3455        crate::slice::to_vec(s, Global)
3456    }
3457}
3458
3459#[cfg(not(no_global_oom_handling))]
3460#[stable(feature = "vec_from_array_ref", since = "1.74.0")]
3461impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T> {
3462    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3463    ///
3464    /// # Examples
3465    ///
3466    /// ```
3467    /// assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
3468    /// ```
3469    fn from(s: &[T; N]) -> Vec<T> {
3470        Self::from(s.as_slice())
3471    }
3472}
3473
3474#[cfg(not(no_global_oom_handling))]
3475#[stable(feature = "vec_from_array_ref", since = "1.74.0")]
3476impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T> {
3477    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3478    ///
3479    /// # Examples
3480    ///
3481    /// ```
3482    /// assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
3483    /// ```
3484    fn from(s: &mut [T; N]) -> Vec<T> {
3485        Self::from(s.as_mut_slice())
3486    }
3487}
3488
3489#[cfg(not(no_global_oom_handling))]
3490#[stable(feature = "vec_from_array", since = "1.44.0")]
3491impl<T, const N: usize> From<[T; N]> for Vec<T> {
3492    /// Allocate a `Vec<T>` and move `s`'s items into it.
3493    ///
3494    /// # Examples
3495    ///
3496    /// ```
3497    /// assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
3498    /// ```
3499    #[cfg(not(test))]
3500    fn from(s: [T; N]) -> Vec<T> {
3501        <[T]>::into_vec(Box::new(s))
3502    }
3503
3504    #[cfg(test)]
3505    fn from(s: [T; N]) -> Vec<T> {
3506        crate::slice::into_vec(Box::new(s))
3507    }
3508}
3509
3510#[cfg(not(no_borrow))]
3511#[stable(feature = "vec_from_cow_slice", since = "1.14.0")]
3512impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
3513where
3514    [T]: ToOwned<Owned = Vec<T>>,
3515{
3516    /// Convert a clone-on-write slice into a vector.
3517    ///
3518    /// If `s` already owns a `Vec<T>`, it will be returned directly.
3519    /// If `s` is borrowing a slice, a new `Vec<T>` will be allocated and
3520    /// filled by cloning `s`'s items into it.
3521    ///
3522    /// # Examples
3523    ///
3524    /// ```
3525    /// # use std::borrow::Cow;
3526    /// let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);
3527    /// let b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);
3528    /// assert_eq!(Vec::from(o), Vec::from(b));
3529    /// ```
3530    fn from(s: Cow<'a, [T]>) -> Vec<T> {
3531        s.into_owned()
3532    }
3533}
3534
3535// note: test pulls in std, which causes errors here
3536#[cfg(not(test))]
3537#[stable(feature = "vec_from_box", since = "1.18.0")]
3538impl<T, A: Allocator> From<Box<[T], A>> for Vec<T, A> {
3539    /// Convert a boxed slice into a vector by transferring ownership of
3540    /// the existing heap allocation.
3541    ///
3542    /// # Examples
3543    ///
3544    /// ```
3545    /// let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
3546    /// assert_eq!(Vec::from(b), vec![1, 2, 3]);
3547    /// ```
3548    fn from(s: Box<[T], A>) -> Self {
3549        s.into_vec()
3550    }
3551}
3552
3553// note: test pulls in std, which causes errors here
3554#[cfg(not(no_global_oom_handling))]
3555#[cfg(not(test))]
3556#[stable(feature = "box_from_vec", since = "1.20.0")]
3557impl<T, A: Allocator> From<Vec<T, A>> for Box<[T], A> {
3558    /// Convert a vector into a boxed slice.
3559    ///
3560    /// If `v` has excess capacity, its items will be moved into a
3561    /// newly-allocated buffer with exactly the right capacity.
3562    ///
3563    /// # Examples
3564    ///
3565    /// ```
3566    /// assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());
3567    /// ```
3568    ///
3569    /// Any excess capacity is removed:
3570    /// ```
3571    /// let mut vec = Vec::with_capacity(10);
3572    /// vec.extend([1, 2, 3]);
3573    ///
3574    /// assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice());
3575    /// ```
3576    fn from(v: Vec<T, A>) -> Self {
3577        v.into_boxed_slice()
3578    }
3579}
3580
3581#[cfg(not(no_global_oom_handling))]
3582#[stable(feature = "rust1", since = "1.0.0")]
3583impl From<&str> for Vec<u8> {
3584    /// Allocate a `Vec<u8>` and fill it with a UTF-8 string.
3585    ///
3586    /// # Examples
3587    ///
3588    /// ```
3589    /// assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']);
3590    /// ```
3591    fn from(s: &str) -> Vec<u8> {
3592        From::from(s.as_bytes())
3593    }
3594}
3595
3596#[stable(feature = "array_try_from_vec", since = "1.48.0")]
3597impl<T, A: Allocator, const N: usize> TryFrom<Vec<T, A>> for [T; N] {
3598    type Error = Vec<T, A>;
3599
3600    /// Gets the entire contents of the `Vec<T>` as an array,
3601    /// if its size exactly matches that of the requested array.
3602    ///
3603    /// # Examples
3604    ///
3605    /// ```
3606    /// assert_eq!(vec![1, 2, 3].try_into(), Ok([1, 2, 3]));
3607    /// assert_eq!(<Vec<i32>>::new().try_into(), Ok([]));
3608    /// ```
3609    ///
3610    /// If the length doesn't match, the input comes back in `Err`:
3611    /// ```
3612    /// let r: Result<[i32; 4], _> = (0..10).collect::<Vec<_>>().try_into();
3613    /// assert_eq!(r, Err(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
3614    /// ```
3615    ///
3616    /// If you're fine with just getting a prefix of the `Vec<T>`,
3617    /// you can call [`.truncate(N)`](Vec::truncate) first.
3618    /// ```
3619    /// let mut v = String::from("hello world").into_bytes();
3620    /// v.sort();
3621    /// v.truncate(2);
3622    /// let [a, b]: [_; 2] = v.try_into().unwrap();
3623    /// assert_eq!(a, b' ');
3624    /// assert_eq!(b, b'd');
3625    /// ```
3626    fn try_from(mut vec: Vec<T, A>) -> Result<[T; N], Vec<T, A>> {
3627        if vec.len() != N {
3628            return Err(vec);
3629        }
3630
3631        // SAFETY: `.set_len(0)` is always sound.
3632        unsafe { vec.set_len(0) };
3633
3634        // SAFETY: A `Vec`'s pointer is always aligned properly, and
3635        // the alignment the array needs is the same as the items.
3636        // We checked earlier that we have sufficient items.
3637        // The items will not double-drop as the `set_len`
3638        // tells the `Vec` not to also drop them.
3639        let array = unsafe { ptr::read(vec.as_ptr() as *const [T; N]) };
3640        Ok(array)
3641    }
3642}
v6.2
   1// SPDX-License-Identifier: Apache-2.0 OR MIT
   2
   3//! A contiguous growable array type with heap-allocated contents, written
   4//! `Vec<T>`.
   5//!
   6//! Vectors have *O*(1) indexing, amortized *O*(1) push (to the end) and
   7//! *O*(1) pop (from the end).
   8//!
   9//! Vectors ensure they never allocate more than `isize::MAX` bytes.
  10//!
  11//! # Examples
  12//!
  13//! You can explicitly create a [`Vec`] with [`Vec::new`]:
  14//!
  15//! ```
  16//! let v: Vec<i32> = Vec::new();
  17//! ```
  18//!
  19//! ...or by using the [`vec!`] macro:
  20//!
  21//! ```
  22//! let v: Vec<i32> = vec![];
  23//!
  24//! let v = vec![1, 2, 3, 4, 5];
  25//!
  26//! let v = vec![0; 10]; // ten zeroes
  27//! ```
  28//!
  29//! You can [`push`] values onto the end of a vector (which will grow the vector
  30//! as needed):
  31//!
  32//! ```
  33//! let mut v = vec![1, 2];
  34//!
  35//! v.push(3);
  36//! ```
  37//!
  38//! Popping values works in much the same way:
  39//!
  40//! ```
  41//! let mut v = vec![1, 2];
  42//!
  43//! let two = v.pop();
  44//! ```
  45//!
  46//! Vectors also support indexing (through the [`Index`] and [`IndexMut`] traits):
  47//!
  48//! ```
  49//! let mut v = vec![1, 2, 3];
  50//! let three = v[2];
  51//! v[1] = v[1] + 5;
  52//! ```
  53//!
  54//! [`push`]: Vec::push
  55
  56#![stable(feature = "rust1", since = "1.0.0")]
  57
  58#[cfg(not(no_global_oom_handling))]
  59use core::cmp;
  60use core::cmp::Ordering;
  61use core::convert::TryFrom;
  62use core::fmt;
  63use core::hash::{Hash, Hasher};
  64use core::intrinsics::{arith_offset, assume};
  65use core::iter;
  66#[cfg(not(no_global_oom_handling))]
  67use core::iter::FromIterator;
  68use core::marker::PhantomData;
  69use core::mem::{self, ManuallyDrop, MaybeUninit};
  70use core::ops::{self, Index, IndexMut, Range, RangeBounds};
  71use core::ptr::{self, NonNull};
  72use core::slice::{self, SliceIndex};
  73
  74use crate::alloc::{Allocator, Global};
 
  75use crate::borrow::{Cow, ToOwned};
  76use crate::boxed::Box;
  77use crate::collections::TryReserveError;
  78use crate::raw_vec::RawVec;
  79
  80#[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
  81pub use self::drain_filter::DrainFilter;
  82
  83mod drain_filter;
  84
  85#[cfg(not(no_global_oom_handling))]
  86#[stable(feature = "vec_splice", since = "1.21.0")]
  87pub use self::splice::Splice;
  88
  89#[cfg(not(no_global_oom_handling))]
  90mod splice;
  91
  92#[stable(feature = "drain", since = "1.6.0")]
  93pub use self::drain::Drain;
  94
  95mod drain;
  96
 
  97#[cfg(not(no_global_oom_handling))]
  98mod cow;
  99
 100#[cfg(not(no_global_oom_handling))]
 101pub(crate) use self::in_place_collect::AsVecIntoIter;
 102#[stable(feature = "rust1", since = "1.0.0")]
 103pub use self::into_iter::IntoIter;
 104
 105mod into_iter;
 106
 107#[cfg(not(no_global_oom_handling))]
 108use self::is_zero::IsZero;
 109
 110mod is_zero;
 111
 112#[cfg(not(no_global_oom_handling))]
 113mod in_place_collect;
 114
 115mod partial_eq;
 116
 117#[cfg(not(no_global_oom_handling))]
 118use self::spec_from_elem::SpecFromElem;
 119
 120#[cfg(not(no_global_oom_handling))]
 121mod spec_from_elem;
 122
 123#[cfg(not(no_global_oom_handling))]
 124use self::set_len_on_drop::SetLenOnDrop;
 125
 126#[cfg(not(no_global_oom_handling))]
 127mod set_len_on_drop;
 128
 129#[cfg(not(no_global_oom_handling))]
 130use self::in_place_drop::InPlaceDrop;
 131
 132#[cfg(not(no_global_oom_handling))]
 133mod in_place_drop;
 134
 135#[cfg(not(no_global_oom_handling))]
 136use self::spec_from_iter_nested::SpecFromIterNested;
 137
 138#[cfg(not(no_global_oom_handling))]
 139mod spec_from_iter_nested;
 140
 141#[cfg(not(no_global_oom_handling))]
 142use self::spec_from_iter::SpecFromIter;
 143
 144#[cfg(not(no_global_oom_handling))]
 145mod spec_from_iter;
 146
 147#[cfg(not(no_global_oom_handling))]
 148use self::spec_extend::SpecExtend;
 149
 150#[cfg(not(no_global_oom_handling))]
 
 151mod spec_extend;
 152
 153/// A contiguous growable array type, written as `Vec<T>`, short for 'vector'.
 154///
 155/// # Examples
 156///
 157/// ```
 158/// let mut vec = Vec::new();
 159/// vec.push(1);
 160/// vec.push(2);
 161///
 162/// assert_eq!(vec.len(), 2);
 163/// assert_eq!(vec[0], 1);
 164///
 165/// assert_eq!(vec.pop(), Some(2));
 166/// assert_eq!(vec.len(), 1);
 167///
 168/// vec[0] = 7;
 169/// assert_eq!(vec[0], 7);
 170///
 171/// vec.extend([1, 2, 3].iter().copied());
 172///
 173/// for x in &vec {
 174///     println!("{x}");
 175/// }
 176/// assert_eq!(vec, [7, 1, 2, 3]);
 177/// ```
 178///
 179/// The [`vec!`] macro is provided for convenient initialization:
 180///
 181/// ```
 182/// let mut vec1 = vec![1, 2, 3];
 183/// vec1.push(4);
 184/// let vec2 = Vec::from([1, 2, 3, 4]);
 185/// assert_eq!(vec1, vec2);
 186/// ```
 187///
 188/// It can also initialize each element of a `Vec<T>` with a given value.
 189/// This may be more efficient than performing allocation and initialization
 190/// in separate steps, especially when initializing a vector of zeros:
 191///
 192/// ```
 193/// let vec = vec![0; 5];
 194/// assert_eq!(vec, [0, 0, 0, 0, 0]);
 195///
 196/// // The following is equivalent, but potentially slower:
 197/// let mut vec = Vec::with_capacity(5);
 198/// vec.resize(5, 0);
 199/// assert_eq!(vec, [0, 0, 0, 0, 0]);
 200/// ```
 201///
 202/// For more information, see
 203/// [Capacity and Reallocation](#capacity-and-reallocation).
 204///
 205/// Use a `Vec<T>` as an efficient stack:
 206///
 207/// ```
 208/// let mut stack = Vec::new();
 209///
 210/// stack.push(1);
 211/// stack.push(2);
 212/// stack.push(3);
 213///
 214/// while let Some(top) = stack.pop() {
 215///     // Prints 3, 2, 1
 216///     println!("{top}");
 217/// }
 218/// ```
 219///
 220/// # Indexing
 221///
 222/// The `Vec` type allows to access values by index, because it implements the
 223/// [`Index`] trait. An example will be more explicit:
 224///
 225/// ```
 226/// let v = vec![0, 2, 4, 6];
 227/// println!("{}", v[1]); // it will display '2'
 228/// ```
 229///
 230/// However be careful: if you try to access an index which isn't in the `Vec`,
 231/// your software will panic! You cannot do this:
 232///
 233/// ```should_panic
 234/// let v = vec![0, 2, 4, 6];
 235/// println!("{}", v[6]); // it will panic!
 236/// ```
 237///
 238/// Use [`get`] and [`get_mut`] if you want to check whether the index is in
 239/// the `Vec`.
 240///
 241/// # Slicing
 242///
 243/// A `Vec` can be mutable. On the other hand, slices are read-only objects.
 244/// To get a [slice][prim@slice], use [`&`]. Example:
 245///
 246/// ```
 247/// fn read_slice(slice: &[usize]) {
 248///     // ...
 249/// }
 250///
 251/// let v = vec![0, 1];
 252/// read_slice(&v);
 253///
 254/// // ... and that's all!
 255/// // you can also do it like this:
 256/// let u: &[usize] = &v;
 257/// // or like this:
 258/// let u: &[_] = &v;
 259/// ```
 260///
 261/// In Rust, it's more common to pass slices as arguments rather than vectors
 262/// when you just want to provide read access. The same goes for [`String`] and
 263/// [`&str`].
 264///
 265/// # Capacity and reallocation
 266///
 267/// The capacity of a vector is the amount of space allocated for any future
 268/// elements that will be added onto the vector. This is not to be confused with
 269/// the *length* of a vector, which specifies the number of actual elements
 270/// within the vector. If a vector's length exceeds its capacity, its capacity
 271/// will automatically be increased, but its elements will have to be
 272/// reallocated.
 273///
 274/// For example, a vector with capacity 10 and length 0 would be an empty vector
 275/// with space for 10 more elements. Pushing 10 or fewer elements onto the
 276/// vector will not change its capacity or cause reallocation to occur. However,
 277/// if the vector's length is increased to 11, it will have to reallocate, which
 278/// can be slow. For this reason, it is recommended to use [`Vec::with_capacity`]
 279/// whenever possible to specify how big the vector is expected to get.
 280///
 281/// # Guarantees
 282///
 283/// Due to its incredibly fundamental nature, `Vec` makes a lot of guarantees
 284/// about its design. This ensures that it's as low-overhead as possible in
 285/// the general case, and can be correctly manipulated in primitive ways
 286/// by unsafe code. Note that these guarantees refer to an unqualified `Vec<T>`.
 287/// If additional type parameters are added (e.g., to support custom allocators),
 288/// overriding their defaults may change the behavior.
 289///
 290/// Most fundamentally, `Vec` is and always will be a (pointer, capacity, length)
 291/// triplet. No more, no less. The order of these fields is completely
 292/// unspecified, and you should use the appropriate methods to modify these.
 293/// The pointer will never be null, so this type is null-pointer-optimized.
 294///
 295/// However, the pointer might not actually point to allocated memory. In particular,
 296/// if you construct a `Vec` with capacity 0 via [`Vec::new`], [`vec![]`][`vec!`],
 297/// [`Vec::with_capacity(0)`][`Vec::with_capacity`], or by calling [`shrink_to_fit`]
 298/// on an empty Vec, it will not allocate memory. Similarly, if you store zero-sized
 299/// types inside a `Vec`, it will not allocate space for them. *Note that in this case
 300/// the `Vec` might not report a [`capacity`] of 0*. `Vec` will allocate if and only
 301/// if <code>[mem::size_of::\<T>]\() * [capacity]\() > 0</code>. In general, `Vec`'s allocation
 302/// details are very subtle --- if you intend to allocate memory using a `Vec`
 303/// and use it for something else (either to pass to unsafe code, or to build your
 304/// own memory-backed collection), be sure to deallocate this memory by using
 305/// `from_raw_parts` to recover the `Vec` and then dropping it.
 306///
 307/// If a `Vec` *has* allocated memory, then the memory it points to is on the heap
 308/// (as defined by the allocator Rust is configured to use by default), and its
 309/// pointer points to [`len`] initialized, contiguous elements in order (what
 310/// you would see if you coerced it to a slice), followed by <code>[capacity] - [len]</code>
 311/// logically uninitialized, contiguous elements.
 312///
 313/// A vector containing the elements `'a'` and `'b'` with capacity 4 can be
 314/// visualized as below. The top part is the `Vec` struct, it contains a
 315/// pointer to the head of the allocation in the heap, length and capacity.
 316/// The bottom part is the allocation on the heap, a contiguous memory block.
 317///
 318/// ```text
 319///             ptr      len  capacity
 320///        +--------+--------+--------+
 321///        | 0x0123 |      2 |      4 |
 322///        +--------+--------+--------+
 323///             |
 324///             v
 325/// Heap   +--------+--------+--------+--------+
 326///        |    'a' |    'b' | uninit | uninit |
 327///        +--------+--------+--------+--------+
 328/// ```
 329///
 330/// - **uninit** represents memory that is not initialized, see [`MaybeUninit`].
 331/// - Note: the ABI is not stable and `Vec` makes no guarantees about its memory
 332///   layout (including the order of fields).
 333///
 334/// `Vec` will never perform a "small optimization" where elements are actually
 335/// stored on the stack for two reasons:
 336///
 337/// * It would make it more difficult for unsafe code to correctly manipulate
 338///   a `Vec`. The contents of a `Vec` wouldn't have a stable address if it were
 339///   only moved, and it would be more difficult to determine if a `Vec` had
 340///   actually allocated memory.
 341///
 342/// * It would penalize the general case, incurring an additional branch
 343///   on every access.
 344///
 345/// `Vec` will never automatically shrink itself, even if completely empty. This
 346/// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec`
 347/// and then filling it back up to the same [`len`] should incur no calls to
 348/// the allocator. If you wish to free up unused memory, use
 349/// [`shrink_to_fit`] or [`shrink_to`].
 350///
 351/// [`push`] and [`insert`] will never (re)allocate if the reported capacity is
 352/// sufficient. [`push`] and [`insert`] *will* (re)allocate if
 353/// <code>[len] == [capacity]</code>. That is, the reported capacity is completely
 354/// accurate, and can be relied on. It can even be used to manually free the memory
 355/// allocated by a `Vec` if desired. Bulk insertion methods *may* reallocate, even
 356/// when not necessary.
 357///
 358/// `Vec` does not guarantee any particular growth strategy when reallocating
 359/// when full, nor when [`reserve`] is called. The current strategy is basic
 360/// and it may prove desirable to use a non-constant growth factor. Whatever
 361/// strategy is used will of course guarantee *O*(1) amortized [`push`].
 362///
 363/// `vec![x; n]`, `vec![a, b, c, d]`, and
 364/// [`Vec::with_capacity(n)`][`Vec::with_capacity`], will all produce a `Vec`
 365/// with exactly the requested capacity. If <code>[len] == [capacity]</code>,
 366/// (as is the case for the [`vec!`] macro), then a `Vec<T>` can be converted to
 367/// and from a [`Box<[T]>`][owned slice] without reallocating or moving the elements.
 368///
 369/// `Vec` will not specifically overwrite any data that is removed from it,
 370/// but also won't specifically preserve it. Its uninitialized memory is
 371/// scratch space that it may use however it wants. It will generally just do
 372/// whatever is most efficient or otherwise easy to implement. Do not rely on
 373/// removed data to be erased for security purposes. Even if you drop a `Vec`, its
 374/// buffer may simply be reused by another allocation. Even if you zero a `Vec`'s memory
 375/// first, that might not actually happen because the optimizer does not consider
 376/// this a side-effect that must be preserved. There is one case which we will
 377/// not break, however: using `unsafe` code to write to the excess capacity,
 378/// and then increasing the length to match, is always valid.
 379///
 380/// Currently, `Vec` does not guarantee the order in which elements are dropped.
 381/// The order has changed in the past and may change again.
 382///
 383/// [`get`]: ../../std/vec/struct.Vec.html#method.get
 384/// [`get_mut`]: ../../std/vec/struct.Vec.html#method.get_mut
 385/// [`String`]: crate::string::String
 386/// [`&str`]: type@str
 387/// [`shrink_to_fit`]: Vec::shrink_to_fit
 388/// [`shrink_to`]: Vec::shrink_to
 389/// [capacity]: Vec::capacity
 390/// [`capacity`]: Vec::capacity
 391/// [mem::size_of::\<T>]: core::mem::size_of
 392/// [len]: Vec::len
 393/// [`len`]: Vec::len
 394/// [`push`]: Vec::push
 395/// [`insert`]: Vec::insert
 396/// [`reserve`]: Vec::reserve
 397/// [`MaybeUninit`]: core::mem::MaybeUninit
 398/// [owned slice]: Box
 399#[stable(feature = "rust1", since = "1.0.0")]
 400#[cfg_attr(not(test), rustc_diagnostic_item = "Vec")]
 401#[rustc_insignificant_dtor]
 402pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
 403    buf: RawVec<T, A>,
 404    len: usize,
 405}
 406
 407////////////////////////////////////////////////////////////////////////////////
 408// Inherent methods
 409////////////////////////////////////////////////////////////////////////////////
 410
 411impl<T> Vec<T> {
 412    /// Constructs a new, empty `Vec<T>`.
 413    ///
 414    /// The vector will not allocate until elements are pushed onto it.
 415    ///
 416    /// # Examples
 417    ///
 418    /// ```
 419    /// # #![allow(unused_mut)]
 420    /// let mut vec: Vec<i32> = Vec::new();
 421    /// ```
 422    #[inline]
 423    #[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")]
 424    #[stable(feature = "rust1", since = "1.0.0")]
 425    #[must_use]
 426    pub const fn new() -> Self {
 427        Vec { buf: RawVec::NEW, len: 0 }
 428    }
 429
 430    /// Constructs a new, empty `Vec<T>` with the specified capacity.
 431    ///
 432    /// The vector will be able to hold exactly `capacity` elements without
 433    /// reallocating. If `capacity` is 0, the vector will not allocate.
 
 434    ///
 435    /// It is important to note that although the returned vector has the
 436    /// *capacity* specified, the vector will have a zero *length*. For an
 437    /// explanation of the difference between length and capacity, see
 438    /// *[Capacity and reallocation]*.
 439    ///
 
 
 
 
 
 
 440    /// [Capacity and reallocation]: #capacity-and-reallocation
 
 441    ///
 442    /// # Panics
 443    ///
 444    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 445    ///
 446    /// # Examples
 447    ///
 448    /// ```
 449    /// let mut vec = Vec::with_capacity(10);
 450    ///
 451    /// // The vector contains no items, even though it has capacity for more
 452    /// assert_eq!(vec.len(), 0);
 453    /// assert_eq!(vec.capacity(), 10);
 454    ///
 455    /// // These are all done without reallocating...
 456    /// for i in 0..10 {
 457    ///     vec.push(i);
 458    /// }
 459    /// assert_eq!(vec.len(), 10);
 460    /// assert_eq!(vec.capacity(), 10);
 461    ///
 462    /// // ...but this may make the vector reallocate
 463    /// vec.push(11);
 464    /// assert_eq!(vec.len(), 11);
 465    /// assert!(vec.capacity() >= 11);
 
 
 
 
 
 466    /// ```
 467    #[cfg(not(no_global_oom_handling))]
 468    #[inline]
 469    #[stable(feature = "rust1", since = "1.0.0")]
 470    #[must_use]
 471    pub fn with_capacity(capacity: usize) -> Self {
 472        Self::with_capacity_in(capacity, Global)
 473    }
 474
 475    /// Tries to construct a new, empty `Vec<T>` with the specified capacity.
 476    ///
 477    /// The vector will be able to hold exactly `capacity` elements without
 478    /// reallocating. If `capacity` is 0, the vector will not allocate.
 
 479    ///
 480    /// It is important to note that although the returned vector has the
 481    /// *capacity* specified, the vector will have a zero *length*. For an
 482    /// explanation of the difference between length and capacity, see
 483    /// *[Capacity and reallocation]*.
 484    ///
 
 
 
 
 
 
 485    /// [Capacity and reallocation]: #capacity-and-reallocation
 
 486    ///
 487    /// # Examples
 488    ///
 489    /// ```
 490    /// let mut vec = Vec::try_with_capacity(10).unwrap();
 491    ///
 492    /// // The vector contains no items, even though it has capacity for more
 493    /// assert_eq!(vec.len(), 0);
 494    /// assert_eq!(vec.capacity(), 10);
 495    ///
 496    /// // These are all done without reallocating...
 497    /// for i in 0..10 {
 498    ///     vec.push(i);
 499    /// }
 500    /// assert_eq!(vec.len(), 10);
 501    /// assert_eq!(vec.capacity(), 10);
 502    ///
 503    /// // ...but this may make the vector reallocate
 504    /// vec.push(11);
 505    /// assert_eq!(vec.len(), 11);
 506    /// assert!(vec.capacity() >= 11);
 507    ///
 508    /// let mut result = Vec::try_with_capacity(usize::MAX);
 509    /// assert!(result.is_err());
 
 
 
 
 
 510    /// ```
 511    #[inline]
 512    #[stable(feature = "kernel", since = "1.0.0")]
 513    pub fn try_with_capacity(capacity: usize) -> Result<Self, TryReserveError> {
 514        Self::try_with_capacity_in(capacity, Global)
 515    }
 516
 517    /// Creates a `Vec<T>` directly from the raw components of another vector.
 518    ///
 519    /// # Safety
 520    ///
 521    /// This is highly unsafe, due to the number of invariants that aren't
 522    /// checked:
 523    ///
 524    /// * `ptr` needs to have been previously allocated via [`String`]/`Vec<T>`
 525    ///   (at least, it's highly likely to be incorrect if it wasn't).
 526    /// * `T` needs to have the same alignment as what `ptr` was allocated with.
 527    ///   (`T` having a less strict alignment is not sufficient, the alignment really
 528    ///   needs to be equal to satisfy the [`dealloc`] requirement that memory must be
 529    ///   allocated and deallocated with the same layout.)
 530    /// * The size of `T` times the `capacity` (ie. the allocated size in bytes) needs
 531    ///   to be the same size as the pointer was allocated with. (Because similar to
 532    ///   alignment, [`dealloc`] must be called with the same layout `size`.)
 533    /// * `length` needs to be less than or equal to `capacity`.
 
 
 
 
 
 
 
 
 534    ///
 535    /// Violating these may cause problems like corrupting the allocator's
 536    /// internal data structures. For example it is normally **not** safe
 537    /// to build a `Vec<u8>` from a pointer to a C `char` array with length
 538    /// `size_t`, doing so is only safe if the array was initially allocated by
 539    /// a `Vec` or `String`.
 540    /// It's also not safe to build one from a `Vec<u16>` and its length, because
 541    /// the allocator cares about the alignment, and these two types have different
 542    /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
 543    /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1. To avoid
 544    /// these issues, it is often preferable to do casting/transmuting using
 545    /// [`slice::from_raw_parts`] instead.
 546    ///
 547    /// The ownership of `ptr` is effectively transferred to the
 548    /// `Vec<T>` which may then deallocate, reallocate or change the
 549    /// contents of memory pointed to by the pointer at will. Ensure
 550    /// that nothing else uses the pointer after calling this
 551    /// function.
 552    ///
 553    /// [`String`]: crate::string::String
 
 554    /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
 555    ///
 556    /// # Examples
 557    ///
 558    /// ```
 559    /// use std::ptr;
 560    /// use std::mem;
 561    ///
 562    /// let v = vec![1, 2, 3];
 563    ///
 564    // FIXME Update this when vec_into_raw_parts is stabilized
 565    /// // Prevent running `v`'s destructor so we are in complete control
 566    /// // of the allocation.
 567    /// let mut v = mem::ManuallyDrop::new(v);
 568    ///
 569    /// // Pull out the various important pieces of information about `v`
 570    /// let p = v.as_mut_ptr();
 571    /// let len = v.len();
 572    /// let cap = v.capacity();
 573    ///
 574    /// unsafe {
 575    ///     // Overwrite memory with 4, 5, 6
 576    ///     for i in 0..len as isize {
 577    ///         ptr::write(p.offset(i), 4 + i);
 578    ///     }
 579    ///
 580    ///     // Put everything back together into a Vec
 581    ///     let rebuilt = Vec::from_raw_parts(p, len, cap);
 582    ///     assert_eq!(rebuilt, [4, 5, 6]);
 583    /// }
 584    /// ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 585    #[inline]
 586    #[stable(feature = "rust1", since = "1.0.0")]
 587    pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self {
 588        unsafe { Self::from_raw_parts_in(ptr, length, capacity, Global) }
 589    }
 590}
 591
 592impl<T, A: Allocator> Vec<T, A> {
 593    /// Constructs a new, empty `Vec<T, A>`.
 594    ///
 595    /// The vector will not allocate until elements are pushed onto it.
 596    ///
 597    /// # Examples
 598    ///
 599    /// ```
 600    /// #![feature(allocator_api)]
 601    ///
 602    /// use std::alloc::System;
 603    ///
 604    /// # #[allow(unused_mut)]
 605    /// let mut vec: Vec<i32, _> = Vec::new_in(System);
 606    /// ```
 607    #[inline]
 608    #[unstable(feature = "allocator_api", issue = "32838")]
 609    pub const fn new_in(alloc: A) -> Self {
 610        Vec { buf: RawVec::new_in(alloc), len: 0 }
 611    }
 612
 613    /// Constructs a new, empty `Vec<T, A>` with the specified capacity with the provided
 614    /// allocator.
 615    ///
 616    /// The vector will be able to hold exactly `capacity` elements without
 617    /// reallocating. If `capacity` is 0, the vector will not allocate.
 
 618    ///
 619    /// It is important to note that although the returned vector has the
 620    /// *capacity* specified, the vector will have a zero *length*. For an
 621    /// explanation of the difference between length and capacity, see
 622    /// *[Capacity and reallocation]*.
 623    ///
 
 
 
 
 
 
 624    /// [Capacity and reallocation]: #capacity-and-reallocation
 
 625    ///
 626    /// # Panics
 627    ///
 628    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 629    ///
 630    /// # Examples
 631    ///
 632    /// ```
 633    /// #![feature(allocator_api)]
 634    ///
 635    /// use std::alloc::System;
 636    ///
 637    /// let mut vec = Vec::with_capacity_in(10, System);
 638    ///
 639    /// // The vector contains no items, even though it has capacity for more
 640    /// assert_eq!(vec.len(), 0);
 641    /// assert_eq!(vec.capacity(), 10);
 642    ///
 643    /// // These are all done without reallocating...
 644    /// for i in 0..10 {
 645    ///     vec.push(i);
 646    /// }
 647    /// assert_eq!(vec.len(), 10);
 648    /// assert_eq!(vec.capacity(), 10);
 649    ///
 650    /// // ...but this may make the vector reallocate
 651    /// vec.push(11);
 652    /// assert_eq!(vec.len(), 11);
 653    /// assert!(vec.capacity() >= 11);
 
 
 
 
 
 654    /// ```
 655    #[cfg(not(no_global_oom_handling))]
 656    #[inline]
 657    #[unstable(feature = "allocator_api", issue = "32838")]
 658    pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
 659        Vec { buf: RawVec::with_capacity_in(capacity, alloc), len: 0 }
 660    }
 661
 662    /// Tries to construct a new, empty `Vec<T, A>` with the specified capacity
 663    /// with the provided allocator.
 664    ///
 665    /// The vector will be able to hold exactly `capacity` elements without
 666    /// reallocating. If `capacity` is 0, the vector will not allocate.
 
 667    ///
 668    /// It is important to note that although the returned vector has the
 669    /// *capacity* specified, the vector will have a zero *length*. For an
 670    /// explanation of the difference between length and capacity, see
 671    /// *[Capacity and reallocation]*.
 672    ///
 
 
 
 
 
 
 673    /// [Capacity and reallocation]: #capacity-and-reallocation
 
 674    ///
 675    /// # Examples
 676    ///
 677    /// ```
 678    /// #![feature(allocator_api)]
 679    ///
 680    /// use std::alloc::System;
 681    ///
 682    /// let mut vec = Vec::try_with_capacity_in(10, System).unwrap();
 683    ///
 684    /// // The vector contains no items, even though it has capacity for more
 685    /// assert_eq!(vec.len(), 0);
 686    /// assert_eq!(vec.capacity(), 10);
 687    ///
 688    /// // These are all done without reallocating...
 689    /// for i in 0..10 {
 690    ///     vec.push(i);
 691    /// }
 692    /// assert_eq!(vec.len(), 10);
 693    /// assert_eq!(vec.capacity(), 10);
 694    ///
 695    /// // ...but this may make the vector reallocate
 696    /// vec.push(11);
 697    /// assert_eq!(vec.len(), 11);
 698    /// assert!(vec.capacity() >= 11);
 699    ///
 700    /// let mut result = Vec::try_with_capacity_in(usize::MAX, System);
 701    /// assert!(result.is_err());
 
 
 
 
 
 702    /// ```
 703    #[inline]
 704    #[stable(feature = "kernel", since = "1.0.0")]
 705    pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result<Self, TryReserveError> {
 706        Ok(Vec { buf: RawVec::try_with_capacity_in(capacity, alloc)?, len: 0 })
 707    }
 708
 709    /// Creates a `Vec<T, A>` directly from the raw components of another vector.
 
 710    ///
 711    /// # Safety
 712    ///
 713    /// This is highly unsafe, due to the number of invariants that aren't
 714    /// checked:
 715    ///
 716    /// * `ptr` needs to have been previously allocated via [`String`]/`Vec<T>`
 717    ///   (at least, it's highly likely to be incorrect if it wasn't).
 718    /// * `T` needs to have the same size and alignment as what `ptr` was allocated with.
 719    ///   (`T` having a less strict alignment is not sufficient, the alignment really
 720    ///   needs to be equal to satisfy the [`dealloc`] requirement that memory must be
 721    ///   allocated and deallocated with the same layout.)
 
 
 
 722    /// * `length` needs to be less than or equal to `capacity`.
 723    /// * `capacity` needs to be the capacity that the pointer was allocated with.
 
 
 
 
 
 
 
 724    ///
 725    /// Violating these may cause problems like corrupting the allocator's
 726    /// internal data structures. For example it is **not** safe
 727    /// to build a `Vec<u8>` from a pointer to a C `char` array with length `size_t`.
 728    /// It's also not safe to build one from a `Vec<u16>` and its length, because
 729    /// the allocator cares about the alignment, and these two types have different
 730    /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
 731    /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1.
 732    ///
 733    /// The ownership of `ptr` is effectively transferred to the
 734    /// `Vec<T>` which may then deallocate, reallocate or change the
 735    /// contents of memory pointed to by the pointer at will. Ensure
 736    /// that nothing else uses the pointer after calling this
 737    /// function.
 738    ///
 739    /// [`String`]: crate::string::String
 740    /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc
 
 
 741    ///
 742    /// # Examples
 743    ///
 744    /// ```
 745    /// #![feature(allocator_api)]
 746    ///
 747    /// use std::alloc::System;
 748    ///
 749    /// use std::ptr;
 750    /// use std::mem;
 751    ///
 752    /// let mut v = Vec::with_capacity_in(3, System);
 753    /// v.push(1);
 754    /// v.push(2);
 755    /// v.push(3);
 756    ///
 757    // FIXME Update this when vec_into_raw_parts is stabilized
 758    /// // Prevent running `v`'s destructor so we are in complete control
 759    /// // of the allocation.
 760    /// let mut v = mem::ManuallyDrop::new(v);
 761    ///
 762    /// // Pull out the various important pieces of information about `v`
 763    /// let p = v.as_mut_ptr();
 764    /// let len = v.len();
 765    /// let cap = v.capacity();
 766    /// let alloc = v.allocator();
 767    ///
 768    /// unsafe {
 769    ///     // Overwrite memory with 4, 5, 6
 770    ///     for i in 0..len as isize {
 771    ///         ptr::write(p.offset(i), 4 + i);
 772    ///     }
 773    ///
 774    ///     // Put everything back together into a Vec
 775    ///     let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());
 776    ///     assert_eq!(rebuilt, [4, 5, 6]);
 777    /// }
 778    /// ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 779    #[inline]
 780    #[unstable(feature = "allocator_api", issue = "32838")]
 781    pub unsafe fn from_raw_parts_in(ptr: *mut T, length: usize, capacity: usize, alloc: A) -> Self {
 782        unsafe { Vec { buf: RawVec::from_raw_parts_in(ptr, capacity, alloc), len: length } }
 783    }
 784
 785    /// Decomposes a `Vec<T>` into its raw components.
 786    ///
 787    /// Returns the raw pointer to the underlying data, the length of
 788    /// the vector (in elements), and the allocated capacity of the
 789    /// data (in elements). These are the same arguments in the same
 790    /// order as the arguments to [`from_raw_parts`].
 791    ///
 792    /// After calling this function, the caller is responsible for the
 793    /// memory previously managed by the `Vec`. The only way to do
 794    /// this is to convert the raw pointer, length, and capacity back
 795    /// into a `Vec` with the [`from_raw_parts`] function, allowing
 796    /// the destructor to perform the cleanup.
 797    ///
 798    /// [`from_raw_parts`]: Vec::from_raw_parts
 799    ///
 800    /// # Examples
 801    ///
 802    /// ```
 803    /// #![feature(vec_into_raw_parts)]
 804    /// let v: Vec<i32> = vec![-1, 0, 1];
 805    ///
 806    /// let (ptr, len, cap) = v.into_raw_parts();
 807    ///
 808    /// let rebuilt = unsafe {
 809    ///     // We can now make changes to the components, such as
 810    ///     // transmuting the raw pointer to a compatible type.
 811    ///     let ptr = ptr as *mut u32;
 812    ///
 813    ///     Vec::from_raw_parts(ptr, len, cap)
 814    /// };
 815    /// assert_eq!(rebuilt, [4294967295, 0, 1]);
 816    /// ```
 817    #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
 818    pub fn into_raw_parts(self) -> (*mut T, usize, usize) {
 819        let mut me = ManuallyDrop::new(self);
 820        (me.as_mut_ptr(), me.len(), me.capacity())
 821    }
 822
 823    /// Decomposes a `Vec<T>` into its raw components.
 824    ///
 825    /// Returns the raw pointer to the underlying data, the length of the vector (in elements),
 826    /// the allocated capacity of the data (in elements), and the allocator. These are the same
 827    /// arguments in the same order as the arguments to [`from_raw_parts_in`].
 828    ///
 829    /// After calling this function, the caller is responsible for the
 830    /// memory previously managed by the `Vec`. The only way to do
 831    /// this is to convert the raw pointer, length, and capacity back
 832    /// into a `Vec` with the [`from_raw_parts_in`] function, allowing
 833    /// the destructor to perform the cleanup.
 834    ///
 835    /// [`from_raw_parts_in`]: Vec::from_raw_parts_in
 836    ///
 837    /// # Examples
 838    ///
 839    /// ```
 840    /// #![feature(allocator_api, vec_into_raw_parts)]
 841    ///
 842    /// use std::alloc::System;
 843    ///
 844    /// let mut v: Vec<i32, System> = Vec::new_in(System);
 845    /// v.push(-1);
 846    /// v.push(0);
 847    /// v.push(1);
 848    ///
 849    /// let (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();
 850    ///
 851    /// let rebuilt = unsafe {
 852    ///     // We can now make changes to the components, such as
 853    ///     // transmuting the raw pointer to a compatible type.
 854    ///     let ptr = ptr as *mut u32;
 855    ///
 856    ///     Vec::from_raw_parts_in(ptr, len, cap, alloc)
 857    /// };
 858    /// assert_eq!(rebuilt, [4294967295, 0, 1]);
 859    /// ```
 860    #[unstable(feature = "allocator_api", issue = "32838")]
 861    // #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
 862    pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A) {
 863        let mut me = ManuallyDrop::new(self);
 864        let len = me.len();
 865        let capacity = me.capacity();
 866        let ptr = me.as_mut_ptr();
 867        let alloc = unsafe { ptr::read(me.allocator()) };
 868        (ptr, len, capacity, alloc)
 869    }
 870
 871    /// Returns the number of elements the vector can hold without
 872    /// reallocating.
 873    ///
 874    /// # Examples
 875    ///
 876    /// ```
 877    /// let vec: Vec<i32> = Vec::with_capacity(10);
 878    /// assert_eq!(vec.capacity(), 10);
 
 879    /// ```
 880    #[inline]
 881    #[stable(feature = "rust1", since = "1.0.0")]
 882    pub fn capacity(&self) -> usize {
 883        self.buf.capacity()
 884    }
 885
 886    /// Reserves capacity for at least `additional` more elements to be inserted
 887    /// in the given `Vec<T>`. The collection may reserve more space to avoid
 888    /// frequent reallocations. After calling `reserve`, capacity will be
 889    /// greater than or equal to `self.len() + additional`. Does nothing if
 890    /// capacity is already sufficient.
 891    ///
 892    /// # Panics
 893    ///
 894    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 895    ///
 896    /// # Examples
 897    ///
 898    /// ```
 899    /// let mut vec = vec![1];
 900    /// vec.reserve(10);
 901    /// assert!(vec.capacity() >= 11);
 902    /// ```
 903    #[cfg(not(no_global_oom_handling))]
 904    #[stable(feature = "rust1", since = "1.0.0")]
 905    pub fn reserve(&mut self, additional: usize) {
 906        self.buf.reserve(self.len, additional);
 907    }
 908
 909    /// Reserves the minimum capacity for exactly `additional` more elements to
 910    /// be inserted in the given `Vec<T>`. After calling `reserve_exact`,
 911    /// capacity will be greater than or equal to `self.len() + additional`.
 912    /// Does nothing if the capacity is already sufficient.
 
 
 913    ///
 914    /// Note that the allocator may give the collection more space than it
 915    /// requests. Therefore, capacity can not be relied upon to be precisely
 916    /// minimal. Prefer [`reserve`] if future insertions are expected.
 917    ///
 918    /// [`reserve`]: Vec::reserve
 919    ///
 920    /// # Panics
 921    ///
 922    /// Panics if the new capacity exceeds `isize::MAX` bytes.
 923    ///
 924    /// # Examples
 925    ///
 926    /// ```
 927    /// let mut vec = vec![1];
 928    /// vec.reserve_exact(10);
 929    /// assert!(vec.capacity() >= 11);
 930    /// ```
 931    #[cfg(not(no_global_oom_handling))]
 932    #[stable(feature = "rust1", since = "1.0.0")]
 933    pub fn reserve_exact(&mut self, additional: usize) {
 934        self.buf.reserve_exact(self.len, additional);
 935    }
 936
 937    /// Tries to reserve capacity for at least `additional` more elements to be inserted
 938    /// in the given `Vec<T>`. The collection may reserve more space to avoid
 939    /// frequent reallocations. After calling `try_reserve`, capacity will be
 940    /// greater than or equal to `self.len() + additional`. Does nothing if
 941    /// capacity is already sufficient.
 
 942    ///
 943    /// # Errors
 944    ///
 945    /// If the capacity overflows, or the allocator reports a failure, then an error
 946    /// is returned.
 947    ///
 948    /// # Examples
 949    ///
 950    /// ```
 951    /// use std::collections::TryReserveError;
 952    ///
 953    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
 954    ///     let mut output = Vec::new();
 955    ///
 956    ///     // Pre-reserve the memory, exiting if we can't
 957    ///     output.try_reserve(data.len())?;
 958    ///
 959    ///     // Now we know this can't OOM in the middle of our complex work
 960    ///     output.extend(data.iter().map(|&val| {
 961    ///         val * 2 + 5 // very complicated
 962    ///     }));
 963    ///
 964    ///     Ok(output)
 965    /// }
 966    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
 967    /// ```
 968    #[stable(feature = "try_reserve", since = "1.57.0")]
 969    pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
 970        self.buf.try_reserve(self.len, additional)
 971    }
 972
 973    /// Tries to reserve the minimum capacity for exactly `additional`
 974    /// elements to be inserted in the given `Vec<T>`. After calling
 975    /// `try_reserve_exact`, capacity will be greater than or equal to
 976    /// `self.len() + additional` if it returns `Ok(())`.
 
 977    /// Does nothing if the capacity is already sufficient.
 978    ///
 979    /// Note that the allocator may give the collection more space than it
 980    /// requests. Therefore, capacity can not be relied upon to be precisely
 981    /// minimal. Prefer [`try_reserve`] if future insertions are expected.
 982    ///
 983    /// [`try_reserve`]: Vec::try_reserve
 984    ///
 985    /// # Errors
 986    ///
 987    /// If the capacity overflows, or the allocator reports a failure, then an error
 988    /// is returned.
 989    ///
 990    /// # Examples
 991    ///
 992    /// ```
 993    /// use std::collections::TryReserveError;
 994    ///
 995    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
 996    ///     let mut output = Vec::new();
 997    ///
 998    ///     // Pre-reserve the memory, exiting if we can't
 999    ///     output.try_reserve_exact(data.len())?;
1000    ///
1001    ///     // Now we know this can't OOM in the middle of our complex work
1002    ///     output.extend(data.iter().map(|&val| {
1003    ///         val * 2 + 5 // very complicated
1004    ///     }));
1005    ///
1006    ///     Ok(output)
1007    /// }
1008    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
1009    /// ```
1010    #[stable(feature = "try_reserve", since = "1.57.0")]
1011    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
1012        self.buf.try_reserve_exact(self.len, additional)
1013    }
1014
1015    /// Shrinks the capacity of the vector as much as possible.
1016    ///
1017    /// It will drop down as close as possible to the length but the allocator
1018    /// may still inform the vector that there is space for a few more elements.
1019    ///
1020    /// # Examples
1021    ///
1022    /// ```
1023    /// let mut vec = Vec::with_capacity(10);
1024    /// vec.extend([1, 2, 3]);
1025    /// assert_eq!(vec.capacity(), 10);
1026    /// vec.shrink_to_fit();
1027    /// assert!(vec.capacity() >= 3);
1028    /// ```
1029    #[cfg(not(no_global_oom_handling))]
1030    #[stable(feature = "rust1", since = "1.0.0")]
1031    pub fn shrink_to_fit(&mut self) {
1032        // The capacity is never less than the length, and there's nothing to do when
1033        // they are equal, so we can avoid the panic case in `RawVec::shrink_to_fit`
1034        // by only calling it with a greater capacity.
1035        if self.capacity() > self.len {
1036            self.buf.shrink_to_fit(self.len);
1037        }
1038    }
1039
1040    /// Shrinks the capacity of the vector with a lower bound.
1041    ///
1042    /// The capacity will remain at least as large as both the length
1043    /// and the supplied value.
1044    ///
1045    /// If the current capacity is less than the lower limit, this is a no-op.
1046    ///
1047    /// # Examples
1048    ///
1049    /// ```
1050    /// let mut vec = Vec::with_capacity(10);
1051    /// vec.extend([1, 2, 3]);
1052    /// assert_eq!(vec.capacity(), 10);
1053    /// vec.shrink_to(4);
1054    /// assert!(vec.capacity() >= 4);
1055    /// vec.shrink_to(0);
1056    /// assert!(vec.capacity() >= 3);
1057    /// ```
1058    #[cfg(not(no_global_oom_handling))]
1059    #[stable(feature = "shrink_to", since = "1.56.0")]
1060    pub fn shrink_to(&mut self, min_capacity: usize) {
1061        if self.capacity() > min_capacity {
1062            self.buf.shrink_to_fit(cmp::max(self.len, min_capacity));
1063        }
1064    }
1065
1066    /// Converts the vector into [`Box<[T]>`][owned slice].
1067    ///
1068    /// Note that this will drop any excess capacity.
 
1069    ///
1070    /// [owned slice]: Box
1071    ///
1072    /// # Examples
1073    ///
1074    /// ```
1075    /// let v = vec![1, 2, 3];
1076    ///
1077    /// let slice = v.into_boxed_slice();
1078    /// ```
1079    ///
1080    /// Any excess capacity is removed:
1081    ///
1082    /// ```
1083    /// let mut vec = Vec::with_capacity(10);
1084    /// vec.extend([1, 2, 3]);
1085    ///
1086    /// assert_eq!(vec.capacity(), 10);
1087    /// let slice = vec.into_boxed_slice();
1088    /// assert_eq!(slice.into_vec().capacity(), 3);
1089    /// ```
1090    #[cfg(not(no_global_oom_handling))]
1091    #[stable(feature = "rust1", since = "1.0.0")]
1092    pub fn into_boxed_slice(mut self) -> Box<[T], A> {
1093        unsafe {
1094            self.shrink_to_fit();
1095            let me = ManuallyDrop::new(self);
1096            let buf = ptr::read(&me.buf);
1097            let len = me.len();
1098            buf.into_box(len).assume_init()
1099        }
1100    }
1101
1102    /// Shortens the vector, keeping the first `len` elements and dropping
1103    /// the rest.
1104    ///
1105    /// If `len` is greater than the vector's current length, this has no
1106    /// effect.
1107    ///
1108    /// The [`drain`] method can emulate `truncate`, but causes the excess
1109    /// elements to be returned instead of dropped.
1110    ///
1111    /// Note that this method has no effect on the allocated capacity
1112    /// of the vector.
1113    ///
1114    /// # Examples
1115    ///
1116    /// Truncating a five element vector to two elements:
1117    ///
1118    /// ```
1119    /// let mut vec = vec![1, 2, 3, 4, 5];
1120    /// vec.truncate(2);
1121    /// assert_eq!(vec, [1, 2]);
1122    /// ```
1123    ///
1124    /// No truncation occurs when `len` is greater than the vector's current
1125    /// length:
1126    ///
1127    /// ```
1128    /// let mut vec = vec![1, 2, 3];
1129    /// vec.truncate(8);
1130    /// assert_eq!(vec, [1, 2, 3]);
1131    /// ```
1132    ///
1133    /// Truncating when `len == 0` is equivalent to calling the [`clear`]
1134    /// method.
1135    ///
1136    /// ```
1137    /// let mut vec = vec![1, 2, 3];
1138    /// vec.truncate(0);
1139    /// assert_eq!(vec, []);
1140    /// ```
1141    ///
1142    /// [`clear`]: Vec::clear
1143    /// [`drain`]: Vec::drain
1144    #[stable(feature = "rust1", since = "1.0.0")]
1145    pub fn truncate(&mut self, len: usize) {
1146        // This is safe because:
1147        //
1148        // * the slice passed to `drop_in_place` is valid; the `len > self.len`
1149        //   case avoids creating an invalid slice, and
1150        // * the `len` of the vector is shrunk before calling `drop_in_place`,
1151        //   such that no value will be dropped twice in case `drop_in_place`
1152        //   were to panic once (if it panics twice, the program aborts).
1153        unsafe {
1154            // Note: It's intentional that this is `>` and not `>=`.
1155            //       Changing it to `>=` has negative performance
1156            //       implications in some cases. See #78884 for more.
1157            if len > self.len {
1158                return;
1159            }
1160            let remaining_len = self.len - len;
1161            let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
1162            self.len = len;
1163            ptr::drop_in_place(s);
1164        }
1165    }
1166
1167    /// Extracts a slice containing the entire vector.
1168    ///
1169    /// Equivalent to `&s[..]`.
1170    ///
1171    /// # Examples
1172    ///
1173    /// ```
1174    /// use std::io::{self, Write};
1175    /// let buffer = vec![1, 2, 3, 5, 8];
1176    /// io::sink().write(buffer.as_slice()).unwrap();
1177    /// ```
1178    #[inline]
1179    #[stable(feature = "vec_as_slice", since = "1.7.0")]
1180    pub fn as_slice(&self) -> &[T] {
1181        self
1182    }
1183
1184    /// Extracts a mutable slice of the entire vector.
1185    ///
1186    /// Equivalent to `&mut s[..]`.
1187    ///
1188    /// # Examples
1189    ///
1190    /// ```
1191    /// use std::io::{self, Read};
1192    /// let mut buffer = vec![0; 3];
1193    /// io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
1194    /// ```
1195    #[inline]
1196    #[stable(feature = "vec_as_slice", since = "1.7.0")]
1197    pub fn as_mut_slice(&mut self) -> &mut [T] {
1198        self
1199    }
1200
1201    /// Returns a raw pointer to the vector's buffer.
 
1202    ///
1203    /// The caller must ensure that the vector outlives the pointer this
1204    /// function returns, or else it will end up pointing to garbage.
1205    /// Modifying the vector may cause its buffer to be reallocated,
1206    /// which would also make any pointers to it invalid.
1207    ///
1208    /// The caller must also ensure that the memory the pointer (non-transitively) points to
1209    /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
1210    /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
1211    ///
 
 
 
 
 
 
 
 
 
1212    /// # Examples
1213    ///
1214    /// ```
1215    /// let x = vec![1, 2, 4];
1216    /// let x_ptr = x.as_ptr();
1217    ///
1218    /// unsafe {
1219    ///     for i in 0..x.len() {
1220    ///         assert_eq!(*x_ptr.add(i), 1 << i);
1221    ///     }
1222    /// }
1223    /// ```
1224    ///
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1225    /// [`as_mut_ptr`]: Vec::as_mut_ptr
 
1226    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
 
1227    #[inline]
1228    pub fn as_ptr(&self) -> *const T {
1229        // We shadow the slice method of the same name to avoid going through
1230        // `deref`, which creates an intermediate reference.
1231        let ptr = self.buf.ptr();
1232        unsafe {
1233            assume(!ptr.is_null());
1234        }
1235        ptr
1236    }
1237
1238    /// Returns an unsafe mutable pointer to the vector's buffer.
 
1239    ///
1240    /// The caller must ensure that the vector outlives the pointer this
1241    /// function returns, or else it will end up pointing to garbage.
1242    /// Modifying the vector may cause its buffer to be reallocated,
1243    /// which would also make any pointers to it invalid.
1244    ///
 
 
 
 
 
 
 
 
 
1245    /// # Examples
1246    ///
1247    /// ```
1248    /// // Allocate vector big enough for 4 elements.
1249    /// let size = 4;
1250    /// let mut x: Vec<i32> = Vec::with_capacity(size);
1251    /// let x_ptr = x.as_mut_ptr();
1252    ///
1253    /// // Initialize elements via raw pointer writes, then set length.
1254    /// unsafe {
1255    ///     for i in 0..size {
1256    ///         *x_ptr.add(i) = i as i32;
1257    ///     }
1258    ///     x.set_len(size);
1259    /// }
1260    /// assert_eq!(&*x, &[0, 1, 2, 3]);
1261    /// ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1262    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
 
1263    #[inline]
1264    pub fn as_mut_ptr(&mut self) -> *mut T {
1265        // We shadow the slice method of the same name to avoid going through
1266        // `deref_mut`, which creates an intermediate reference.
1267        let ptr = self.buf.ptr();
1268        unsafe {
1269            assume(!ptr.is_null());
1270        }
1271        ptr
1272    }
1273
1274    /// Returns a reference to the underlying allocator.
1275    #[unstable(feature = "allocator_api", issue = "32838")]
1276    #[inline]
1277    pub fn allocator(&self) -> &A {
1278        self.buf.allocator()
1279    }
1280
1281    /// Forces the length of the vector to `new_len`.
1282    ///
1283    /// This is a low-level operation that maintains none of the normal
1284    /// invariants of the type. Normally changing the length of a vector
1285    /// is done using one of the safe operations instead, such as
1286    /// [`truncate`], [`resize`], [`extend`], or [`clear`].
1287    ///
1288    /// [`truncate`]: Vec::truncate
1289    /// [`resize`]: Vec::resize
1290    /// [`extend`]: Extend::extend
1291    /// [`clear`]: Vec::clear
1292    ///
1293    /// # Safety
1294    ///
1295    /// - `new_len` must be less than or equal to [`capacity()`].
1296    /// - The elements at `old_len..new_len` must be initialized.
1297    ///
1298    /// [`capacity()`]: Vec::capacity
1299    ///
1300    /// # Examples
1301    ///
1302    /// This method can be useful for situations in which the vector
1303    /// is serving as a buffer for other code, particularly over FFI:
1304    ///
1305    /// ```no_run
1306    /// # #![allow(dead_code)]
1307    /// # // This is just a minimal skeleton for the doc example;
1308    /// # // don't use this as a starting point for a real library.
1309    /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void }
1310    /// # const Z_OK: i32 = 0;
1311    /// # extern "C" {
1312    /// #     fn deflateGetDictionary(
1313    /// #         strm: *mut std::ffi::c_void,
1314    /// #         dictionary: *mut u8,
1315    /// #         dictLength: *mut usize,
1316    /// #     ) -> i32;
1317    /// # }
1318    /// # impl StreamWrapper {
1319    /// pub fn get_dictionary(&self) -> Option<Vec<u8>> {
1320    ///     // Per the FFI method's docs, "32768 bytes is always enough".
1321    ///     let mut dict = Vec::with_capacity(32_768);
1322    ///     let mut dict_length = 0;
1323    ///     // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
1324    ///     // 1. `dict_length` elements were initialized.
1325    ///     // 2. `dict_length` <= the capacity (32_768)
1326    ///     // which makes `set_len` safe to call.
1327    ///     unsafe {
1328    ///         // Make the FFI call...
1329    ///         let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
1330    ///         if r == Z_OK {
1331    ///             // ...and update the length to what was initialized.
1332    ///             dict.set_len(dict_length);
1333    ///             Some(dict)
1334    ///         } else {
1335    ///             None
1336    ///         }
1337    ///     }
1338    /// }
1339    /// # }
1340    /// ```
1341    ///
1342    /// While the following example is sound, there is a memory leak since
1343    /// the inner vectors were not freed prior to the `set_len` call:
1344    ///
1345    /// ```
1346    /// let mut vec = vec![vec![1, 0, 0],
1347    ///                    vec![0, 1, 0],
1348    ///                    vec![0, 0, 1]];
1349    /// // SAFETY:
1350    /// // 1. `old_len..0` is empty so no elements need to be initialized.
1351    /// // 2. `0 <= capacity` always holds whatever `capacity` is.
1352    /// unsafe {
1353    ///     vec.set_len(0);
1354    /// }
1355    /// ```
1356    ///
1357    /// Normally, here, one would use [`clear`] instead to correctly drop
1358    /// the contents and thus not leak memory.
1359    #[inline]
1360    #[stable(feature = "rust1", since = "1.0.0")]
1361    pub unsafe fn set_len(&mut self, new_len: usize) {
1362        debug_assert!(new_len <= self.capacity());
1363
1364        self.len = new_len;
1365    }
1366
1367    /// Removes an element from the vector and returns it.
1368    ///
1369    /// The removed element is replaced by the last element of the vector.
1370    ///
1371    /// This does not preserve ordering, but is *O*(1).
1372    /// If you need to preserve the element order, use [`remove`] instead.
1373    ///
1374    /// [`remove`]: Vec::remove
1375    ///
1376    /// # Panics
1377    ///
1378    /// Panics if `index` is out of bounds.
1379    ///
1380    /// # Examples
1381    ///
1382    /// ```
1383    /// let mut v = vec!["foo", "bar", "baz", "qux"];
1384    ///
1385    /// assert_eq!(v.swap_remove(1), "bar");
1386    /// assert_eq!(v, ["foo", "qux", "baz"]);
1387    ///
1388    /// assert_eq!(v.swap_remove(0), "foo");
1389    /// assert_eq!(v, ["baz", "qux"]);
1390    /// ```
1391    #[inline]
1392    #[stable(feature = "rust1", since = "1.0.0")]
1393    pub fn swap_remove(&mut self, index: usize) -> T {
1394        #[cold]
1395        #[inline(never)]
1396        fn assert_failed(index: usize, len: usize) -> ! {
1397            panic!("swap_remove index (is {index}) should be < len (is {len})");
1398        }
1399
1400        let len = self.len();
1401        if index >= len {
1402            assert_failed(index, len);
1403        }
1404        unsafe {
1405            // We replace self[index] with the last element. Note that if the
1406            // bounds check above succeeds there must be a last element (which
1407            // can be self[index] itself).
1408            let value = ptr::read(self.as_ptr().add(index));
1409            let base_ptr = self.as_mut_ptr();
1410            ptr::copy(base_ptr.add(len - 1), base_ptr.add(index), 1);
1411            self.set_len(len - 1);
1412            value
1413        }
1414    }
1415
1416    /// Inserts an element at position `index` within the vector, shifting all
1417    /// elements after it to the right.
1418    ///
1419    /// # Panics
1420    ///
1421    /// Panics if `index > len`.
1422    ///
1423    /// # Examples
1424    ///
1425    /// ```
1426    /// let mut vec = vec![1, 2, 3];
1427    /// vec.insert(1, 4);
1428    /// assert_eq!(vec, [1, 4, 2, 3]);
1429    /// vec.insert(4, 5);
1430    /// assert_eq!(vec, [1, 4, 2, 3, 5]);
1431    /// ```
1432    #[cfg(not(no_global_oom_handling))]
1433    #[stable(feature = "rust1", since = "1.0.0")]
1434    pub fn insert(&mut self, index: usize, element: T) {
1435        #[cold]
1436        #[inline(never)]
1437        fn assert_failed(index: usize, len: usize) -> ! {
1438            panic!("insertion index (is {index}) should be <= len (is {len})");
1439        }
1440
1441        let len = self.len();
1442        if index > len {
1443            assert_failed(index, len);
1444        }
1445
1446        // space for the new element
1447        if len == self.buf.capacity() {
1448            self.reserve(1);
1449        }
1450
1451        unsafe {
1452            // infallible
1453            // The spot to put the new value
1454            {
1455                let p = self.as_mut_ptr().add(index);
1456                // Shift everything over to make space. (Duplicating the
1457                // `index`th element into two consecutive places.)
1458                ptr::copy(p, p.offset(1), len - index);
 
 
 
 
 
 
1459                // Write it in, overwriting the first copy of the `index`th
1460                // element.
1461                ptr::write(p, element);
1462            }
1463            self.set_len(len + 1);
1464        }
1465    }
1466
1467    /// Removes and returns the element at position `index` within the vector,
1468    /// shifting all elements after it to the left.
1469    ///
1470    /// Note: Because this shifts over the remaining elements, it has a
1471    /// worst-case performance of *O*(*n*). If you don't need the order of elements
1472    /// to be preserved, use [`swap_remove`] instead. If you'd like to remove
1473    /// elements from the beginning of the `Vec`, consider using
1474    /// [`VecDeque::pop_front`] instead.
1475    ///
1476    /// [`swap_remove`]: Vec::swap_remove
1477    /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
1478    ///
1479    /// # Panics
1480    ///
1481    /// Panics if `index` is out of bounds.
1482    ///
1483    /// # Examples
1484    ///
1485    /// ```
1486    /// let mut v = vec![1, 2, 3];
1487    /// assert_eq!(v.remove(1), 2);
1488    /// assert_eq!(v, [1, 3]);
1489    /// ```
1490    #[stable(feature = "rust1", since = "1.0.0")]
1491    #[track_caller]
1492    pub fn remove(&mut self, index: usize) -> T {
1493        #[cold]
1494        #[inline(never)]
1495        #[track_caller]
1496        fn assert_failed(index: usize, len: usize) -> ! {
1497            panic!("removal index (is {index}) should be < len (is {len})");
1498        }
1499
1500        let len = self.len();
1501        if index >= len {
1502            assert_failed(index, len);
1503        }
1504        unsafe {
1505            // infallible
1506            let ret;
1507            {
1508                // the place we are taking from.
1509                let ptr = self.as_mut_ptr().add(index);
1510                // copy it out, unsafely having a copy of the value on
1511                // the stack and in the vector at the same time.
1512                ret = ptr::read(ptr);
1513
1514                // Shift everything down to fill in that spot.
1515                ptr::copy(ptr.offset(1), ptr, len - index - 1);
1516            }
1517            self.set_len(len - 1);
1518            ret
1519        }
1520    }
1521
1522    /// Retains only the elements specified by the predicate.
1523    ///
1524    /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
1525    /// This method operates in place, visiting each element exactly once in the
1526    /// original order, and preserves the order of the retained elements.
1527    ///
1528    /// # Examples
1529    ///
1530    /// ```
1531    /// let mut vec = vec![1, 2, 3, 4];
1532    /// vec.retain(|&x| x % 2 == 0);
1533    /// assert_eq!(vec, [2, 4]);
1534    /// ```
1535    ///
1536    /// Because the elements are visited exactly once in the original order,
1537    /// external state may be used to decide which elements to keep.
1538    ///
1539    /// ```
1540    /// let mut vec = vec![1, 2, 3, 4, 5];
1541    /// let keep = [false, true, true, false, true];
1542    /// let mut iter = keep.iter();
1543    /// vec.retain(|_| *iter.next().unwrap());
1544    /// assert_eq!(vec, [2, 3, 5]);
1545    /// ```
1546    #[stable(feature = "rust1", since = "1.0.0")]
1547    pub fn retain<F>(&mut self, mut f: F)
1548    where
1549        F: FnMut(&T) -> bool,
1550    {
1551        self.retain_mut(|elem| f(elem));
1552    }
1553
1554    /// Retains only the elements specified by the predicate, passing a mutable reference to it.
1555    ///
1556    /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
1557    /// This method operates in place, visiting each element exactly once in the
1558    /// original order, and preserves the order of the retained elements.
1559    ///
1560    /// # Examples
1561    ///
1562    /// ```
1563    /// let mut vec = vec![1, 2, 3, 4];
1564    /// vec.retain_mut(|x| if *x > 3 {
1565    ///     false
1566    /// } else {
1567    ///     *x += 1;
1568    ///     true
 
 
1569    /// });
1570    /// assert_eq!(vec, [2, 3, 4]);
1571    /// ```
1572    #[stable(feature = "vec_retain_mut", since = "1.61.0")]
1573    pub fn retain_mut<F>(&mut self, mut f: F)
1574    where
1575        F: FnMut(&mut T) -> bool,
1576    {
1577        let original_len = self.len();
1578        // Avoid double drop if the drop guard is not executed,
1579        // since we may make some holes during the process.
1580        unsafe { self.set_len(0) };
1581
1582        // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked]
1583        //      |<-              processed len   ->| ^- next to check
1584        //                  |<-  deleted cnt     ->|
1585        //      |<-              original_len                          ->|
1586        // Kept: Elements which predicate returns true on.
1587        // Hole: Moved or dropped element slot.
1588        // Unchecked: Unchecked valid elements.
1589        //
1590        // This drop guard will be invoked when predicate or `drop` of element panicked.
1591        // It shifts unchecked elements to cover holes and `set_len` to the correct length.
1592        // In cases when predicate and `drop` never panick, it will be optimized out.
1593        struct BackshiftOnDrop<'a, T, A: Allocator> {
1594            v: &'a mut Vec<T, A>,
1595            processed_len: usize,
1596            deleted_cnt: usize,
1597            original_len: usize,
1598        }
1599
1600        impl<T, A: Allocator> Drop for BackshiftOnDrop<'_, T, A> {
1601            fn drop(&mut self) {
1602                if self.deleted_cnt > 0 {
1603                    // SAFETY: Trailing unchecked items must be valid since we never touch them.
1604                    unsafe {
1605                        ptr::copy(
1606                            self.v.as_ptr().add(self.processed_len),
1607                            self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt),
1608                            self.original_len - self.processed_len,
1609                        );
1610                    }
1611                }
1612                // SAFETY: After filling holes, all items are in contiguous memory.
1613                unsafe {
1614                    self.v.set_len(self.original_len - self.deleted_cnt);
1615                }
1616            }
1617        }
1618
1619        let mut g = BackshiftOnDrop { v: self, processed_len: 0, deleted_cnt: 0, original_len };
1620
1621        fn process_loop<F, T, A: Allocator, const DELETED: bool>(
1622            original_len: usize,
1623            f: &mut F,
1624            g: &mut BackshiftOnDrop<'_, T, A>,
1625        ) where
1626            F: FnMut(&mut T) -> bool,
1627        {
1628            while g.processed_len != original_len {
1629                // SAFETY: Unchecked element must be valid.
1630                let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) };
1631                if !f(cur) {
1632                    // Advance early to avoid double drop if `drop_in_place` panicked.
1633                    g.processed_len += 1;
1634                    g.deleted_cnt += 1;
1635                    // SAFETY: We never touch this element again after dropped.
1636                    unsafe { ptr::drop_in_place(cur) };
1637                    // We already advanced the counter.
1638                    if DELETED {
1639                        continue;
1640                    } else {
1641                        break;
1642                    }
1643                }
1644                if DELETED {
1645                    // SAFETY: `deleted_cnt` > 0, so the hole slot must not overlap with current element.
1646                    // We use copy for move, and never touch this element again.
1647                    unsafe {
1648                        let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt);
1649                        ptr::copy_nonoverlapping(cur, hole_slot, 1);
1650                    }
1651                }
1652                g.processed_len += 1;
1653            }
1654        }
1655
1656        // Stage 1: Nothing was deleted.
1657        process_loop::<F, T, A, false>(original_len, &mut f, &mut g);
1658
1659        // Stage 2: Some elements were deleted.
1660        process_loop::<F, T, A, true>(original_len, &mut f, &mut g);
1661
1662        // All item are processed. This can be optimized to `set_len` by LLVM.
1663        drop(g);
1664    }
1665
1666    /// Removes all but the first of consecutive elements in the vector that resolve to the same
1667    /// key.
1668    ///
1669    /// If the vector is sorted, this removes all duplicates.
1670    ///
1671    /// # Examples
1672    ///
1673    /// ```
1674    /// let mut vec = vec![10, 20, 21, 30, 20];
1675    ///
1676    /// vec.dedup_by_key(|i| *i / 10);
1677    ///
1678    /// assert_eq!(vec, [10, 20, 30, 20]);
1679    /// ```
1680    #[stable(feature = "dedup_by", since = "1.16.0")]
1681    #[inline]
1682    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1683    where
1684        F: FnMut(&mut T) -> K,
1685        K: PartialEq,
1686    {
1687        self.dedup_by(|a, b| key(a) == key(b))
1688    }
1689
1690    /// Removes all but the first of consecutive elements in the vector satisfying a given equality
1691    /// relation.
1692    ///
1693    /// The `same_bucket` function is passed references to two elements from the vector and
1694    /// must determine if the elements compare equal. The elements are passed in opposite order
1695    /// from their order in the slice, so if `same_bucket(a, b)` returns `true`, `a` is removed.
1696    ///
1697    /// If the vector is sorted, this removes all duplicates.
1698    ///
1699    /// # Examples
1700    ///
1701    /// ```
1702    /// let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
1703    ///
1704    /// vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1705    ///
1706    /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
1707    /// ```
1708    #[stable(feature = "dedup_by", since = "1.16.0")]
1709    pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1710    where
1711        F: FnMut(&mut T, &mut T) -> bool,
1712    {
1713        let len = self.len();
1714        if len <= 1 {
1715            return;
1716        }
1717
1718        /* INVARIANT: vec.len() > read >= write > write-1 >= 0 */
1719        struct FillGapOnDrop<'a, T, A: core::alloc::Allocator> {
1720            /* Offset of the element we want to check if it is duplicate */
1721            read: usize,
1722
1723            /* Offset of the place where we want to place the non-duplicate
1724             * when we find it. */
1725            write: usize,
1726
1727            /* The Vec that would need correction if `same_bucket` panicked */
1728            vec: &'a mut Vec<T, A>,
1729        }
1730
1731        impl<'a, T, A: core::alloc::Allocator> Drop for FillGapOnDrop<'a, T, A> {
1732            fn drop(&mut self) {
1733                /* This code gets executed when `same_bucket` panics */
1734
1735                /* SAFETY: invariant guarantees that `read - write`
1736                 * and `len - read` never overflow and that the copy is always
1737                 * in-bounds. */
1738                unsafe {
1739                    let ptr = self.vec.as_mut_ptr();
1740                    let len = self.vec.len();
1741
1742                    /* How many items were left when `same_bucket` panicked.
1743                     * Basically vec[read..].len() */
1744                    let items_left = len.wrapping_sub(self.read);
1745
1746                    /* Pointer to first item in vec[write..write+items_left] slice */
1747                    let dropped_ptr = ptr.add(self.write);
1748                    /* Pointer to first item in vec[read..] slice */
1749                    let valid_ptr = ptr.add(self.read);
1750
1751                    /* Copy `vec[read..]` to `vec[write..write+items_left]`.
1752                     * The slices can overlap, so `copy_nonoverlapping` cannot be used */
1753                    ptr::copy(valid_ptr, dropped_ptr, items_left);
1754
1755                    /* How many items have been already dropped
1756                     * Basically vec[read..write].len() */
1757                    let dropped = self.read.wrapping_sub(self.write);
1758
1759                    self.vec.set_len(len - dropped);
1760                }
1761            }
1762        }
1763
1764        let mut gap = FillGapOnDrop { read: 1, write: 1, vec: self };
1765        let ptr = gap.vec.as_mut_ptr();
1766
1767        /* Drop items while going through Vec, it should be more efficient than
1768         * doing slice partition_dedup + truncate */
1769
1770        /* SAFETY: Because of the invariant, read_ptr, prev_ptr and write_ptr
1771         * are always in-bounds and read_ptr never aliases prev_ptr */
1772        unsafe {
1773            while gap.read < len {
1774                let read_ptr = ptr.add(gap.read);
1775                let prev_ptr = ptr.add(gap.write.wrapping_sub(1));
1776
1777                if same_bucket(&mut *read_ptr, &mut *prev_ptr) {
1778                    // Increase `gap.read` now since the drop may panic.
1779                    gap.read += 1;
1780                    /* We have found duplicate, drop it in-place */
1781                    ptr::drop_in_place(read_ptr);
1782                } else {
1783                    let write_ptr = ptr.add(gap.write);
1784
1785                    /* Because `read_ptr` can be equal to `write_ptr`, we either
1786                     * have to use `copy` or conditional `copy_nonoverlapping`.
1787                     * Looks like the first option is faster. */
1788                    ptr::copy(read_ptr, write_ptr, 1);
1789
1790                    /* We have filled that place, so go further */
1791                    gap.write += 1;
1792                    gap.read += 1;
1793                }
1794            }
1795
1796            /* Technically we could let `gap` clean up with its Drop, but
1797             * when `same_bucket` is guaranteed to not panic, this bloats a little
1798             * the codegen, so we just do it manually */
1799            gap.vec.set_len(gap.write);
1800            mem::forget(gap);
1801        }
1802    }
1803
1804    /// Appends an element to the back of a collection.
1805    ///
1806    /// # Panics
1807    ///
1808    /// Panics if the new capacity exceeds `isize::MAX` bytes.
1809    ///
1810    /// # Examples
1811    ///
1812    /// ```
1813    /// let mut vec = vec![1, 2];
1814    /// vec.push(3);
1815    /// assert_eq!(vec, [1, 2, 3]);
1816    /// ```
1817    #[cfg(not(no_global_oom_handling))]
1818    #[inline]
1819    #[stable(feature = "rust1", since = "1.0.0")]
1820    pub fn push(&mut self, value: T) {
1821        // This will panic or abort if we would allocate > isize::MAX bytes
1822        // or if the length increment would overflow for zero-sized types.
1823        if self.len == self.buf.capacity() {
1824            self.buf.reserve_for_push(self.len);
1825        }
1826        unsafe {
1827            let end = self.as_mut_ptr().add(self.len);
1828            ptr::write(end, value);
1829            self.len += 1;
1830        }
1831    }
1832
1833    /// Tries to append an element to the back of a collection.
1834    ///
1835    /// # Examples
1836    ///
1837    /// ```
1838    /// let mut vec = vec![1, 2];
1839    /// vec.try_push(3).unwrap();
1840    /// assert_eq!(vec, [1, 2, 3]);
1841    /// ```
1842    #[inline]
1843    #[stable(feature = "kernel", since = "1.0.0")]
1844    pub fn try_push(&mut self, value: T) -> Result<(), TryReserveError> {
1845        if self.len == self.buf.capacity() {
1846            self.buf.try_reserve_for_push(self.len)?;
1847        }
1848        unsafe {
1849            let end = self.as_mut_ptr().add(self.len);
1850            ptr::write(end, value);
1851            self.len += 1;
1852        }
1853        Ok(())
1854    }
1855
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1856    /// Removes the last element from a vector and returns it, or [`None`] if it
1857    /// is empty.
1858    ///
1859    /// If you'd like to pop the first element, consider using
1860    /// [`VecDeque::pop_front`] instead.
1861    ///
1862    /// [`VecDeque::pop_front`]: crate::collections::VecDeque::pop_front
1863    ///
1864    /// # Examples
1865    ///
1866    /// ```
1867    /// let mut vec = vec![1, 2, 3];
1868    /// assert_eq!(vec.pop(), Some(3));
1869    /// assert_eq!(vec, [1, 2]);
1870    /// ```
1871    #[inline]
1872    #[stable(feature = "rust1", since = "1.0.0")]
1873    pub fn pop(&mut self) -> Option<T> {
1874        if self.len == 0 {
1875            None
1876        } else {
1877            unsafe {
1878                self.len -= 1;
1879                Some(ptr::read(self.as_ptr().add(self.len())))
1880            }
1881        }
1882    }
1883
1884    /// Moves all the elements of `other` into `self`, leaving `other` empty.
1885    ///
1886    /// # Panics
1887    ///
1888    /// Panics if the number of elements in the vector overflows a `usize`.
1889    ///
1890    /// # Examples
1891    ///
1892    /// ```
1893    /// let mut vec = vec![1, 2, 3];
1894    /// let mut vec2 = vec![4, 5, 6];
1895    /// vec.append(&mut vec2);
1896    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
1897    /// assert_eq!(vec2, []);
1898    /// ```
1899    #[cfg(not(no_global_oom_handling))]
1900    #[inline]
1901    #[stable(feature = "append", since = "1.4.0")]
1902    pub fn append(&mut self, other: &mut Self) {
1903        unsafe {
1904            self.append_elements(other.as_slice() as _);
1905            other.set_len(0);
1906        }
1907    }
1908
1909    /// Appends elements to `self` from other buffer.
1910    #[cfg(not(no_global_oom_handling))]
1911    #[inline]
1912    unsafe fn append_elements(&mut self, other: *const [T]) {
1913        let count = unsafe { (*other).len() };
1914        self.reserve(count);
1915        let len = self.len();
1916        unsafe { ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count) };
1917        self.len += count;
1918    }
1919
 
 
 
 
 
 
 
 
 
 
 
1920    /// Removes the specified range from the vector in bulk, returning all
1921    /// removed elements as an iterator. If the iterator is dropped before
1922    /// being fully consumed, it drops the remaining removed elements.
1923    ///
1924    /// The returned iterator keeps a mutable borrow on the vector to optimize
1925    /// its implementation.
1926    ///
1927    /// # Panics
1928    ///
1929    /// Panics if the starting point is greater than the end point or if
1930    /// the end point is greater than the length of the vector.
1931    ///
1932    /// # Leaking
1933    ///
1934    /// If the returned iterator goes out of scope without being dropped (due to
1935    /// [`mem::forget`], for example), the vector may have lost and leaked
1936    /// elements arbitrarily, including elements outside the range.
1937    ///
1938    /// # Examples
1939    ///
1940    /// ```
1941    /// let mut v = vec![1, 2, 3];
1942    /// let u: Vec<_> = v.drain(1..).collect();
1943    /// assert_eq!(v, &[1]);
1944    /// assert_eq!(u, &[2, 3]);
1945    ///
1946    /// // A full range clears the vector, like `clear()` does
1947    /// v.drain(..);
1948    /// assert_eq!(v, &[]);
1949    /// ```
1950    #[stable(feature = "drain", since = "1.6.0")]
1951    pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
1952    where
1953        R: RangeBounds<usize>,
1954    {
1955        // Memory safety
1956        //
1957        // When the Drain is first created, it shortens the length of
1958        // the source vector to make sure no uninitialized or moved-from elements
1959        // are accessible at all if the Drain's destructor never gets to run.
1960        //
1961        // Drain will ptr::read out the values to remove.
1962        // When finished, remaining tail of the vec is copied back to cover
1963        // the hole, and the vector length is restored to the new length.
1964        //
1965        let len = self.len();
1966        let Range { start, end } = slice::range(range, ..len);
1967
1968        unsafe {
1969            // set self.vec length's to start, to be safe in case Drain is leaked
1970            self.set_len(start);
1971            // Use the borrow in the IterMut to indicate borrowing behavior of the
1972            // whole Drain iterator (like &mut T).
1973            let range_slice = slice::from_raw_parts_mut(self.as_mut_ptr().add(start), end - start);
1974            Drain {
1975                tail_start: end,
1976                tail_len: len - end,
1977                iter: range_slice.iter(),
1978                vec: NonNull::from(self),
1979            }
1980        }
1981    }
1982
1983    /// Clears the vector, removing all values.
1984    ///
1985    /// Note that this method has no effect on the allocated capacity
1986    /// of the vector.
1987    ///
1988    /// # Examples
1989    ///
1990    /// ```
1991    /// let mut v = vec![1, 2, 3];
1992    ///
1993    /// v.clear();
1994    ///
1995    /// assert!(v.is_empty());
1996    /// ```
1997    #[inline]
1998    #[stable(feature = "rust1", since = "1.0.0")]
1999    pub fn clear(&mut self) {
2000        let elems: *mut [T] = self.as_mut_slice();
2001
2002        // SAFETY:
2003        // - `elems` comes directly from `as_mut_slice` and is therefore valid.
2004        // - Setting `self.len` before calling `drop_in_place` means that,
2005        //   if an element's `Drop` impl panics, the vector's `Drop` impl will
2006        //   do nothing (leaking the rest of the elements) instead of dropping
2007        //   some twice.
2008        unsafe {
2009            self.len = 0;
2010            ptr::drop_in_place(elems);
2011        }
2012    }
2013
2014    /// Returns the number of elements in the vector, also referred to
2015    /// as its 'length'.
2016    ///
2017    /// # Examples
2018    ///
2019    /// ```
2020    /// let a = vec![1, 2, 3];
2021    /// assert_eq!(a.len(), 3);
2022    /// ```
2023    #[inline]
2024    #[stable(feature = "rust1", since = "1.0.0")]
2025    pub fn len(&self) -> usize {
2026        self.len
2027    }
2028
2029    /// Returns `true` if the vector contains no elements.
2030    ///
2031    /// # Examples
2032    ///
2033    /// ```
2034    /// let mut v = Vec::new();
2035    /// assert!(v.is_empty());
2036    ///
2037    /// v.push(1);
2038    /// assert!(!v.is_empty());
2039    /// ```
2040    #[stable(feature = "rust1", since = "1.0.0")]
2041    pub fn is_empty(&self) -> bool {
2042        self.len() == 0
2043    }
2044
2045    /// Splits the collection into two at the given index.
2046    ///
2047    /// Returns a newly allocated vector containing the elements in the range
2048    /// `[at, len)`. After the call, the original vector will be left containing
2049    /// the elements `[0, at)` with its previous capacity unchanged.
2050    ///
2051    /// # Panics
2052    ///
2053    /// Panics if `at > len`.
2054    ///
2055    /// # Examples
2056    ///
2057    /// ```
2058    /// let mut vec = vec![1, 2, 3];
2059    /// let vec2 = vec.split_off(1);
2060    /// assert_eq!(vec, [1]);
2061    /// assert_eq!(vec2, [2, 3]);
2062    /// ```
2063    #[cfg(not(no_global_oom_handling))]
2064    #[inline]
2065    #[must_use = "use `.truncate()` if you don't need the other half"]
2066    #[stable(feature = "split_off", since = "1.4.0")]
2067    pub fn split_off(&mut self, at: usize) -> Self
2068    where
2069        A: Clone,
2070    {
2071        #[cold]
2072        #[inline(never)]
2073        fn assert_failed(at: usize, len: usize) -> ! {
2074            panic!("`at` split index (is {at}) should be <= len (is {len})");
2075        }
2076
2077        if at > self.len() {
2078            assert_failed(at, self.len());
2079        }
2080
2081        if at == 0 {
2082            // the new vector can take over the original buffer and avoid the copy
2083            return mem::replace(
2084                self,
2085                Vec::with_capacity_in(self.capacity(), self.allocator().clone()),
2086            );
2087        }
2088
2089        let other_len = self.len - at;
2090        let mut other = Vec::with_capacity_in(other_len, self.allocator().clone());
2091
2092        // Unsafely `set_len` and copy items to `other`.
2093        unsafe {
2094            self.set_len(at);
2095            other.set_len(other_len);
2096
2097            ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len());
2098        }
2099        other
2100    }
2101
2102    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
2103    ///
2104    /// If `new_len` is greater than `len`, the `Vec` is extended by the
2105    /// difference, with each additional slot filled with the result of
2106    /// calling the closure `f`. The return values from `f` will end up
2107    /// in the `Vec` in the order they have been generated.
2108    ///
2109    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
2110    ///
2111    /// This method uses a closure to create new values on every push. If
2112    /// you'd rather [`Clone`] a given value, use [`Vec::resize`]. If you
2113    /// want to use the [`Default`] trait to generate values, you can
2114    /// pass [`Default::default`] as the second argument.
2115    ///
2116    /// # Examples
2117    ///
2118    /// ```
2119    /// let mut vec = vec![1, 2, 3];
2120    /// vec.resize_with(5, Default::default);
2121    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
2122    ///
2123    /// let mut vec = vec![];
2124    /// let mut p = 1;
2125    /// vec.resize_with(4, || { p *= 2; p });
2126    /// assert_eq!(vec, [2, 4, 8, 16]);
2127    /// ```
2128    #[cfg(not(no_global_oom_handling))]
2129    #[stable(feature = "vec_resize_with", since = "1.33.0")]
2130    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
2131    where
2132        F: FnMut() -> T,
2133    {
2134        let len = self.len();
2135        if new_len > len {
2136            self.extend_with(new_len - len, ExtendFunc(f));
2137        } else {
2138            self.truncate(new_len);
2139        }
2140    }
2141
2142    /// Consumes and leaks the `Vec`, returning a mutable reference to the contents,
2143    /// `&'a mut [T]`. Note that the type `T` must outlive the chosen lifetime
2144    /// `'a`. If the type has only static references, or none at all, then this
2145    /// may be chosen to be `'static`.
2146    ///
2147    /// As of Rust 1.57, this method does not reallocate or shrink the `Vec`,
2148    /// so the leaked allocation may include unused capacity that is not part
2149    /// of the returned slice.
2150    ///
2151    /// This function is mainly useful for data that lives for the remainder of
2152    /// the program's life. Dropping the returned reference will cause a memory
2153    /// leak.
2154    ///
2155    /// # Examples
2156    ///
2157    /// Simple usage:
2158    ///
2159    /// ```
2160    /// let x = vec![1, 2, 3];
2161    /// let static_ref: &'static mut [usize] = x.leak();
2162    /// static_ref[0] += 1;
2163    /// assert_eq!(static_ref, &[2, 2, 3]);
2164    /// ```
2165    #[cfg(not(no_global_oom_handling))]
2166    #[stable(feature = "vec_leak", since = "1.47.0")]
2167    #[inline]
2168    pub fn leak<'a>(self) -> &'a mut [T]
2169    where
2170        A: 'a,
2171    {
2172        let mut me = ManuallyDrop::new(self);
2173        unsafe { slice::from_raw_parts_mut(me.as_mut_ptr(), me.len) }
2174    }
2175
2176    /// Returns the remaining spare capacity of the vector as a slice of
2177    /// `MaybeUninit<T>`.
2178    ///
2179    /// The returned slice can be used to fill the vector with data (e.g. by
2180    /// reading from a file) before marking the data as initialized using the
2181    /// [`set_len`] method.
2182    ///
2183    /// [`set_len`]: Vec::set_len
2184    ///
2185    /// # Examples
2186    ///
2187    /// ```
2188    /// // Allocate vector big enough for 10 elements.
2189    /// let mut v = Vec::with_capacity(10);
2190    ///
2191    /// // Fill in the first 3 elements.
2192    /// let uninit = v.spare_capacity_mut();
2193    /// uninit[0].write(0);
2194    /// uninit[1].write(1);
2195    /// uninit[2].write(2);
2196    ///
2197    /// // Mark the first 3 elements of the vector as being initialized.
2198    /// unsafe {
2199    ///     v.set_len(3);
2200    /// }
2201    ///
2202    /// assert_eq!(&v, &[0, 1, 2]);
2203    /// ```
2204    #[stable(feature = "vec_spare_capacity", since = "1.60.0")]
2205    #[inline]
2206    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
2207        // Note:
2208        // This method is not implemented in terms of `split_at_spare_mut`,
2209        // to prevent invalidation of pointers to the buffer.
2210        unsafe {
2211            slice::from_raw_parts_mut(
2212                self.as_mut_ptr().add(self.len) as *mut MaybeUninit<T>,
2213                self.buf.capacity() - self.len,
2214            )
2215        }
2216    }
2217
2218    /// Returns vector content as a slice of `T`, along with the remaining spare
2219    /// capacity of the vector as a slice of `MaybeUninit<T>`.
2220    ///
2221    /// The returned spare capacity slice can be used to fill the vector with data
2222    /// (e.g. by reading from a file) before marking the data as initialized using
2223    /// the [`set_len`] method.
2224    ///
2225    /// [`set_len`]: Vec::set_len
2226    ///
2227    /// Note that this is a low-level API, which should be used with care for
2228    /// optimization purposes. If you need to append data to a `Vec`
2229    /// you can use [`push`], [`extend`], [`extend_from_slice`],
2230    /// [`extend_from_within`], [`insert`], [`append`], [`resize`] or
2231    /// [`resize_with`], depending on your exact needs.
2232    ///
2233    /// [`push`]: Vec::push
2234    /// [`extend`]: Vec::extend
2235    /// [`extend_from_slice`]: Vec::extend_from_slice
2236    /// [`extend_from_within`]: Vec::extend_from_within
2237    /// [`insert`]: Vec::insert
2238    /// [`append`]: Vec::append
2239    /// [`resize`]: Vec::resize
2240    /// [`resize_with`]: Vec::resize_with
2241    ///
2242    /// # Examples
2243    ///
2244    /// ```
2245    /// #![feature(vec_split_at_spare)]
2246    ///
2247    /// let mut v = vec![1, 1, 2];
2248    ///
2249    /// // Reserve additional space big enough for 10 elements.
2250    /// v.reserve(10);
2251    ///
2252    /// let (init, uninit) = v.split_at_spare_mut();
2253    /// let sum = init.iter().copied().sum::<u32>();
2254    ///
2255    /// // Fill in the next 4 elements.
2256    /// uninit[0].write(sum);
2257    /// uninit[1].write(sum * 2);
2258    /// uninit[2].write(sum * 3);
2259    /// uninit[3].write(sum * 4);
2260    ///
2261    /// // Mark the 4 elements of the vector as being initialized.
2262    /// unsafe {
2263    ///     let len = v.len();
2264    ///     v.set_len(len + 4);
2265    /// }
2266    ///
2267    /// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
2268    /// ```
2269    #[unstable(feature = "vec_split_at_spare", issue = "81944")]
2270    #[inline]
2271    pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
2272        // SAFETY:
2273        // - len is ignored and so never changed
2274        let (init, spare, _) = unsafe { self.split_at_spare_mut_with_len() };
2275        (init, spare)
2276    }
2277
2278    /// Safety: changing returned .2 (&mut usize) is considered the same as calling `.set_len(_)`.
2279    ///
2280    /// This method provides unique access to all vec parts at once in `extend_from_within`.
2281    unsafe fn split_at_spare_mut_with_len(
2282        &mut self,
2283    ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
2284        let ptr = self.as_mut_ptr();
2285        // SAFETY:
2286        // - `ptr` is guaranteed to be valid for `self.len` elements
2287        // - but the allocation extends out to `self.buf.capacity()` elements, possibly
2288        // uninitialized
2289        let spare_ptr = unsafe { ptr.add(self.len) };
2290        let spare_ptr = spare_ptr.cast::<MaybeUninit<T>>();
2291        let spare_len = self.buf.capacity() - self.len;
2292
2293        // SAFETY:
2294        // - `ptr` is guaranteed to be valid for `self.len` elements
2295        // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized`
2296        unsafe {
2297            let initialized = slice::from_raw_parts_mut(ptr, self.len);
2298            let spare = slice::from_raw_parts_mut(spare_ptr, spare_len);
2299
2300            (initialized, spare, &mut self.len)
2301        }
2302    }
2303}
2304
2305impl<T: Clone, A: Allocator> Vec<T, A> {
2306    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
2307    ///
2308    /// If `new_len` is greater than `len`, the `Vec` is extended by the
2309    /// difference, with each additional slot filled with `value`.
2310    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
2311    ///
2312    /// This method requires `T` to implement [`Clone`],
2313    /// in order to be able to clone the passed value.
2314    /// If you need more flexibility (or want to rely on [`Default`] instead of
2315    /// [`Clone`]), use [`Vec::resize_with`].
2316    /// If you only need to resize to a smaller size, use [`Vec::truncate`].
2317    ///
2318    /// # Examples
2319    ///
2320    /// ```
2321    /// let mut vec = vec!["hello"];
2322    /// vec.resize(3, "world");
2323    /// assert_eq!(vec, ["hello", "world", "world"]);
2324    ///
2325    /// let mut vec = vec![1, 2, 3, 4];
2326    /// vec.resize(2, 0);
2327    /// assert_eq!(vec, [1, 2]);
2328    /// ```
2329    #[cfg(not(no_global_oom_handling))]
2330    #[stable(feature = "vec_resize", since = "1.5.0")]
2331    pub fn resize(&mut self, new_len: usize, value: T) {
2332        let len = self.len();
2333
2334        if new_len > len {
2335            self.extend_with(new_len - len, ExtendElement(value))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2336        } else {
2337            self.truncate(new_len);
 
2338        }
2339    }
2340
2341    /// Clones and appends all elements in a slice to the `Vec`.
2342    ///
2343    /// Iterates over the slice `other`, clones each element, and then appends
2344    /// it to this `Vec`. The `other` slice is traversed in-order.
2345    ///
2346    /// Note that this function is same as [`extend`] except that it is
2347    /// specialized to work with slices instead. If and when Rust gets
2348    /// specialization this function will likely be deprecated (but still
2349    /// available).
2350    ///
2351    /// # Examples
2352    ///
2353    /// ```
2354    /// let mut vec = vec![1];
2355    /// vec.extend_from_slice(&[2, 3, 4]);
2356    /// assert_eq!(vec, [1, 2, 3, 4]);
2357    /// ```
2358    ///
2359    /// [`extend`]: Vec::extend
2360    #[cfg(not(no_global_oom_handling))]
2361    #[stable(feature = "vec_extend_from_slice", since = "1.6.0")]
2362    pub fn extend_from_slice(&mut self, other: &[T]) {
2363        self.spec_extend(other.iter())
2364    }
2365
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2366    /// Copies elements from `src` range to the end of the vector.
2367    ///
2368    /// # Panics
2369    ///
2370    /// Panics if the starting point is greater than the end point or if
2371    /// the end point is greater than the length of the vector.
2372    ///
2373    /// # Examples
2374    ///
2375    /// ```
2376    /// let mut vec = vec![0, 1, 2, 3, 4];
2377    ///
2378    /// vec.extend_from_within(2..);
2379    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
2380    ///
2381    /// vec.extend_from_within(..2);
2382    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
2383    ///
2384    /// vec.extend_from_within(4..8);
2385    /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
2386    /// ```
2387    #[cfg(not(no_global_oom_handling))]
2388    #[stable(feature = "vec_extend_from_within", since = "1.53.0")]
2389    pub fn extend_from_within<R>(&mut self, src: R)
2390    where
2391        R: RangeBounds<usize>,
2392    {
2393        let range = slice::range(src, ..self.len());
2394        self.reserve(range.len());
2395
2396        // SAFETY:
2397        // - `slice::range` guarantees  that the given range is valid for indexing self
2398        unsafe {
2399            self.spec_extend_from_within(range);
2400        }
2401    }
2402}
2403
2404impl<T, A: Allocator, const N: usize> Vec<[T; N], A> {
2405    /// Takes a `Vec<[T; N]>` and flattens it into a `Vec<T>`.
2406    ///
2407    /// # Panics
2408    ///
2409    /// Panics if the length of the resulting vector would overflow a `usize`.
2410    ///
2411    /// This is only possible when flattening a vector of arrays of zero-sized
2412    /// types, and thus tends to be irrelevant in practice. If
2413    /// `size_of::<T>() > 0`, this will never panic.
2414    ///
2415    /// # Examples
2416    ///
2417    /// ```
2418    /// #![feature(slice_flatten)]
2419    ///
2420    /// let mut vec = vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]];
2421    /// assert_eq!(vec.pop(), Some([7, 8, 9]));
2422    ///
2423    /// let mut flattened = vec.into_flattened();
2424    /// assert_eq!(flattened.pop(), Some(6));
2425    /// ```
2426    #[unstable(feature = "slice_flatten", issue = "95629")]
2427    pub fn into_flattened(self) -> Vec<T, A> {
2428        let (ptr, len, cap, alloc) = self.into_raw_parts_with_alloc();
2429        let (new_len, new_cap) = if mem::size_of::<T>() == 0 {
2430            (len.checked_mul(N).expect("vec len overflow"), usize::MAX)
2431        } else {
2432            // SAFETY:
2433            // - `cap * N` cannot overflow because the allocation is already in
2434            // the address space.
2435            // - Each `[T; N]` has `N` valid elements, so there are `len * N`
2436            // valid elements in the allocation.
2437            unsafe { (len.unchecked_mul(N), cap.unchecked_mul(N)) }
2438        };
2439        // SAFETY:
2440        // - `ptr` was allocated by `self`
2441        // - `ptr` is well-aligned because `[T; N]` has the same alignment as `T`.
2442        // - `new_cap` refers to the same sized allocation as `cap` because
2443        // `new_cap * size_of::<T>()` == `cap * size_of::<[T; N]>()`
2444        // - `len` <= `cap`, so `len * N` <= `cap * N`.
2445        unsafe { Vec::<T, A>::from_raw_parts_in(ptr.cast(), new_len, new_cap, alloc) }
2446    }
2447}
2448
2449// This code generalizes `extend_with_{element,default}`.
2450trait ExtendWith<T> {
2451    fn next(&mut self) -> T;
2452    fn last(self) -> T;
2453}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2454
2455struct ExtendElement<T>(T);
2456impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
2457    fn next(&mut self) -> T {
2458        self.0.clone()
2459    }
2460    fn last(self) -> T {
2461        self.0
2462    }
2463}
2464
2465struct ExtendFunc<F>(F);
2466impl<T, F: FnMut() -> T> ExtendWith<T> for ExtendFunc<F> {
2467    fn next(&mut self) -> T {
2468        (self.0)()
2469    }
2470    fn last(mut self) -> T {
2471        (self.0)()
2472    }
2473}
2474
2475impl<T, A: Allocator> Vec<T, A> {
2476    #[cfg(not(no_global_oom_handling))]
2477    /// Extend the vector by `n` values, using the given generator.
2478    fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, mut value: E) {
2479        self.reserve(n);
2480
2481        unsafe {
2482            let mut ptr = self.as_mut_ptr().add(self.len());
2483            // Use SetLenOnDrop to work around bug where compiler
2484            // might not realize the store through `ptr` through self.set_len()
2485            // don't alias.
2486            let mut local_len = SetLenOnDrop::new(&mut self.len);
2487
2488            // Write all elements except the last one
2489            for _ in 1..n {
2490                ptr::write(ptr, value.next());
2491                ptr = ptr.offset(1);
2492                // Increment the length in every step in case next() panics
2493                local_len.increment_len(1);
2494            }
2495
2496            if n > 0 {
2497                // We can write the last element directly without cloning needlessly
2498                ptr::write(ptr, value.last());
2499                local_len.increment_len(1);
2500            }
2501
2502            // len set by scope guard
 
2503        }
2504    }
2505}
2506
2507impl<T: PartialEq, A: Allocator> Vec<T, A> {
2508    /// Removes consecutive repeated elements in the vector according to the
2509    /// [`PartialEq`] trait implementation.
2510    ///
2511    /// If the vector is sorted, this removes all duplicates.
2512    ///
2513    /// # Examples
2514    ///
2515    /// ```
2516    /// let mut vec = vec![1, 2, 2, 3, 2];
2517    ///
2518    /// vec.dedup();
2519    ///
2520    /// assert_eq!(vec, [1, 2, 3, 2]);
2521    /// ```
2522    #[stable(feature = "rust1", since = "1.0.0")]
2523    #[inline]
2524    pub fn dedup(&mut self) {
2525        self.dedup_by(|a, b| a == b)
2526    }
2527}
2528
2529////////////////////////////////////////////////////////////////////////////////
2530// Internal methods and functions
2531////////////////////////////////////////////////////////////////////////////////
2532
2533#[doc(hidden)]
2534#[cfg(not(no_global_oom_handling))]
2535#[stable(feature = "rust1", since = "1.0.0")]
2536pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
2537    <T as SpecFromElem>::from_elem(elem, n, Global)
2538}
2539
2540#[doc(hidden)]
2541#[cfg(not(no_global_oom_handling))]
2542#[unstable(feature = "allocator_api", issue = "32838")]
2543pub fn from_elem_in<T: Clone, A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
2544    <T as SpecFromElem>::from_elem(elem, n, alloc)
2545}
2546
2547trait ExtendFromWithinSpec {
2548    /// # Safety
2549    ///
2550    /// - `src` needs to be valid index
2551    /// - `self.capacity() - self.len()` must be `>= src.len()`
2552    unsafe fn spec_extend_from_within(&mut self, src: Range<usize>);
2553}
2554
2555impl<T: Clone, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
2556    default unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
2557        // SAFETY:
2558        // - len is increased only after initializing elements
2559        let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() };
2560
2561        // SAFETY:
2562        // - caller guaratees that src is a valid index
2563        let to_clone = unsafe { this.get_unchecked(src) };
2564
2565        iter::zip(to_clone, spare)
2566            .map(|(src, dst)| dst.write(src.clone()))
2567            // Note:
2568            // - Element was just initialized with `MaybeUninit::write`, so it's ok to increase len
2569            // - len is increased after each element to prevent leaks (see issue #82533)
2570            .for_each(|_| *len += 1);
2571    }
2572}
2573
2574impl<T: Copy, A: Allocator> ExtendFromWithinSpec for Vec<T, A> {
2575    unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
2576        let count = src.len();
2577        {
2578            let (init, spare) = self.split_at_spare_mut();
2579
2580            // SAFETY:
2581            // - caller guaratees that `src` is a valid index
2582            let source = unsafe { init.get_unchecked(src) };
2583
2584            // SAFETY:
2585            // - Both pointers are created from unique slice references (`&mut [_]`)
2586            //   so they are valid and do not overlap.
2587            // - Elements are :Copy so it's OK to to copy them, without doing
2588            //   anything with the original values
2589            // - `count` is equal to the len of `source`, so source is valid for
2590            //   `count` reads
2591            // - `.reserve(count)` guarantees that `spare.len() >= count` so spare
2592            //   is valid for `count` writes
2593            unsafe { ptr::copy_nonoverlapping(source.as_ptr(), spare.as_mut_ptr() as _, count) };
2594        }
2595
2596        // SAFETY:
2597        // - The elements were just initialized by `copy_nonoverlapping`
2598        self.len += count;
2599    }
2600}
2601
2602////////////////////////////////////////////////////////////////////////////////
2603// Common trait implementations for Vec
2604////////////////////////////////////////////////////////////////////////////////
2605
2606#[stable(feature = "rust1", since = "1.0.0")]
2607impl<T, A: Allocator> ops::Deref for Vec<T, A> {
2608    type Target = [T];
2609
 
2610    fn deref(&self) -> &[T] {
2611        unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
2612    }
2613}
2614
2615#[stable(feature = "rust1", since = "1.0.0")]
2616impl<T, A: Allocator> ops::DerefMut for Vec<T, A> {
 
2617    fn deref_mut(&mut self) -> &mut [T] {
2618        unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
2619    }
2620}
2621
2622#[cfg(not(no_global_oom_handling))]
2623trait SpecCloneFrom {
2624    fn clone_from(this: &mut Self, other: &Self);
2625}
2626
2627#[cfg(not(no_global_oom_handling))]
2628impl<T: Clone, A: Allocator> SpecCloneFrom for Vec<T, A> {
2629    default fn clone_from(this: &mut Self, other: &Self) {
2630        // drop anything that will not be overwritten
2631        this.truncate(other.len());
2632
2633        // self.len <= other.len due to the truncate above, so the
2634        // slices here are always in-bounds.
2635        let (init, tail) = other.split_at(this.len());
2636
2637        // reuse the contained values' allocations/resources.
2638        this.clone_from_slice(init);
2639        this.extend_from_slice(tail);
2640    }
2641}
2642
2643#[cfg(not(no_global_oom_handling))]
2644impl<T: Copy, A: Allocator> SpecCloneFrom for Vec<T, A> {
2645    fn clone_from(this: &mut Self, other: &Self) {
2646        this.clear();
2647        this.extend_from_slice(other);
2648    }
2649}
2650
2651#[cfg(not(no_global_oom_handling))]
2652#[stable(feature = "rust1", since = "1.0.0")]
2653impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
2654    #[cfg(not(test))]
2655    fn clone(&self) -> Self {
2656        let alloc = self.allocator().clone();
2657        <[T]>::to_vec_in(&**self, alloc)
2658    }
2659
2660    // HACK(japaric): with cfg(test) the inherent `[T]::to_vec` method, which is
2661    // required for this method definition, is not available. Instead use the
2662    // `slice::to_vec`  function which is only available with cfg(test)
2663    // NB see the slice::hack module in slice.rs for more information
2664    #[cfg(test)]
2665    fn clone(&self) -> Self {
2666        let alloc = self.allocator().clone();
2667        crate::slice::to_vec(&**self, alloc)
2668    }
2669
2670    fn clone_from(&mut self, other: &Self) {
2671        SpecCloneFrom::clone_from(self, other)
2672    }
2673}
2674
2675/// The hash of a vector is the same as that of the corresponding slice,
2676/// as required by the `core::borrow::Borrow` implementation.
2677///
2678/// ```
2679/// #![feature(build_hasher_simple_hash_one)]
2680/// use std::hash::BuildHasher;
2681///
2682/// let b = std::collections::hash_map::RandomState::new();
2683/// let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
2684/// let s: &[u8] = &[0xa8, 0x3c, 0x09];
2685/// assert_eq!(b.hash_one(v), b.hash_one(s));
2686/// ```
2687#[stable(feature = "rust1", since = "1.0.0")]
2688impl<T: Hash, A: Allocator> Hash for Vec<T, A> {
2689    #[inline]
2690    fn hash<H: Hasher>(&self, state: &mut H) {
2691        Hash::hash(&**self, state)
2692    }
2693}
2694
2695#[stable(feature = "rust1", since = "1.0.0")]
2696#[rustc_on_unimplemented(
2697    message = "vector indices are of type `usize` or ranges of `usize`",
2698    label = "vector indices are of type `usize` or ranges of `usize`"
2699)]
2700impl<T, I: SliceIndex<[T]>, A: Allocator> Index<I> for Vec<T, A> {
2701    type Output = I::Output;
2702
2703    #[inline]
2704    fn index(&self, index: I) -> &Self::Output {
2705        Index::index(&**self, index)
2706    }
2707}
2708
2709#[stable(feature = "rust1", since = "1.0.0")]
2710#[rustc_on_unimplemented(
2711    message = "vector indices are of type `usize` or ranges of `usize`",
2712    label = "vector indices are of type `usize` or ranges of `usize`"
2713)]
2714impl<T, I: SliceIndex<[T]>, A: Allocator> IndexMut<I> for Vec<T, A> {
2715    #[inline]
2716    fn index_mut(&mut self, index: I) -> &mut Self::Output {
2717        IndexMut::index_mut(&mut **self, index)
2718    }
2719}
2720
2721#[cfg(not(no_global_oom_handling))]
2722#[stable(feature = "rust1", since = "1.0.0")]
2723impl<T> FromIterator<T> for Vec<T> {
2724    #[inline]
2725    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Vec<T> {
2726        <Self as SpecFromIter<T, I::IntoIter>>::from_iter(iter.into_iter())
2727    }
2728}
2729
2730#[stable(feature = "rust1", since = "1.0.0")]
2731impl<T, A: Allocator> IntoIterator for Vec<T, A> {
2732    type Item = T;
2733    type IntoIter = IntoIter<T, A>;
2734
2735    /// Creates a consuming iterator, that is, one that moves each value out of
2736    /// the vector (from start to end). The vector cannot be used after calling
2737    /// this.
2738    ///
2739    /// # Examples
2740    ///
2741    /// ```
2742    /// let v = vec!["a".to_string(), "b".to_string()];
2743    /// for s in v.into_iter() {
2744    ///     // s has type String, not &String
2745    ///     println!("{s}");
2746    /// }
 
 
 
2747    /// ```
2748    #[inline]
2749    fn into_iter(self) -> IntoIter<T, A> {
2750        unsafe {
2751            let mut me = ManuallyDrop::new(self);
2752            let alloc = ManuallyDrop::new(ptr::read(me.allocator()));
2753            let begin = me.as_mut_ptr();
2754            let end = if mem::size_of::<T>() == 0 {
2755                arith_offset(begin as *const i8, me.len() as isize) as *const T
2756            } else {
2757                begin.add(me.len()) as *const T
2758            };
2759            let cap = me.buf.capacity();
2760            IntoIter {
2761                buf: NonNull::new_unchecked(begin),
2762                phantom: PhantomData,
2763                cap,
2764                alloc,
2765                ptr: begin,
2766                end,
2767            }
2768        }
2769    }
2770}
2771
2772#[stable(feature = "rust1", since = "1.0.0")]
2773impl<'a, T, A: Allocator> IntoIterator for &'a Vec<T, A> {
2774    type Item = &'a T;
2775    type IntoIter = slice::Iter<'a, T>;
2776
2777    fn into_iter(self) -> slice::Iter<'a, T> {
2778        self.iter()
2779    }
2780}
2781
2782#[stable(feature = "rust1", since = "1.0.0")]
2783impl<'a, T, A: Allocator> IntoIterator for &'a mut Vec<T, A> {
2784    type Item = &'a mut T;
2785    type IntoIter = slice::IterMut<'a, T>;
2786
2787    fn into_iter(self) -> slice::IterMut<'a, T> {
2788        self.iter_mut()
2789    }
2790}
2791
2792#[cfg(not(no_global_oom_handling))]
2793#[stable(feature = "rust1", since = "1.0.0")]
2794impl<T, A: Allocator> Extend<T> for Vec<T, A> {
2795    #[inline]
2796    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
2797        <Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter())
2798    }
2799
2800    #[inline]
2801    fn extend_one(&mut self, item: T) {
2802        self.push(item);
2803    }
2804
2805    #[inline]
2806    fn extend_reserve(&mut self, additional: usize) {
2807        self.reserve(additional);
2808    }
2809}
2810
2811impl<T, A: Allocator> Vec<T, A> {
2812    // leaf method to which various SpecFrom/SpecExtend implementations delegate when
2813    // they have no further optimizations to apply
2814    #[cfg(not(no_global_oom_handling))]
2815    fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
2816        // This is the case for a general iterator.
2817        //
2818        // This function should be the moral equivalent of:
2819        //
2820        //      for item in iterator {
2821        //          self.push(item);
2822        //      }
2823        while let Some(element) = iterator.next() {
2824            let len = self.len();
2825            if len == self.capacity() {
2826                let (lower, _) = iterator.size_hint();
2827                self.reserve(lower.saturating_add(1));
2828            }
2829            unsafe {
2830                ptr::write(self.as_mut_ptr().add(len), element);
2831                // Since next() executes user code which can panic we have to bump the length
2832                // after each step.
2833                // NB can't overflow since we would have had to alloc the address space
2834                self.set_len(len + 1);
2835            }
2836        }
2837    }
2838
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2839    /// Creates a splicing iterator that replaces the specified range in the vector
2840    /// with the given `replace_with` iterator and yields the removed items.
2841    /// `replace_with` does not need to be the same length as `range`.
2842    ///
2843    /// `range` is removed even if the iterator is not consumed until the end.
2844    ///
2845    /// It is unspecified how many elements are removed from the vector
2846    /// if the `Splice` value is leaked.
2847    ///
2848    /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped.
2849    ///
2850    /// This is optimal if:
2851    ///
2852    /// * The tail (elements in the vector after `range`) is empty,
2853    /// * or `replace_with` yields fewer or equal elements than `range`’s length
2854    /// * or the lower bound of its `size_hint()` is exact.
2855    ///
2856    /// Otherwise, a temporary vector is allocated and the tail is moved twice.
2857    ///
2858    /// # Panics
2859    ///
2860    /// Panics if the starting point is greater than the end point or if
2861    /// the end point is greater than the length of the vector.
2862    ///
2863    /// # Examples
2864    ///
2865    /// ```
2866    /// let mut v = vec![1, 2, 3, 4];
2867    /// let new = [7, 8, 9];
2868    /// let u: Vec<_> = v.splice(1..3, new).collect();
2869    /// assert_eq!(v, &[1, 7, 8, 9, 4]);
2870    /// assert_eq!(u, &[2, 3]);
2871    /// ```
2872    #[cfg(not(no_global_oom_handling))]
2873    #[inline]
2874    #[stable(feature = "vec_splice", since = "1.21.0")]
2875    pub fn splice<R, I>(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter, A>
2876    where
2877        R: RangeBounds<usize>,
2878        I: IntoIterator<Item = T>,
2879    {
2880        Splice { drain: self.drain(range), replace_with: replace_with.into_iter() }
2881    }
2882
2883    /// Creates an iterator which uses a closure to determine if an element should be removed.
2884    ///
2885    /// If the closure returns true, then the element is removed and yielded.
2886    /// If the closure returns false, the element will remain in the vector and will not be yielded
2887    /// by the iterator.
2888    ///
 
 
 
 
 
 
2889    /// Using this method is equivalent to the following code:
2890    ///
2891    /// ```
2892    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6 };
2893    /// # let mut vec = vec![1, 2, 3, 4, 5, 6];
2894    /// let mut i = 0;
2895    /// while i < vec.len() {
2896    ///     if some_predicate(&mut vec[i]) {
2897    ///         let val = vec.remove(i);
2898    ///         // your code here
2899    ///     } else {
2900    ///         i += 1;
2901    ///     }
2902    /// }
2903    ///
2904    /// # assert_eq!(vec, vec![1, 4, 5]);
2905    /// ```
2906    ///
2907    /// But `drain_filter` is easier to use. `drain_filter` is also more efficient,
2908    /// because it can backshift the elements of the array in bulk.
2909    ///
2910    /// Note that `drain_filter` also lets you mutate every element in the filter closure,
2911    /// regardless of whether you choose to keep or remove it.
2912    ///
2913    /// # Examples
2914    ///
2915    /// Splitting an array into evens and odds, reusing the original allocation:
2916    ///
2917    /// ```
2918    /// #![feature(drain_filter)]
2919    /// let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
2920    ///
2921    /// let evens = numbers.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
2922    /// let odds = numbers;
2923    ///
2924    /// assert_eq!(evens, vec![2, 4, 6, 8, 14]);
2925    /// assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
2926    /// ```
2927    #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
2928    pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, T, F, A>
2929    where
2930        F: FnMut(&mut T) -> bool,
2931    {
2932        let old_len = self.len();
2933
2934        // Guard against us getting leaked (leak amplification)
2935        unsafe {
2936            self.set_len(0);
2937        }
2938
2939        DrainFilter { vec: self, idx: 0, del: 0, old_len, pred: filter, panic_flag: false }
2940    }
2941}
2942
2943/// Extend implementation that copies elements out of references before pushing them onto the Vec.
2944///
2945/// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to
2946/// append the entire slice at once.
2947///
2948/// [`copy_from_slice`]: slice::copy_from_slice
2949#[cfg(not(no_global_oom_handling))]
2950#[stable(feature = "extend_ref", since = "1.2.0")]
2951impl<'a, T: Copy + 'a, A: Allocator + 'a> Extend<&'a T> for Vec<T, A> {
2952    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
2953        self.spec_extend(iter.into_iter())
2954    }
2955
2956    #[inline]
2957    fn extend_one(&mut self, &item: &'a T) {
2958        self.push(item);
2959    }
2960
2961    #[inline]
2962    fn extend_reserve(&mut self, additional: usize) {
2963        self.reserve(additional);
2964    }
2965}
2966
2967/// Implements comparison of vectors, [lexicographically](core::cmp::Ord#lexicographical-comparison).
2968#[stable(feature = "rust1", since = "1.0.0")]
2969impl<T: PartialOrd, A: Allocator> PartialOrd for Vec<T, A> {
 
 
 
 
 
2970    #[inline]
2971    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
2972        PartialOrd::partial_cmp(&**self, &**other)
2973    }
2974}
2975
2976#[stable(feature = "rust1", since = "1.0.0")]
2977impl<T: Eq, A: Allocator> Eq for Vec<T, A> {}
2978
2979/// Implements ordering of vectors, [lexicographically](core::cmp::Ord#lexicographical-comparison).
2980#[stable(feature = "rust1", since = "1.0.0")]
2981impl<T: Ord, A: Allocator> Ord for Vec<T, A> {
2982    #[inline]
2983    fn cmp(&self, other: &Self) -> Ordering {
2984        Ord::cmp(&**self, &**other)
2985    }
2986}
2987
2988#[stable(feature = "rust1", since = "1.0.0")]
2989unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
2990    fn drop(&mut self) {
2991        unsafe {
2992            // use drop for [T]
2993            // use a raw slice to refer to the elements of the vector as weakest necessary type;
2994            // could avoid questions of validity in certain cases
2995            ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
2996        }
2997        // RawVec handles deallocation
2998    }
2999}
3000
3001#[stable(feature = "rust1", since = "1.0.0")]
3002#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")]
3003impl<T> const Default for Vec<T> {
3004    /// Creates an empty `Vec<T>`.
 
 
3005    fn default() -> Vec<T> {
3006        Vec::new()
3007    }
3008}
3009
3010#[stable(feature = "rust1", since = "1.0.0")]
3011impl<T: fmt::Debug, A: Allocator> fmt::Debug for Vec<T, A> {
3012    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3013        fmt::Debug::fmt(&**self, f)
3014    }
3015}
3016
3017#[stable(feature = "rust1", since = "1.0.0")]
3018impl<T, A: Allocator> AsRef<Vec<T, A>> for Vec<T, A> {
3019    fn as_ref(&self) -> &Vec<T, A> {
3020        self
3021    }
3022}
3023
3024#[stable(feature = "vec_as_mut", since = "1.5.0")]
3025impl<T, A: Allocator> AsMut<Vec<T, A>> for Vec<T, A> {
3026    fn as_mut(&mut self) -> &mut Vec<T, A> {
3027        self
3028    }
3029}
3030
3031#[stable(feature = "rust1", since = "1.0.0")]
3032impl<T, A: Allocator> AsRef<[T]> for Vec<T, A> {
3033    fn as_ref(&self) -> &[T] {
3034        self
3035    }
3036}
3037
3038#[stable(feature = "vec_as_mut", since = "1.5.0")]
3039impl<T, A: Allocator> AsMut<[T]> for Vec<T, A> {
3040    fn as_mut(&mut self) -> &mut [T] {
3041        self
3042    }
3043}
3044
3045#[cfg(not(no_global_oom_handling))]
3046#[stable(feature = "rust1", since = "1.0.0")]
3047impl<T: Clone> From<&[T]> for Vec<T> {
3048    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3049    ///
3050    /// # Examples
3051    ///
3052    /// ```
3053    /// assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
3054    /// ```
3055    #[cfg(not(test))]
3056    fn from(s: &[T]) -> Vec<T> {
3057        s.to_vec()
3058    }
3059    #[cfg(test)]
3060    fn from(s: &[T]) -> Vec<T> {
3061        crate::slice::to_vec(s, Global)
3062    }
3063}
3064
3065#[cfg(not(no_global_oom_handling))]
3066#[stable(feature = "vec_from_mut", since = "1.19.0")]
3067impl<T: Clone> From<&mut [T]> for Vec<T> {
3068    /// Allocate a `Vec<T>` and fill it by cloning `s`'s items.
3069    ///
3070    /// # Examples
3071    ///
3072    /// ```
3073    /// assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
3074    /// ```
3075    #[cfg(not(test))]
3076    fn from(s: &mut [T]) -> Vec<T> {
3077        s.to_vec()
3078    }
3079    #[cfg(test)]
3080    fn from(s: &mut [T]) -> Vec<T> {
3081        crate::slice::to_vec(s, Global)
3082    }
3083}
3084
3085#[cfg(not(no_global_oom_handling))]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3086#[stable(feature = "vec_from_array", since = "1.44.0")]
3087impl<T, const N: usize> From<[T; N]> for Vec<T> {
3088    /// Allocate a `Vec<T>` and move `s`'s items into it.
3089    ///
3090    /// # Examples
3091    ///
3092    /// ```
3093    /// assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
3094    /// ```
3095    #[cfg(not(test))]
3096    fn from(s: [T; N]) -> Vec<T> {
3097        <[T]>::into_vec(box s)
3098    }
3099
3100    #[cfg(test)]
3101    fn from(s: [T; N]) -> Vec<T> {
3102        crate::slice::into_vec(box s)
3103    }
3104}
3105
 
3106#[stable(feature = "vec_from_cow_slice", since = "1.14.0")]
3107impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
3108where
3109    [T]: ToOwned<Owned = Vec<T>>,
3110{
3111    /// Convert a clone-on-write slice into a vector.
3112    ///
3113    /// If `s` already owns a `Vec<T>`, it will be returned directly.
3114    /// If `s` is borrowing a slice, a new `Vec<T>` will be allocated and
3115    /// filled by cloning `s`'s items into it.
3116    ///
3117    /// # Examples
3118    ///
3119    /// ```
3120    /// # use std::borrow::Cow;
3121    /// let o: Cow<[i32]> = Cow::Owned(vec![1, 2, 3]);
3122    /// let b: Cow<[i32]> = Cow::Borrowed(&[1, 2, 3]);
3123    /// assert_eq!(Vec::from(o), Vec::from(b));
3124    /// ```
3125    fn from(s: Cow<'a, [T]>) -> Vec<T> {
3126        s.into_owned()
3127    }
3128}
3129
3130// note: test pulls in libstd, which causes errors here
3131#[cfg(not(test))]
3132#[stable(feature = "vec_from_box", since = "1.18.0")]
3133impl<T, A: Allocator> From<Box<[T], A>> for Vec<T, A> {
3134    /// Convert a boxed slice into a vector by transferring ownership of
3135    /// the existing heap allocation.
3136    ///
3137    /// # Examples
3138    ///
3139    /// ```
3140    /// let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
3141    /// assert_eq!(Vec::from(b), vec![1, 2, 3]);
3142    /// ```
3143    fn from(s: Box<[T], A>) -> Self {
3144        s.into_vec()
3145    }
3146}
3147
3148// note: test pulls in libstd, which causes errors here
3149#[cfg(not(no_global_oom_handling))]
3150#[cfg(not(test))]
3151#[stable(feature = "box_from_vec", since = "1.20.0")]
3152impl<T, A: Allocator> From<Vec<T, A>> for Box<[T], A> {
3153    /// Convert a vector into a boxed slice.
3154    ///
3155    /// If `v` has excess capacity, its items will be moved into a
3156    /// newly-allocated buffer with exactly the right capacity.
3157    ///
3158    /// # Examples
3159    ///
3160    /// ```
3161    /// assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());
 
 
 
 
 
 
 
 
3162    /// ```
3163    fn from(v: Vec<T, A>) -> Self {
3164        v.into_boxed_slice()
3165    }
3166}
3167
3168#[cfg(not(no_global_oom_handling))]
3169#[stable(feature = "rust1", since = "1.0.0")]
3170impl From<&str> for Vec<u8> {
3171    /// Allocate a `Vec<u8>` and fill it with a UTF-8 string.
3172    ///
3173    /// # Examples
3174    ///
3175    /// ```
3176    /// assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']);
3177    /// ```
3178    fn from(s: &str) -> Vec<u8> {
3179        From::from(s.as_bytes())
3180    }
3181}
3182
3183#[stable(feature = "array_try_from_vec", since = "1.48.0")]
3184impl<T, A: Allocator, const N: usize> TryFrom<Vec<T, A>> for [T; N] {
3185    type Error = Vec<T, A>;
3186
3187    /// Gets the entire contents of the `Vec<T>` as an array,
3188    /// if its size exactly matches that of the requested array.
3189    ///
3190    /// # Examples
3191    ///
3192    /// ```
3193    /// assert_eq!(vec![1, 2, 3].try_into(), Ok([1, 2, 3]));
3194    /// assert_eq!(<Vec<i32>>::new().try_into(), Ok([]));
3195    /// ```
3196    ///
3197    /// If the length doesn't match, the input comes back in `Err`:
3198    /// ```
3199    /// let r: Result<[i32; 4], _> = (0..10).collect::<Vec<_>>().try_into();
3200    /// assert_eq!(r, Err(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
3201    /// ```
3202    ///
3203    /// If you're fine with just getting a prefix of the `Vec<T>`,
3204    /// you can call [`.truncate(N)`](Vec::truncate) first.
3205    /// ```
3206    /// let mut v = String::from("hello world").into_bytes();
3207    /// v.sort();
3208    /// v.truncate(2);
3209    /// let [a, b]: [_; 2] = v.try_into().unwrap();
3210    /// assert_eq!(a, b' ');
3211    /// assert_eq!(b, b'd');
3212    /// ```
3213    fn try_from(mut vec: Vec<T, A>) -> Result<[T; N], Vec<T, A>> {
3214        if vec.len() != N {
3215            return Err(vec);
3216        }
3217
3218        // SAFETY: `.set_len(0)` is always sound.
3219        unsafe { vec.set_len(0) };
3220
3221        // SAFETY: A `Vec`'s pointer is always aligned properly, and
3222        // the alignment the array needs is the same as the items.
3223        // We checked earlier that we have sufficient items.
3224        // The items will not double-drop as the `set_len`
3225        // tells the `Vec` not to also drop them.
3226        let array = unsafe { ptr::read(vec.as_ptr() as *const [T; N]) };
3227        Ok(array)
3228    }
3229}