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