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