at v6.8 128 kB view raw
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}