vec.rs 93.6 KB
Newer Older
1
//! A contiguous growable array type with heap-allocated contents, written
M
Manish Goregaokar 已提交
2
//! `Vec<T>`.
3
//!
4 5
//! Vectors have `O(1)` indexing, amortized `O(1)` push (to the end) and
//! `O(1)` pop (from the end).
S
Steve Klabnik 已提交
6 7 8
//!
//! # Examples
//!
9
//! You can explicitly create a [`Vec<T>`] with [`new`]:
S
Steve Klabnik 已提交
10 11
//!
//! ```
S
Steve Klabnik 已提交
12
//! let v: Vec<i32> = Vec::new();
S
Steve Klabnik 已提交
13 14
//! ```
//!
G
Guillaume Gomez 已提交
15
//! ...or by using the [`vec!`] macro:
S
Steve Klabnik 已提交
16 17
//!
//! ```
S
Steve Klabnik 已提交
18
//! let v: Vec<i32> = vec![];
S
Steve Klabnik 已提交
19
//!
S
Steve Klabnik 已提交
20 21 22
//! let v = vec![1, 2, 3, 4, 5];
//!
//! let v = vec![0; 10]; // ten zeroes
S
Steve Klabnik 已提交
23 24
//! ```
//!
G
Guillaume Gomez 已提交
25
//! You can [`push`] values onto the end of a vector (which will grow the vector
26
//! as needed):
S
Steve Klabnik 已提交
27 28
//!
//! ```
S
Steve Klabnik 已提交
29
//! let mut v = vec![1, 2];
S
Steve Klabnik 已提交
30
//!
S
Steve Klabnik 已提交
31
//! v.push(3);
S
Steve Klabnik 已提交
32 33
//! ```
//!
34
//! Popping values works in much the same way:
S
Steve Klabnik 已提交
35 36
//!
//! ```
S
Steve Klabnik 已提交
37
//! let mut v = vec![1, 2];
S
Steve Klabnik 已提交
38
//!
S
Steve Klabnik 已提交
39
//! let two = v.pop();
S
Steve Klabnik 已提交
40
//! ```
41
//!
G
Guillaume Gomez 已提交
42
//! Vectors also support indexing (through the [`Index`] and [`IndexMut`] traits):
43 44
//!
//! ```
S
Steve Klabnik 已提交
45 46 47
//! let mut v = vec![1, 2, 3];
//! let three = v[2];
//! v[1] = v[1] + 5;
48
//! ```
G
Guillaume Gomez 已提交
49 50
//!
//! [`Vec<T>`]: ../../std/vec/struct.Vec.html
51
//! [`new`]: ../../std/vec/struct.Vec.html#method.new
G
Guillaume Gomez 已提交
52 53 54 55
//! [`push`]: ../../std/vec/struct.Vec.html#method.push
//! [`Index`]: ../../std/ops/trait.Index.html
//! [`IndexMut`]: ../../std/ops/trait.IndexMut.html
//! [`vec!`]: ../../std/macro.vec.html
56

B
Brian Anderson 已提交
57
#![stable(feature = "rust1", since = "1.0.0")]
58

59
use core::array::LengthAtMost32;
60 61 62 63 64 65 66 67
use core::cmp::{self, Ordering};
use core::fmt;
use core::hash::{self, Hash};
use core::intrinsics::{arith_offset, assume};
use core::iter::{FromIterator, FusedIterator, TrustedLen};
use core::marker::PhantomData;
use core::mem;
use core::ops::Bound::{Excluded, Included, Unbounded};
M
Mark Rousskov 已提交
68
use core::ops::{self, Index, IndexMut, RangeBounds};
69 70
use core::ptr::{self, NonNull};
use core::slice::{self, SliceIndex};
71

M
Mark Rousskov 已提交
72
use crate::borrow::{Cow, ToOwned};
73
use crate::boxed::Box;
M
Mark Rousskov 已提交
74
use crate::collections::TryReserveError;
75
use crate::raw_vec::RawVec;
76

G
Guillaume Gomez 已提交
77
/// A contiguous growable array type, written `Vec<T>` but pronounced 'vector'.
S
Steven Fackler 已提交
78
///
79
/// # Examples
S
Steven Fackler 已提交
80
///
J
Jonas Hietala 已提交
81
/// ```
82
/// let mut vec = Vec::new();
T
Tobias Bucher 已提交
83 84
/// vec.push(1);
/// vec.push(2);
85 86
///
/// assert_eq!(vec.len(), 2);
N
Nick Cameron 已提交
87
/// assert_eq!(vec[0], 1);
88 89 90
///
/// assert_eq!(vec.pop(), Some(2));
/// assert_eq!(vec.len(), 1);
91
///
T
Tobias Bucher 已提交
92
/// vec[0] = 7;
93 94
/// assert_eq!(vec[0], 7);
///
95
/// vec.extend([1, 2, 3].iter().copied());
96
///
97
/// for x in &vec {
98 99
///     println!("{}", x);
/// }
100
/// assert_eq!(vec, [7, 1, 2, 3]);
101 102
/// ```
///
G
Guillaume Gomez 已提交
103
/// The [`vec!`] macro is provided to make initialization more convenient:
S
Steven Fackler 已提交
104
///
J
Jonas Hietala 已提交
105
/// ```
T
Tobias Bucher 已提交
106
/// let mut vec = vec![1, 2, 3];
S
Steven Fackler 已提交
107
/// vec.push(4);
108
/// assert_eq!(vec, [1, 2, 3, 4]);
S
Steven Fackler 已提交
109
/// ```
110
///
111
/// It can also initialize each element of a `Vec<T>` with a given value.
112 113
/// This may be more efficient than performing allocation and initialization
/// in separate steps, especially when initializing a vector of zeros:
114 115 116 117
///
/// ```
/// let vec = vec![0; 5];
/// assert_eq!(vec, [0, 0, 0, 0, 0]);
118 119 120 121
///
/// // The following is equivalent, but potentially slower:
/// let mut vec1 = Vec::with_capacity(5);
/// vec1.resize(5, 0);
122 123
/// ```
///
S
Steve Klabnik 已提交
124
/// Use a `Vec<T>` as an efficient stack:
125 126 127 128
///
/// ```
/// let mut stack = Vec::new();
///
T
Tobias Bucher 已提交
129 130 131
/// stack.push(1);
/// stack.push(2);
/// stack.push(3);
132
///
133
/// while let Some(top) = stack.pop() {
134 135 136 137 138
///     // Prints 3, 2, 1
///     println!("{}", top);
/// }
/// ```
///
139 140
/// # Indexing
///
G
Guillaume Gomez 已提交
141 142
/// The `Vec` type allows to access values by index, because it implements the
/// [`Index`] trait. An example will be more explicit:
143 144
///
/// ```
145
/// let v = vec![0, 2, 4, 6];
146 147 148
/// println!("{}", v[1]); // it will display '2'
/// ```
///
G
Guillaume Gomez 已提交
149
/// However be careful: if you try to access an index which isn't in the `Vec`,
150 151
/// your software will panic! You cannot do this:
///
152
/// ```should_panic
153
/// let v = vec![0, 2, 4, 6];
154 155 156
/// println!("{}", v[6]); // it will panic!
/// ```
///
L
Lzu Tao 已提交
157 158
/// Use [`get`] and [`get_mut`] if you want to check whether the index is in
/// the `Vec`.
159 160 161
///
/// # Slicing
///
G
Guillaume Gomez 已提交
162
/// A `Vec` can be mutable. Slices, on the other hand, are read-only objects.
163
/// To get a slice, use `&`. Example:
164 165 166 167 168 169
///
/// ```
/// fn read_slice(slice: &[usize]) {
///     // ...
/// }
///
170
/// let v = vec![0, 1];
171 172 173 174 175 176 177 178
/// read_slice(&v);
///
/// // ... and that's all!
/// // you can also do it like this:
/// let x : &[usize] = &v;
/// ```
///
/// In Rust, it's more common to pass slices as arguments rather than vectors
G
Guillaume Gomez 已提交
179 180
/// when you just want to provide a read access. The same goes for [`String`] and
/// [`&str`].
181
///
182 183
/// # Capacity and reallocation
///
184 185 186 187 188
/// The capacity of a vector is the amount of space allocated for any future
/// elements that will be added onto the vector. This is not to be confused with
/// the *length* of a vector, which specifies the number of actual elements
/// within the vector. If a vector's length exceeds its capacity, its capacity
/// will automatically be increased, but its elements will have to be
S
Steve Klabnik 已提交
189
/// reallocated.
190
///
191 192 193 194
/// For example, a vector with capacity 10 and length 0 would be an empty vector
/// with space for 10 more elements. Pushing 10 or fewer elements onto the
/// vector will not change its capacity or cause reallocation to occur. However,
/// if the vector's length is increased to 11, it will have to reallocate, which
G
Guillaume Gomez 已提交
195
/// can be slow. For this reason, it is recommended to use [`Vec::with_capacity`]
196
/// whenever possible to specify how big the vector is expected to get.
197 198 199
///
/// # Guarantees
///
200
/// Due to its incredibly fundamental nature, `Vec` makes a lot of guarantees
201 202 203
/// about its design. This ensures that it's as low-overhead as possible in
/// the general case, and can be correctly manipulated in primitive ways
/// by unsafe code. Note that these guarantees refer to an unqualified `Vec<T>`.
204
/// If additional type parameters are added (e.g., to support custom allocators),
205 206
/// overriding their defaults may change the behavior.
///
207
/// Most fundamentally, `Vec` is and always will be a (pointer, capacity, length)
208 209 210 211 212
/// triplet. No more, no less. The order of these fields is completely
/// unspecified, and you should use the appropriate methods to modify these.
/// The pointer will never be null, so this type is null-pointer-optimized.
///
/// However, the pointer may not actually point to allocated memory. In particular,
213 214
/// if you construct a `Vec` with capacity 0 via [`Vec::new`], [`vec![]`][`vec!`],
/// [`Vec::with_capacity(0)`][`Vec::with_capacity`], or by calling [`shrink_to_fit`]
G
Guillaume Gomez 已提交
215 216
/// on an empty Vec, it will not allocate memory. Similarly, if you store zero-sized
/// types inside a `Vec`, it will not allocate space for them. *Note that in this case
217
/// the `Vec` may not report a [`capacity`] of 0*. `Vec` will allocate if and only
S
Stjepan Glavina 已提交
218
/// if [`mem::size_of::<T>`]`() * capacity() > 0`. In general, `Vec`'s allocation
219 220 221 222
/// details are very subtle &mdash; if you intend to allocate memory using a `Vec`
/// and use it for something else (either to pass to unsafe code, or to build your
/// own memory-backed collection), be sure to deallocate this memory by using
/// `from_raw_parts` to recover the `Vec` and then dropping it.
223
///
G
Guillaume Gomez 已提交
224
/// If a `Vec` *has* allocated memory, then the memory it points to is on the heap
225
/// (as defined by the allocator Rust is configured to use by default), and its
226 227 228
/// pointer points to [`len`] initialized, contiguous elements in order (what
/// you would see if you coerced it to a slice), followed by [`capacity`]` -
/// `[`len`] logically uninitialized, contiguous elements.
229
///
G
Guillaume Gomez 已提交
230
/// `Vec` will never perform a "small optimization" where elements are actually
231 232 233
/// stored on the stack for two reasons:
///
/// * It would make it more difficult for unsafe code to correctly manipulate
G
Guillaume Gomez 已提交
234 235
///   a `Vec`. The contents of a `Vec` wouldn't have a stable address if it were
///   only moved, and it would be more difficult to determine if a `Vec` had
236 237 238 239 240
///   actually allocated memory.
///
/// * It would penalize the general case, incurring an additional branch
///   on every access.
///
G
Guillaume Gomez 已提交
241 242
/// `Vec` will never automatically shrink itself, even if completely empty. This
/// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec`
243
/// and then filling it back up to the same [`len`] should incur no calls to
G
Guillaume Gomez 已提交
244
/// the allocator. If you wish to free up unused memory, use
M
Matthew Kraai 已提交
245
/// [`shrink_to_fit`].
G
Guillaume Gomez 已提交
246 247
///
/// [`push`] and [`insert`] will never (re)allocate if the reported capacity is
248
/// sufficient. [`push`] and [`insert`] *will* (re)allocate if
249
/// [`len`]` == `[`capacity`]. That is, the reported capacity is completely
G
Guillaume Gomez 已提交
250 251 252 253 254 255
/// accurate, and can be relied on. It can even be used to manually free the memory
/// allocated by a `Vec` if desired. Bulk insertion methods *may* reallocate, even
/// when not necessary.
///
/// `Vec` does not guarantee any particular growth strategy when reallocating
/// when full, nor when [`reserve`] is called. The current strategy is basic
256
/// and it may prove desirable to use a non-constant growth factor. Whatever
G
Guillaume Gomez 已提交
257
/// strategy is used will of course guarantee `O(1)` amortized [`push`].
258
///
G
Guillaume Gomez 已提交
259
/// `vec![x; n]`, `vec![a, b, c, d]`, and
260
/// [`Vec::with_capacity(n)`][`Vec::with_capacity`], will all produce a `Vec`
261
/// with exactly the requested capacity. If [`len`]` == `[`capacity`],
262 263
/// (as is the case for the [`vec!`] macro), then a `Vec<T>` can be converted to
/// and from a [`Box<[T]>`][owned slice] without reallocating or moving the elements.
264
///
G
Guillaume Gomez 已提交
265
/// `Vec` will not specifically overwrite any data that is removed from it,
266 267 268
/// but also won't specifically preserve it. Its uninitialized memory is
/// scratch space that it may use however it wants. It will generally just do
/// whatever is most efficient or otherwise easy to implement. Do not rely on
G
Guillaume Gomez 已提交
269 270
/// removed data to be erased for security purposes. Even if you drop a `Vec`, its
/// buffer may simply be reused by another `Vec`. Even if you zero a `Vec`'s memory
271
/// first, that may not actually happen because the optimizer does not consider
272 273 274
/// this a side-effect that must be preserved. There is one case which we will
/// not break, however: using `unsafe` code to write to the excess capacity,
/// and then increasing the length to match, is always valid.
275
///
276 277
/// `Vec` does not currently guarantee the order in which elements are dropped.
/// The order has changed in the past and may change again.
278
///
G
Guillaume Gomez 已提交
279
/// [`vec!`]: ../../std/macro.vec.html
L
Lzu Tao 已提交
280 281
/// [`get`]: ../../std/vec/struct.Vec.html#method.get
/// [`get_mut`]: ../../std/vec/struct.Vec.html#method.get_mut
G
Guillaume Gomez 已提交
282 283 284 285
/// [`Index`]: ../../std/ops/trait.Index.html
/// [`String`]: ../../std/string/struct.String.html
/// [`&str`]: ../../std/primitive.str.html
/// [`Vec::with_capacity`]: ../../std/vec/struct.Vec.html#method.with_capacity
286 287 288 289 290
/// [`Vec::new`]: ../../std/vec/struct.Vec.html#method.new
/// [`shrink_to_fit`]: ../../std/vec/struct.Vec.html#method.shrink_to_fit
/// [`capacity`]: ../../std/vec/struct.Vec.html#method.capacity
/// [`mem::size_of::<T>`]: ../../std/mem/fn.size_of.html
/// [`len`]: ../../std/vec/struct.Vec.html#method.len
G
Guillaume Gomez 已提交
291 292 293
/// [`push`]: ../../std/vec/struct.Vec.html#method.push
/// [`insert`]: ../../std/vec/struct.Vec.html#method.insert
/// [`reserve`]: ../../std/vec/struct.Vec.html#method.reserve
294
/// [owned slice]: ../../std/boxed/struct.Box.html
B
Brian Anderson 已提交
295
#[stable(feature = "rust1", since = "1.0.0")]
M
Mark Rousskov 已提交
296
#[cfg_attr(not(test), rustc_diagnostic_item = "vec_type")]
297
pub struct Vec<T> {
298
    buf: RawVec<T>,
A
Alexis 已提交
299
    len: usize,
300 301
}

A
Aaron Turon 已提交
302 303 304
////////////////////////////////////////////////////////////////////////////////
// Inherent methods
////////////////////////////////////////////////////////////////////////////////
305

306
impl<T> Vec<T> {
S
Steve Klabnik 已提交
307
    /// Constructs a new, empty `Vec<T>`.
S
Steven Fackler 已提交
308 309 310
    ///
    /// The vector will not allocate until elements are pushed onto it.
    ///
311
    /// # Examples
S
Steven Fackler 已提交
312
    ///
J
Jonas Hietala 已提交
313
    /// ```
314
    /// # #![allow(unused_mut)]
315
    /// let mut vec: Vec<i32> = Vec::new();
S
Steven Fackler 已提交
316
    /// ```
317
    #[inline]
M
Mark Rousskov 已提交
318
    #[rustc_const_stable(feature = "const_vec_new", since = "1.32.0")]
B
Brian Anderson 已提交
319
    #[stable(feature = "rust1", since = "1.0.0")]
M
Mark Mansi 已提交
320
    pub const fn new() -> Vec<T> {
M
Mark Rousskov 已提交
321
        Vec { buf: RawVec::NEW, len: 0 }
322 323
    }

S
Steve Klabnik 已提交
324
    /// Constructs a new, empty `Vec<T>` with the specified capacity.
S
Steven Fackler 已提交
325
    ///
326 327
    /// The vector will be able to hold exactly `capacity` elements without
    /// reallocating. If `capacity` is 0, the vector will not allocate.
S
Steven Fackler 已提交
328
    ///
329 330 331 332
    /// It is important to note that although the returned vector has the
    /// *capacity* specified, the vector will have a zero *length*. For an
    /// explanation of the difference between length and capacity, see
    /// *[Capacity and reallocation]*.
333 334
    ///
    /// [Capacity and reallocation]: #capacity-and-reallocation
335
    ///
336
    /// # Examples
S
Steven Fackler 已提交
337
    ///
J
Jonas Hietala 已提交
338
    /// ```
339
    /// let mut vec = Vec::with_capacity(10);
340 341 342 343 344
    ///
    /// // The vector contains no items, even though it has capacity for more
    /// assert_eq!(vec.len(), 0);
    ///
    /// // These are all done without reallocating...
T
Tobias Bucher 已提交
345
    /// for i in 0..10 {
346 347 348 349 350
    ///     vec.push(i);
    /// }
    ///
    /// // ...but this may make the vector reallocate
    /// vec.push(11);
S
Steven Fackler 已提交
351
    /// ```
352
    #[inline]
B
Brian Anderson 已提交
353
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
354
    pub fn with_capacity(capacity: usize) -> Vec<T> {
M
Mark Rousskov 已提交
355
        Vec { buf: RawVec::with_capacity(capacity), len: 0 }
356 357
    }

J
Jake Goulding 已提交
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
    /// Decomposes a `Vec<T>` into its raw components.
    ///
    /// Returns the raw pointer to the underlying data, the length of
    /// the vector (in elements), and the allocated capacity of the
    /// data (in elements). These are the same arguments in the same
    /// order as the arguments to [`from_raw_parts`].
    ///
    /// After calling this function, the caller is responsible for the
    /// memory previously managed by the `Vec`. The only way to do
    /// this is to convert the raw pointer, length, and capacity back
    /// into a `Vec` with the [`from_raw_parts`] function, allowing
    /// the destructor to perform the cleanup.
    ///
    /// [`from_raw_parts`]: #method.from_raw_parts
    ///
    /// # Examples
    ///
    /// ```
    /// #![feature(vec_into_raw_parts)]
    /// let v: Vec<i32> = vec![-1, 0, 1];
    ///
    /// let (ptr, len, cap) = v.into_raw_parts();
    ///
    /// let rebuilt = unsafe {
    ///     // We can now make changes to the components, such as
    ///     // transmuting the raw pointer to a compatible type.
    ///     let ptr = ptr as *mut u32;
    ///
    ///     Vec::from_raw_parts(ptr, len, cap)
    /// };
    /// assert_eq!(rebuilt, [4294967295, 0, 1]);
    /// ```
    #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
    pub fn into_raw_parts(self) -> (*mut T, usize, usize) {
        let mut me = mem::ManuallyDrop::new(self);
        (me.as_mut_ptr(), me.len(), me.capacity())
    }

396
    /// Creates a `Vec<T>` directly from the raw components of another vector.
397
    ///
S
Steve Klabnik 已提交
398
    /// # Safety
399 400 401 402
    ///
    /// This is highly unsafe, due to the number of invariants that aren't
    /// checked:
    ///
G
Guillaume Gomez 已提交
403
    /// * `ptr` needs to have been previously allocated via [`String`]/`Vec<T>`
404
    ///   (at least, it's highly likely to be incorrect if it wasn't).
405
    /// * `ptr`'s `T` needs to have the same size and alignment as it was allocated with.
J
Jake Goulding 已提交
406
    /// * `length` needs to be less than or equal to `capacity`.
407 408 409
    /// * `capacity` needs to be the capacity that the pointer was allocated with.
    ///
    /// Violating these may cause problems like corrupting the allocator's
B
Bastien Orivel 已提交
410
    /// internal data structures. For example it is **not** safe
411 412 413 414 415
    /// to build a `Vec<u8>` from a pointer to a C `char` array with length `size_t`.
    /// It's also not safe to build one from a `Vec<u16>` and its length, because
    /// the allocator cares about the alignment, and these two types have different
    /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after
    /// turning it into a `Vec<u8>` it'll be deallocated with alignment 1.
J
Jonas Hietala 已提交
416
    ///
417 418 419 420 421 422
    /// The ownership of `ptr` is effectively transferred to the
    /// `Vec<T>` which may then deallocate, reallocate or change the
    /// contents of memory pointed to by the pointer at will. Ensure
    /// that nothing else uses the pointer after calling this
    /// function.
    ///
G
Guillaume Gomez 已提交
423 424
    /// [`String`]: ../../std/string/struct.String.html
    ///
425
    /// # Examples
J
Jonas Hietala 已提交
426 427 428 429 430
    ///
    /// ```
    /// use std::ptr;
    /// use std::mem;
    ///
431 432
    /// let v = vec![1, 2, 3];
    ///
J
Jake Goulding 已提交
433
    // FIXME Update this when vec_into_raw_parts is stabilized
434 435 436
    /// // Prevent running `v`'s destructor so we are in complete control
    /// // of the allocation.
    /// let mut v = mem::ManuallyDrop::new(v);
J
Jonas Hietala 已提交
437
    ///
438 439 440 441
    /// // Pull out the various important pieces of information about `v`
    /// let p = v.as_mut_ptr();
    /// let len = v.len();
    /// let cap = v.capacity();
J
Jonas Hietala 已提交
442
    ///
443 444 445 446
    /// unsafe {
    ///     // Overwrite memory with 4, 5, 6
    ///     for i in 0..len as isize {
    ///         ptr::write(p.offset(i), 4 + i);
J
Jonas Hietala 已提交
447
    ///     }
448 449 450 451
    ///
    ///     // Put everything back together into a Vec
    ///     let rebuilt = Vec::from_raw_parts(p, len, cap);
    ///     assert_eq!(rebuilt, [4, 5, 6]);
J
Jonas Hietala 已提交
452 453
    /// }
    /// ```
B
Brian Anderson 已提交
454
    #[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
455
    pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Vec<T> {
M
Mark Rousskov 已提交
456
        Vec { buf: RawVec::from_raw_parts(ptr, capacity), len: length }
457 458
    }

A
Aaron Turon 已提交
459 460
    /// Returns the number of elements the vector can hold without
    /// reallocating.
S
Steven Fackler 已提交
461
    ///
462
    /// # Examples
S
Steven Fackler 已提交
463
    ///
J
Jonas Hietala 已提交
464
    /// ```
465
    /// let vec: Vec<i32> = Vec::with_capacity(10);
A
Aaron Turon 已提交
466
    /// assert_eq!(vec.capacity(), 10);
S
Steven Fackler 已提交
467
    /// ```
468
    #[inline]
B
Brian Anderson 已提交
469
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
470
    pub fn capacity(&self) -> usize {
471
        self.buf.capacity()
A
Aaron Turon 已提交
472
    }
473

474 475
    /// Reserves capacity for at least `additional` more elements to be inserted
    /// in the given `Vec<T>`. The collection may reserve more space to avoid
476 477 478
    /// frequent reallocations. After calling `reserve`, capacity will be
    /// greater than or equal to `self.len() + additional`. Does nothing if
    /// capacity is already sufficient.
S
Steven Fackler 已提交
479
    ///
A
Aaron Turon 已提交
480
    /// # Panics
S
Steven Fackler 已提交
481
    ///
A
Alexis 已提交
482
    /// Panics if the new capacity overflows `usize`.
S
Steven Fackler 已提交
483
    ///
484 485
    /// # Examples
    ///
J
Jonas Hietala 已提交
486
    /// ```
487
    /// let mut vec = vec![1];
A
Aaron Turon 已提交
488 489
    /// vec.reserve(10);
    /// assert!(vec.capacity() >= 11);
S
Steven Fackler 已提交
490
    /// ```
B
Brian Anderson 已提交
491
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
492
    pub fn reserve(&mut self, additional: usize) {
493
        self.buf.reserve(self.len, additional);
494
    }
495

A
Aaron Turon 已提交
496
    /// Reserves the minimum capacity for exactly `additional` more elements to
497 498 499
    /// be inserted in the given `Vec<T>`. After calling `reserve_exact`,
    /// capacity will be greater than or equal to `self.len() + additional`.
    /// Does nothing if the capacity is already sufficient.
S
Steven Fackler 已提交
500
    ///
A
Aaron Turon 已提交
501
    /// Note that the allocator may give the collection more space than it
A
Alexander Regueiro 已提交
502
    /// requests. Therefore, capacity can not be relied upon to be precisely
A
Aaron Turon 已提交
503 504 505 506
    /// minimal. Prefer `reserve` if future insertions are expected.
    ///
    /// # Panics
    ///
A
Alexis 已提交
507
    /// Panics if the new capacity overflows `usize`.
S
Steven Fackler 已提交
508
    ///
509
    /// # Examples
S
Steven Fackler 已提交
510
    ///
J
Jonas Hietala 已提交
511
    /// ```
512
    /// let mut vec = vec![1];
A
Aaron Turon 已提交
513 514
    /// vec.reserve_exact(10);
    /// assert!(vec.capacity() >= 11);
S
Steven Fackler 已提交
515
    /// ```
B
Brian Anderson 已提交
516
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
517
    pub fn reserve_exact(&mut self, additional: usize) {
518
        self.buf.reserve_exact(self.len, additional);
519
    }
520

521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
    /// Tries to reserve capacity for at least `additional` more elements to be inserted
    /// in the given `Vec<T>`. The collection may reserve more space to avoid
    /// frequent reallocations. After calling `reserve`, capacity will be
    /// greater than or equal to `self.len() + additional`. Does nothing if
    /// capacity is already sufficient.
    ///
    /// # Errors
    ///
    /// If the capacity overflows, or the allocator reports a failure, then an error
    /// is returned.
    ///
    /// # Examples
    ///
    /// ```
    /// #![feature(try_reserve)]
536
    /// use std::collections::TryReserveError;
537
    ///
538
    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
539 540 541 542 543 544 545 546 547 548 549 550 551 552
    ///     let mut output = Vec::new();
    ///
    ///     // Pre-reserve the memory, exiting if we can't
    ///     output.try_reserve(data.len())?;
    ///
    ///     // Now we know this can't OOM in the middle of our complex work
    ///     output.extend(data.iter().map(|&val| {
    ///         val * 2 + 5 // very complicated
    ///     }));
    ///
    ///     Ok(output)
    /// }
    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
    /// ```
M
Mark Rousskov 已提交
553
    #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")]
554
    pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
555 556 557 558 559 560 561 562 563
        self.buf.try_reserve(self.len, additional)
    }

    /// Tries to reserves the minimum capacity for exactly `additional` more elements to
    /// be inserted in the given `Vec<T>`. After calling `reserve_exact`,
    /// capacity will be greater than or equal to `self.len() + additional`.
    /// Does nothing if the capacity is already sufficient.
    ///
    /// Note that the allocator may give the collection more space than it
A
Alexander Regueiro 已提交
564
    /// requests. Therefore, capacity can not be relied upon to be precisely
565 566 567 568 569 570 571 572 573 574 575
    /// minimal. Prefer `reserve` if future insertions are expected.
    ///
    /// # Errors
    ///
    /// If the capacity overflows, or the allocator reports a failure, then an error
    /// is returned.
    ///
    /// # Examples
    ///
    /// ```
    /// #![feature(try_reserve)]
576
    /// use std::collections::TryReserveError;
577
    ///
578
    /// fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {
579 580 581 582 583 584 585 586 587 588 589 590 591 592
    ///     let mut output = Vec::new();
    ///
    ///     // Pre-reserve the memory, exiting if we can't
    ///     output.try_reserve(data.len())?;
    ///
    ///     // Now we know this can't OOM in the middle of our complex work
    ///     output.extend(data.iter().map(|&val| {
    ///         val * 2 + 5 // very complicated
    ///     }));
    ///
    ///     Ok(output)
    /// }
    /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
    /// ```
M
Mark Rousskov 已提交
593 594
    #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")]
    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
595 596 597
        self.buf.try_reserve_exact(self.len, additional)
    }

A
Aaron Turon 已提交
598
    /// Shrinks the capacity of the vector as much as possible.
S
Steven Fackler 已提交
599
    ///
A
Aaron Turon 已提交
600 601
    /// It will drop down as close as possible to the length but the allocator
    /// may still inform the vector that there is space for a few more elements.
S
Steven Fackler 已提交
602
    ///
603
    /// # Examples
S
Steven Fackler 已提交
604
    ///
J
Jonas Hietala 已提交
605
    /// ```
606
    /// let mut vec = Vec::with_capacity(10);
607
    /// vec.extend([1, 2, 3].iter().cloned());
A
Aaron Turon 已提交
608 609 610
    /// assert_eq!(vec.capacity(), 10);
    /// vec.shrink_to_fit();
    /// assert!(vec.capacity() >= 3);
S
Steven Fackler 已提交
611
    /// ```
B
Brian Anderson 已提交
612
    #[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
613
    pub fn shrink_to_fit(&mut self) {
614 615 616
        if self.capacity() != self.len {
            self.buf.shrink_to_fit(self.len);
        }
617 618
    }

619 620 621 622 623
    /// Shrinks the capacity of the vector with a lower bound.
    ///
    /// The capacity will remain at least as large as both the length
    /// and the supplied value.
    ///
624 625
    /// # Panics
    ///
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
    /// Panics if the current capacity is smaller than the supplied
    /// minimum capacity.
    ///
    /// # Examples
    ///
    /// ```
    /// #![feature(shrink_to)]
    /// let mut vec = Vec::with_capacity(10);
    /// vec.extend([1, 2, 3].iter().cloned());
    /// assert_eq!(vec.capacity(), 10);
    /// vec.shrink_to(4);
    /// assert!(vec.capacity() >= 4);
    /// vec.shrink_to(0);
    /// assert!(vec.capacity() >= 3);
    /// ```
M
Mark Rousskov 已提交
641
    #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")]
642 643 644 645
    pub fn shrink_to(&mut self, min_capacity: usize) {
        self.buf.shrink_to_fit(cmp::max(self.len, min_capacity));
    }

646
    /// Converts the vector into [`Box<[T]>`][owned slice].
C
Chase Southwood 已提交
647
    ///
648
    /// Note that this will drop any excess capacity.
G
Guillaume Gomez 已提交
649
    ///
650
    /// [owned slice]: ../../std/boxed/struct.Box.html
G
Guillaume Gomez 已提交
651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
    ///
    /// # Examples
    ///
    /// ```
    /// let v = vec![1, 2, 3];
    ///
    /// let slice = v.into_boxed_slice();
    /// ```
    ///
    /// Any excess capacity is removed:
    ///
    /// ```
    /// let mut vec = Vec::with_capacity(10);
    /// vec.extend([1, 2, 3].iter().cloned());
    ///
    /// assert_eq!(vec.capacity(), 10);
    /// let slice = vec.into_boxed_slice();
    /// assert_eq!(slice.into_vec().capacity(), 3);
    /// ```
670
    #[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
671 672
    pub fn into_boxed_slice(mut self) -> Box<[T]> {
        unsafe {
673 674
            self.shrink_to_fit();
            let buf = ptr::read(&self.buf);
A
Aaron Turon 已提交
675
            mem::forget(self);
676
            buf.into_box()
677 678 679
        }
    }

680 681
    /// Shortens the vector, keeping the first `len` elements and dropping
    /// the rest.
C
Chase Southwood 已提交
682
    ///
A
Aaron Turon 已提交
683 684
    /// If `len` is greater than the vector's current length, this has no
    /// effect.
C
Chase Southwood 已提交
685
    ///
686 687 688
    /// The [`drain`] method can emulate `truncate`, but causes the excess
    /// elements to be returned instead of dropped.
    ///
689 690 691
    /// Note that this method has no effect on the allocated capacity
    /// of the vector.
    ///
C
Chase Southwood 已提交
692 693
    /// # Examples
    ///
694 695
    /// Truncating a five element vector to two elements:
    ///
C
Chase Southwood 已提交
696
    /// ```
C
Cameron Sun 已提交
697
    /// let mut vec = vec![1, 2, 3, 4, 5];
A
Aaron Turon 已提交
698
    /// vec.truncate(2);
699
    /// assert_eq!(vec, [1, 2]);
C
Chase Southwood 已提交
700
    /// ```
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
    ///
    /// No truncation occurs when `len` is greater than the vector's current
    /// length:
    ///
    /// ```
    /// let mut vec = vec![1, 2, 3];
    /// vec.truncate(8);
    /// assert_eq!(vec, [1, 2, 3]);
    /// ```
    ///
    /// Truncating when `len == 0` is equivalent to calling the [`clear`]
    /// method.
    ///
    /// ```
    /// let mut vec = vec![1, 2, 3];
    /// vec.truncate(0);
    /// assert_eq!(vec, []);
    /// ```
    ///
    /// [`clear`]: #method.clear
    /// [`drain`]: #method.drain
B
Brian Anderson 已提交
722
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
723
    pub fn truncate(&mut self, len: usize) {
724 725 726 727 728 729 730 731 732 733
        // This is safe because:
        //
        // * the slice passed to `drop_in_place` is valid; the `len > self.len`
        //   case avoids creating an invalid slice, and
        // * the `len` of the vector is shrunk before calling `drop_in_place`,
        //   such that no value will be dropped twice in case `drop_in_place`
        //   were to panic once (if it panics twice, the program aborts).
        unsafe {
            if len > self.len {
                return;
A
Aaron Turon 已提交
734
            }
735
            let s = self.get_unchecked_mut(len..) as *mut _;
736
            self.len = len;
737
            ptr::drop_in_place(s);
C
Chase Southwood 已提交
738 739 740
        }
    }

741
    /// Extracts a slice containing the entire vector.
742 743
    ///
    /// Equivalent to `&s[..]`.
744 745 746 747 748 749 750 751
    ///
    /// # Examples
    ///
    /// ```
    /// use std::io::{self, Write};
    /// let buffer = vec![1, 2, 3, 5, 8];
    /// io::sink().write(buffer.as_slice()).unwrap();
    /// ```
752
    #[inline]
753
    #[stable(feature = "vec_as_slice", since = "1.7.0")]
754 755 756 757
    pub fn as_slice(&self) -> &[T] {
        self
    }

758 759 760
    /// Extracts a mutable slice of the entire vector.
    ///
    /// Equivalent to `&mut s[..]`.
761 762 763 764 765 766 767 768
    ///
    /// # Examples
    ///
    /// ```
    /// use std::io::{self, Read};
    /// let mut buffer = vec![0; 3];
    /// io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
    /// ```
A
Aaron Turon 已提交
769
    #[inline]
770
    #[stable(feature = "vec_as_slice", since = "1.7.0")]
771
    pub fn as_mut_slice(&mut self) -> &mut [T] {
772
        self
773
    }
H
Huon Wilson 已提交
774

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805
    /// Returns a raw pointer to the vector's buffer.
    ///
    /// The caller must ensure that the vector outlives the pointer this
    /// function returns, or else it will end up pointing to garbage.
    /// Modifying the vector may cause its buffer to be reallocated,
    /// which would also make any pointers to it invalid.
    ///
    /// The caller must also ensure that the memory the pointer (non-transitively) points to
    /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
    /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
    ///
    /// # Examples
    ///
    /// ```
    /// let x = vec![1, 2, 4];
    /// let x_ptr = x.as_ptr();
    ///
    /// unsafe {
    ///     for i in 0..x.len() {
    ///         assert_eq!(*x_ptr.add(i), 1 << i);
    ///     }
    /// }
    /// ```
    ///
    /// [`as_mut_ptr`]: #method.as_mut_ptr
    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
    #[inline]
    pub fn as_ptr(&self) -> *const T {
        // We shadow the slice method of the same name to avoid going through
        // `deref`, which creates an intermediate reference.
        let ptr = self.buf.ptr();
M
Mark Rousskov 已提交
806 807 808
        unsafe {
            assume(!ptr.is_null());
        }
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
        ptr
    }

    /// Returns an unsafe mutable pointer to the vector's buffer.
    ///
    /// The caller must ensure that the vector outlives the pointer this
    /// function returns, or else it will end up pointing to garbage.
    /// Modifying the vector may cause its buffer to be reallocated,
    /// which would also make any pointers to it invalid.
    ///
    /// # Examples
    ///
    /// ```
    /// // Allocate vector big enough for 4 elements.
    /// let size = 4;
    /// let mut x: Vec<i32> = Vec::with_capacity(size);
    /// let x_ptr = x.as_mut_ptr();
    ///
    /// // Initialize elements via raw pointer writes, then set length.
    /// unsafe {
    ///     for i in 0..size {
    ///         *x_ptr.add(i) = i as i32;
    ///     }
    ///     x.set_len(size);
    /// }
    /// assert_eq!(&*x, &[0,1,2,3]);
    /// ```
    #[stable(feature = "vec_as_ptr", since = "1.37.0")]
    #[inline]
    pub fn as_mut_ptr(&mut self) -> *mut T {
        // We shadow the slice method of the same name to avoid going through
        // `deref_mut`, which creates an intermediate reference.
        let ptr = self.buf.ptr();
M
Mark Rousskov 已提交
842 843 844
        unsafe {
            assume(!ptr.is_null());
        }
845 846 847
        ptr
    }

848
    /// Forces the length of the vector to `new_len`.
A
Aaron Turon 已提交
849
    ///
S
Scott McMurray 已提交
850
    /// This is a low-level operation that maintains none of the normal
A
Alexander Regueiro 已提交
851
    /// invariants of the type. Normally changing the length of a vector
S
Scott McMurray 已提交
852 853
    /// is done using one of the safe operations instead, such as
    /// [`truncate`], [`resize`], [`extend`], or [`clear`].
A
Aaron Turon 已提交
854
    ///
S
Scott McMurray 已提交
855 856
    /// [`truncate`]: #method.truncate
    /// [`resize`]: #method.resize
857
    /// [`extend`]: ../../std/iter/trait.Extend.html#tymethod.extend
S
Scott McMurray 已提交
858
    /// [`clear`]: #method.clear
A
Aaron Turon 已提交
859
    ///
S
Scott McMurray 已提交
860
    /// # Safety
861
    ///
862 863
    /// - `new_len` must be less than or equal to [`capacity()`].
    /// - The elements at `old_len..new_len` must be initialized.
864
    ///
865
    /// [`capacity()`]: #method.capacity
866
    ///
S
Scott McMurray 已提交
867 868
    /// # Examples
    ///
869 870
    /// This method can be useful for situations in which the vector
    /// is serving as a buffer for other code, particularly over FFI:
S
Scott McMurray 已提交
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
    ///
    /// ```no_run
    /// # #![allow(dead_code)]
    /// # // This is just a minimal skeleton for the doc example;
    /// # // don't use this as a starting point for a real library.
    /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void }
    /// # const Z_OK: i32 = 0;
    /// # extern "C" {
    /// #     fn deflateGetDictionary(
    /// #         strm: *mut std::ffi::c_void,
    /// #         dictionary: *mut u8,
    /// #         dictLength: *mut usize,
    /// #     ) -> i32;
    /// # }
    /// # impl StreamWrapper {
    /// pub fn get_dictionary(&self) -> Option<Vec<u8>> {
887
    ///     // Per the FFI method's docs, "32768 bytes is always enough".
S
Scott McMurray 已提交
888 889
    ///     let mut dict = Vec::with_capacity(32_768);
    ///     let mut dict_length = 0;
M
Mazdak Farrokhzad 已提交
890 891 892 893
    ///     // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
    ///     // 1. `dict_length` elements were initialized.
    ///     // 2. `dict_length` <= the capacity (32_768)
    ///     // which makes `set_len` safe to call.
S
Scott McMurray 已提交
894 895 896 897 898 899 900 901 902 903 904
    ///     unsafe {
    ///         // Make the FFI call...
    ///         let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
    ///         if r == Z_OK {
    ///             // ...and update the length to what was initialized.
    ///             dict.set_len(dict_length);
    ///             Some(dict)
    ///         } else {
    ///             None
    ///         }
    ///     }
905
    /// }
S
Scott McMurray 已提交
906
    /// # }
907 908
    /// ```
    ///
S
Scott McMurray 已提交
909 910
    /// While the following example is sound, there is a memory leak since
    /// the inner vectors were not freed prior to the `set_len` call:
911 912
    ///
    /// ```
913 914 915
    /// let mut vec = vec![vec![1, 0, 0],
    ///                    vec![0, 1, 0],
    ///                    vec![0, 0, 1]];
916 917 918
    /// // SAFETY:
    /// // 1. `old_len..0` is empty so no elements need to be initialized.
    /// // 2. `0 <= capacity` always holds whatever `capacity` is.
919 920 921 922 923
    /// unsafe {
    ///     vec.set_len(0);
    /// }
    /// ```
    ///
924 925
    /// Normally, here, one would use [`clear`] instead to correctly drop
    /// the contents and thus not leak memory.
926
    #[inline]
B
Brian Anderson 已提交
927
    #[stable(feature = "rust1", since = "1.0.0")]
S
Scott McMurray 已提交
928
    pub unsafe fn set_len(&mut self, new_len: usize) {
929 930
        debug_assert!(new_len <= self.capacity());

S
Scott McMurray 已提交
931
        self.len = new_len;
932 933
    }

934
    /// Removes an element from the vector and returns it.
935
    ///
936
    /// The removed element is replaced by the last element of the vector.
S
Steve Klabnik 已提交
937 938
    ///
    /// This does not preserve ordering, but is O(1).
S
Steven Fackler 已提交
939
    ///
A
Aaron Turon 已提交
940 941 942
    /// # Panics
    ///
    /// Panics if `index` is out of bounds.
S
Steven Fackler 已提交
943
    ///
944
    /// # Examples
S
Steven Fackler 已提交
945
    ///
J
Jonas Hietala 已提交
946
    /// ```
947
    /// let mut v = vec!["foo", "bar", "baz", "qux"];
S
Steven Fackler 已提交
948
    ///
A
Aaron Turon 已提交
949
    /// assert_eq!(v.swap_remove(1), "bar");
950
    /// assert_eq!(v, ["foo", "qux", "baz"]);
S
Steven Fackler 已提交
951
    ///
A
Aaron Turon 已提交
952
    /// assert_eq!(v.swap_remove(0), "foo");
953
    /// assert_eq!(v, ["baz", "qux"]);
S
Steven Fackler 已提交
954
    /// ```
955
    #[inline]
B
Brian Anderson 已提交
956
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
957
    pub fn swap_remove(&mut self, index: usize) -> T {
958
        unsafe {
959
            // We replace self[index] with the last element. Note that if the
960 961
            // bounds check on hole succeeds there must be a last element (which
            // can be self[index] itself).
962
            let hole: *mut T = &mut self[index];
963 964 965
            let last = ptr::read(self.get_unchecked(self.len - 1));
            self.len -= 1;
            ptr::replace(hole, last)
966
        }
967 968
    }

969
    /// Inserts an element at position `index` within the vector, shifting all
970
    /// elements after it to the right.
S
Steven Fackler 已提交
971
    ///
972
    /// # Panics
S
Steven Fackler 已提交
973
    ///
974
    /// Panics if `index > len`.
S
Steven Fackler 已提交
975
    ///
976
    /// # Examples
S
Steven Fackler 已提交
977
    ///
J
Jonas Hietala 已提交
978
    /// ```
T
Tobias Bucher 已提交
979
    /// let mut vec = vec![1, 2, 3];
S
Steven Fackler 已提交
980
    /// vec.insert(1, 4);
981
    /// assert_eq!(vec, [1, 4, 2, 3]);
982
    /// vec.insert(4, 5);
983
    /// assert_eq!(vec, [1, 4, 2, 3, 5]);
S
Steven Fackler 已提交
984
    /// ```
B
Brian Anderson 已提交
985
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
986
    pub fn insert(&mut self, index: usize, element: T) {
987 988
        let len = self.len();
        assert!(index <= len);
989

990
        // space for the new element
991
        if len == self.buf.capacity() {
992
            self.reserve(1);
N
Nick Cameron 已提交
993
        }
994

N
Nick Cameron 已提交
995 996
        unsafe {
            // infallible
997 998
            // The spot to put the new value
            {
999
                let p = self.as_mut_ptr().add(index);
1000 1001
                // Shift everything over to make space. (Duplicating the
                // `index`th element into two consecutive places.)
1002
                ptr::copy(p, p.offset(1), len - index);
1003 1004
                // Write it in, overwriting the first copy of the `index`th
                // element.
1005
                ptr::write(p, element);
1006 1007
            }
            self.set_len(len + 1);
1008 1009 1010
        }
    }

A
Aaron Turon 已提交
1011
    /// Removes and returns the element at position `index` within the vector,
1012
    /// shifting all elements after it to the left.
1013 1014 1015
    ///
    /// # Panics
    ///
1016
    /// Panics if `index` is out of bounds.
S
Steven Fackler 已提交
1017
    ///
1018
    /// # Examples
S
Steven Fackler 已提交
1019
    ///
J
Jonas Hietala 已提交
1020
    /// ```
T
Tobias Bucher 已提交
1021
    /// let mut v = vec![1, 2, 3];
A
Aaron Turon 已提交
1022
    /// assert_eq!(v.remove(1), 2);
1023
    /// assert_eq!(v, [1, 3]);
S
Steven Fackler 已提交
1024
    /// ```
B
Brian Anderson 已提交
1025
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alexis 已提交
1026
    pub fn remove(&mut self, index: usize) -> T {
K
Kiet Tran 已提交
1027
        let len = self.len();
A
Aaron Turon 已提交
1028
        assert!(index < len);
N
Nick Cameron 已提交
1029 1030
        unsafe {
            // infallible
A
Aaron Turon 已提交
1031 1032 1033
            let ret;
            {
                // the place we are taking from.
1034
                let ptr = self.as_mut_ptr().add(index);
A
Aaron Turon 已提交
1035 1036
                // copy it out, unsafely having a copy of the value on
                // the stack and in the vector at the same time.
1037
                ret = ptr::read(ptr);
A
Aaron Turon 已提交
1038 1039

                // Shift everything down to fill in that spot.
1040
                ptr::copy(ptr.offset(1), ptr, len - index - 1);
1041
            }
A
Aaron Turon 已提交
1042 1043
            self.set_len(len - 1);
            ret
1044 1045 1046
        }
    }

1047
    /// Retains only the elements specified by the predicate.
S
Steve Klabnik 已提交
1048
    ///
1049
    /// In other words, remove all elements `e` such that `f(&e)` returns `false`.
1050 1051
    /// This method operates in place, visiting each element exactly once in the
    /// original order, and preserves the order of the retained elements.
S
Steven Fackler 已提交
1052
    ///
1053
    /// # Examples
S
Steven Fackler 已提交
1054
    ///
J
Jonas Hietala 已提交
1055
    /// ```
T
Tobias Bucher 已提交
1056
    /// let mut vec = vec![1, 2, 3, 4];
1057
    /// vec.retain(|&x| x % 2 == 0);
1058
    /// assert_eq!(vec, [2, 4]);
S
Steven Fackler 已提交
1059
    /// ```
J
Josh Stone 已提交
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
    ///
    /// The exact order may be useful for tracking external state, like an index.
    ///
    /// ```
    /// let mut vec = vec![1, 2, 3, 4, 5];
    /// let keep = [false, true, true, false, true];
    /// let mut i = 0;
    /// vec.retain(|_| (keep[i], i += 1).0);
    /// assert_eq!(vec, [2, 3, 5]);
    /// ```
B
Brian Anderson 已提交
1070
    #[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
1071
    pub fn retain<F>(&mut self, mut f: F)
M
Mark Rousskov 已提交
1072 1073
    where
        F: FnMut(&T) -> bool,
N
Nick Cameron 已提交
1074
    {
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
        let len = self.len();
        let mut del = 0;
        {
            let v = &mut **self;

            for i in 0..len {
                if !f(&v[i]) {
                    del += 1;
                } else if del > 0 {
                    v.swap(i - del, i);
                }
            }
        }
        if del > 0 {
            self.truncate(len - del);
        }
1091 1092
    }

1093 1094
    /// Removes all but the first of consecutive elements in the vector that resolve to the same
    /// key.
S
Simon Sapin 已提交
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
    ///
    /// If the vector is sorted, this removes all duplicates.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut vec = vec![10, 20, 21, 30, 20];
    ///
    /// vec.dedup_by_key(|i| *i / 10);
    ///
    /// assert_eq!(vec, [10, 20, 30, 20]);
    /// ```
1107
    #[stable(feature = "dedup_by", since = "1.16.0")]
S
Simon Sapin 已提交
1108
    #[inline]
M
Mark Rousskov 已提交
1109 1110 1111 1112 1113
    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
    where
        F: FnMut(&mut T) -> K,
        K: PartialEq,
    {
S
Simon Sapin 已提交
1114 1115 1116
        self.dedup_by(|a, b| key(a) == key(b))
    }

1117 1118
    /// Removes all but the first of consecutive elements in the vector satisfying a given equality
    /// relation.
1119
    ///
1120 1121 1122
    /// The `same_bucket` function is passed references to two elements from the vector and
    /// must determine if the elements compare equal. The elements are passed in opposite order
    /// from their order in the slice, so if `same_bucket(a, b)` returns `true`, `a` is removed.
S
Simon Sapin 已提交
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
    ///
    /// If the vector is sorted, this removes all duplicates.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
    ///
    /// vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
    ///
    /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
    /// ```
1135
    #[stable(feature = "dedup_by", since = "1.16.0")]
M
Mark Rousskov 已提交
1136 1137 1138 1139
    pub fn dedup_by<F>(&mut self, same_bucket: F)
    where
        F: FnMut(&mut T, &mut T) -> bool,
    {
1140 1141 1142 1143 1144
        let len = {
            let (dedup, _) = self.as_mut_slice().partition_dedup_by(same_bucket);
            dedup.len()
        };
        self.truncate(len);
S
Simon Sapin 已提交
1145 1146
    }

1147
    /// Appends an element to the back of a collection.
S
Steven Fackler 已提交
1148
    ///
1149
    /// # Panics
1150
    ///
A
Alexis 已提交
1151
    /// Panics if the number of elements in the vector overflows a `usize`.
S
Steven Fackler 已提交
1152
    ///
1153
    /// # Examples
S
Steven Fackler 已提交
1154
    ///
1155
    /// ```
1156
    /// let mut vec = vec![1, 2];
1157
    /// vec.push(3);
1158
    /// assert_eq!(vec, [1, 2, 3]);
J
Jonas Hietala 已提交
1159
    /// ```
1160
    #[inline]
B
Brian Anderson 已提交
1161
    #[stable(feature = "rust1", since = "1.0.0")]
1162
    pub fn push(&mut self, value: T) {
1163 1164
        // This will panic or abort if we would allocate > isize::MAX bytes
        // or if the length increment would overflow for zero-sized types.
1165
        if self.len == self.buf.capacity() {
1166
            self.reserve(1);
N
Nick Cameron 已提交
1167
        }
1168
        unsafe {
1169
            let end = self.as_mut_ptr().add(self.len);
1170
            ptr::write(end, value);
1171
            self.len += 1;
1172 1173 1174
        }
    }

G
Guillaume Gomez 已提交
1175
    /// Removes the last element from a vector and returns it, or [`None`] if it
1176
    /// is empty.
S
Steven Fackler 已提交
1177
    ///
G
Guillaume Gomez 已提交
1178 1179
    /// [`None`]: ../../std/option/enum.Option.html#variant.None
    ///
1180
    /// # Examples
S
Steven Fackler 已提交
1181
    ///
1182
    /// ```
T
Tobias Bucher 已提交
1183
    /// let mut vec = vec![1, 2, 3];
1184
    /// assert_eq!(vec.pop(), Some(3));
1185
    /// assert_eq!(vec, [1, 2]);
S
Steven Fackler 已提交
1186
    /// ```
1187
    #[inline]
B
Brian Anderson 已提交
1188
    #[stable(feature = "rust1", since = "1.0.0")]
1189 1190 1191 1192 1193 1194
    pub fn pop(&mut self) -> Option<T> {
        if self.len == 0 {
            None
        } else {
            unsafe {
                self.len -= 1;
A
Aaron Turon 已提交
1195
                Some(ptr::read(self.get_unchecked(self.len())))
1196
            }
1197
        }
1198 1199
    }

J
Jeff Belgum 已提交
1200 1201 1202 1203
    /// Moves all the elements of `other` into `Self`, leaving `other` empty.
    ///
    /// # Panics
    ///
A
Alexis 已提交
1204
    /// Panics if the number of elements in the vector overflows a `usize`.
J
Jeff Belgum 已提交
1205 1206
    ///
    /// # Examples
1207 1208
    ///
    /// ```
J
Jeff Belgum 已提交
1209 1210 1211
    /// let mut vec = vec![1, 2, 3];
    /// let mut vec2 = vec![4, 5, 6];
    /// vec.append(&mut vec2);
1212 1213
    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
    /// assert_eq!(vec2, []);
J
Jeff Belgum 已提交
1214 1215
    /// ```
    #[inline]
1216
    #[stable(feature = "append", since = "1.4.0")]
J
Jeff Belgum 已提交
1217
    pub fn append(&mut self, other: &mut Self) {
N
Nick Cameron 已提交
1218
        unsafe {
1219
            self.append_elements(other.as_slice() as _);
N
Nick Cameron 已提交
1220 1221
            other.set_len(0);
        }
J
Jeff Belgum 已提交
1222 1223
    }

1224 1225 1226 1227 1228 1229
    /// Appends elements to `Self` from other buffer.
    #[inline]
    unsafe fn append_elements(&mut self, other: *const [T]) {
        let count = (*other).len();
        self.reserve(count);
        let len = self.len();
1230
        ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count);
1231 1232 1233
        self.len += count;
    }

S
Simon Sapin 已提交
1234
    /// Creates a draining iterator that removes the specified range in the vector
1235
    /// and yields the removed items.
1236
    ///
1237 1238
    /// Note 1: The element range is removed even if the iterator is only
    /// partially consumed or not consumed at all.
1239
    ///
M
Matt Ickstadt 已提交
1240
    /// Note 2: It is unspecified how many elements are removed from the vector
1241 1242 1243 1244 1245 1246
    /// if the `Drain` value is leaked.
    ///
    /// # Panics
    ///
    /// Panics if the starting point is greater than the end point or if
    /// the end point is greater than the length of the vector.
S
Steven Fackler 已提交
1247
    ///
1248
    /// # Examples
S
Steven Fackler 已提交
1249
    ///
J
Jonas Hietala 已提交
1250
    /// ```
1251
    /// let mut v = vec![1, 2, 3];
1252 1253 1254 1255 1256 1257
    /// let u: Vec<_> = v.drain(1..).collect();
    /// assert_eq!(v, &[1]);
    /// assert_eq!(u, &[2, 3]);
    ///
    /// // A full range clears the vector
    /// v.drain(..);
1258
    /// assert_eq!(v, &[]);
S
Steven Fackler 已提交
1259
    /// ```
1260
    #[stable(feature = "drain", since = "1.6.0")]
1261
    pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
M
Mark Rousskov 已提交
1262 1263
    where
        R: RangeBounds<usize>,
N
Nick Cameron 已提交
1264
    {
1265 1266 1267
        // Memory safety
        //
        // When the Drain is first created, it shortens the length of
M
Martin Lindhe 已提交
1268
        // the source vector to make sure no uninitialized or moved-from elements
1269 1270 1271 1272 1273 1274 1275
        // are accessible at all if the Drain's destructor never gets to run.
        //
        // Drain will ptr::read out the values to remove.
        // When finished, remaining tail of the vec is copied back to cover
        // the hole, and the vector length is restored to the new length.
        //
        let len = self.len();
1276
        let start = match range.start_bound() {
1277 1278
            Included(&n) => n,
            Excluded(&n) => n + 1,
M
Mark Rousskov 已提交
1279
            Unbounded => 0,
1280
        };
1281
        let end = match range.end_bound() {
1282 1283
            Included(&n) => n + 1,
            Excluded(&n) => n,
M
Mark Rousskov 已提交
1284
            Unbounded => len,
1285
        };
1286 1287 1288
        assert!(start <= end);
        assert!(end <= len);

1289
        unsafe {
1290 1291 1292 1293
            // set self.vec length's to start, to be safe in case Drain is leaked
            self.set_len(start);
            // Use the borrow in the IterMut to indicate borrowing behavior of the
            // whole Drain iterator (like &mut T).
M
Mark Rousskov 已提交
1294
            let range_slice = slice::from_raw_parts_mut(self.as_mut_ptr().add(start), end - start);
1295
            Drain {
1296 1297
                tail_start: end,
                tail_len: len - end,
1298
                iter: range_slice.iter(),
S
Simon Sapin 已提交
1299
                vec: NonNull::from(self),
1300
            }
1301 1302 1303
        }
    }

1304
    /// Clears the vector, removing all values.
1305
    ///
1306 1307 1308
    /// Note that this method has no effect on the allocated capacity
    /// of the vector.
    ///
1309
    /// # Examples
1310 1311
    ///
    /// ```
T
Tobias Bucher 已提交
1312
    /// let mut v = vec![1, 2, 3];
S
Steve Klabnik 已提交
1313
    ///
1314
    /// v.clear();
S
Steve Klabnik 已提交
1315
    ///
1316
    /// assert!(v.is_empty());
1317
    /// ```
1318
    #[inline]
B
Brian Anderson 已提交
1319
    #[stable(feature = "rust1", since = "1.0.0")]
1320
    pub fn clear(&mut self) {
1321
        self.truncate(0)
1322
    }
1323

1324 1325
    /// Returns the number of elements in the vector, also referred to
    /// as its 'length'.
S
Steven Fackler 已提交
1326
    ///
1327 1328
    /// # Examples
    ///
J
Jonas Hietala 已提交
1329
    /// ```
T
Tobias Bucher 已提交
1330
    /// let a = vec![1, 2, 3];
1331
    /// assert_eq!(a.len(), 3);
S
Steven Fackler 已提交
1332
    /// ```
1333
    #[inline]
B
Brian Anderson 已提交
1334
    #[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
1335 1336 1337
    pub fn len(&self) -> usize {
        self.len
    }
1338

S
Steve Klabnik 已提交
1339
    /// Returns `true` if the vector contains no elements.
S
Steven Fackler 已提交
1340
    ///
1341
    /// # Examples
S
Steven Fackler 已提交
1342
    ///
J
Jonas Hietala 已提交
1343
    /// ```
1344 1345
    /// let mut v = Vec::new();
    /// assert!(v.is_empty());
S
Steve Klabnik 已提交
1346
    ///
T
Tobias Bucher 已提交
1347
    /// v.push(1);
1348
    /// assert!(!v.is_empty());
S
Steven Fackler 已提交
1349
    /// ```
B
Brian Anderson 已提交
1350
    #[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
1351 1352 1353
    pub fn is_empty(&self) -> bool {
        self.len() == 0
    }
1354

1355 1356
    /// Splits the collection into two at the given index.
    ///
1357 1358 1359
    /// Returns a newly allocated vector containing the elements in the range
    /// `[at, len)`. After the call, the original vector will be left containing
    /// the elements `[0, at)` with its previous capacity unchanged.
1360
    ///
1361 1362 1363 1364
    /// # Panics
    ///
    /// Panics if `at > len`.
    ///
1365
    /// # Examples
1366 1367
    ///
    /// ```
1368 1369
    /// let mut vec = vec![1,2,3];
    /// let vec2 = vec.split_off(1);
1370 1371
    /// assert_eq!(vec, [1]);
    /// assert_eq!(vec2, [2, 3]);
1372 1373
    /// ```
    #[inline]
1374
    #[stable(feature = "split_off", since = "1.4.0")]
1375
    pub fn split_off(&mut self, at: usize) -> Self {
1376
        assert!(at <= self.len(), "`at` out of bounds");
1377 1378 1379 1380 1381 1382 1383 1384 1385

        let other_len = self.len - at;
        let mut other = Vec::with_capacity(other_len);

        // Unsafely `set_len` and copy items to `other`.
        unsafe {
            self.set_len(at);
            other.set_len(other_len);

M
Mark Rousskov 已提交
1386
            ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len());
1387 1388 1389
        }
        other
    }
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402

    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
    ///
    /// If `new_len` is greater than `len`, the `Vec` is extended by the
    /// difference, with each additional slot filled with the result of
    /// calling the closure `f`. The return values from `f` will end up
    /// in the `Vec` in the order they have been generated.
    ///
    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
    ///
    /// This method uses a closure to create new values on every push. If
    /// you'd rather [`Clone`] a given value, use [`resize`]. If you want
    /// to use the [`Default`] trait to generate values, you can pass
1403
    /// [`Default::default()`] as the second argument.
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
    ///
    /// # Examples
    ///
    /// ```
    /// let mut vec = vec![1, 2, 3];
    /// vec.resize_with(5, Default::default);
    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
    ///
    /// let mut vec = vec![];
    /// let mut p = 1;
    /// vec.resize_with(4, || { p *= 2; p });
    /// assert_eq!(vec, [2, 4, 8, 16]);
    /// ```
    ///
    /// [`resize`]: #method.resize
    /// [`Clone`]: ../../std/clone/trait.Clone.html
S
Scott McMurray 已提交
1420
    #[stable(feature = "vec_resize_with", since = "1.33.0")]
1421
    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
M
Mark Rousskov 已提交
1422 1423
    where
        F: FnMut() -> T,
1424 1425 1426 1427 1428 1429 1430 1431
    {
        let len = self.len();
        if new_len > len {
            self.extend_with(new_len - len, ExtendFunc(f));
        } else {
            self.truncate(new_len);
        }
    }
T
Taylor Cramer 已提交
1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450

    /// Consumes and leaks the `Vec`, returning a mutable reference to the contents,
    /// `&'a mut [T]`. Note that the type `T` must outlive the chosen lifetime
    /// `'a`. If the type has only static references, or none at all, then this
    /// may be chosen to be `'static`.
    ///
    /// This function is similar to the `leak` function on `Box`.
    ///
    /// This function is mainly useful for data that lives for the remainder of
    /// the program's life. Dropping the returned reference will cause a memory
    /// leak.
    ///
    /// # Examples
    ///
    /// Simple usage:
    ///
    /// ```
    /// #![feature(vec_leak)]
    ///
1451 1452 1453 1454
    /// let x = vec![1, 2, 3];
    /// let static_ref: &'static mut [usize] = Vec::leak(x);
    /// static_ref[0] += 1;
    /// assert_eq!(static_ref, &[2, 2, 3]);
T
Taylor Cramer 已提交
1455 1456 1457 1458 1459
    /// ```
    #[unstable(feature = "vec_leak", issue = "62195")]
    #[inline]
    pub fn leak<'a>(vec: Vec<T>) -> &'a mut [T]
    where
M
Mark Rousskov 已提交
1460
        T: 'a, // Technically not needed, but kept to be explicit.
T
Taylor Cramer 已提交
1461 1462 1463
    {
        Box::leak(vec.into_boxed_slice())
    }
A
Aaron Turon 已提交
1464
}
1465

A
Aaron Turon 已提交
1466
impl<T: Clone> Vec<T> {
C
Clar Charr 已提交
1467
    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
1468
    ///
C
Clar Charr 已提交
1469
    /// If `new_len` is greater than `len`, the `Vec` is extended by the
1470
    /// difference, with each additional slot filled with `value`.
C
Clar Charr 已提交
1471 1472
    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
    ///
G
Guillaume Gomez 已提交
1473
    /// This method requires [`Clone`] to be able clone the passed value. If
1474 1475
    /// you need more flexibility (or want to rely on [`Default`] instead of
    /// [`Clone`]), use [`resize_with`].
1476
    ///
1477
    /// # Examples
1478 1479
    ///
    /// ```
A
Aaron Turon 已提交
1480 1481
    /// let mut vec = vec!["hello"];
    /// vec.resize(3, "world");
1482
    /// assert_eq!(vec, ["hello", "world", "world"]);
1483
    ///
T
Tobias Bucher 已提交
1484
    /// let mut vec = vec![1, 2, 3, 4];
A
Aaron Turon 已提交
1485
    /// vec.resize(2, 0);
1486
    /// assert_eq!(vec, [1, 2]);
1487
    /// ```
C
Clar Charr 已提交
1488
    ///
G
Guillaume Gomez 已提交
1489 1490
    /// [`Clone`]: ../../std/clone/trait.Clone.html
    /// [`Default`]: ../../std/default/trait.Default.html
1491
    /// [`resize_with`]: #method.resize_with
1492
    #[stable(feature = "vec_resize", since = "1.5.0")]
A
Alexis 已提交
1493
    pub fn resize(&mut self, new_len: usize, value: T) {
A
Aaron Turon 已提交
1494
        let len = self.len();
1495

A
Aaron Turon 已提交
1496
        if new_len > len {
C
Clar Charr 已提交
1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
            self.extend_with(new_len - len, ExtendElement(value))
        } else {
            self.truncate(new_len);
        }
    }

    /// Clones and appends all elements in a slice to the `Vec`.
    ///
    /// Iterates over the slice `other`, clones each element, and then appends
    /// it to this `Vec`. The `other` vector is traversed in-order.
    ///
G
Guillaume Gomez 已提交
1508
    /// Note that this function is same as [`extend`] except that it is
C
Clar Charr 已提交
1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
    /// specialized to work with slices instead. If and when Rust gets
    /// specialization this function will likely be deprecated (but still
    /// available).
    ///
    /// # Examples
    ///
    /// ```
    /// let mut vec = vec![1];
    /// vec.extend_from_slice(&[2, 3, 4]);
    /// assert_eq!(vec, [1, 2, 3, 4]);
    /// ```
G
Guillaume Gomez 已提交
1520 1521
    ///
    /// [`extend`]: #method.extend
C
Clar Charr 已提交
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531
    #[stable(feature = "vec_extend_from_slice", since = "1.6.0")]
    pub fn extend_from_slice(&mut self, other: &[T]) {
        self.spec_extend(other.iter())
    }
}

impl<T: Default> Vec<T> {
    /// Resizes the `Vec` in-place so that `len` is equal to `new_len`.
    ///
    /// If `new_len` is greater than `len`, the `Vec` is extended by the
G
Guillaume Gomez 已提交
1532
    /// difference, with each additional slot filled with [`Default::default()`].
C
Clar Charr 已提交
1533 1534
    /// If `new_len` is less than `len`, the `Vec` is simply truncated.
    ///
G
Guillaume Gomez 已提交
1535 1536
    /// This method uses [`Default`] to create new values on every push. If
    /// you'd rather [`Clone`] a given value, use [`resize`].
C
Clar Charr 已提交
1537 1538 1539 1540
    ///
    /// # Examples
    ///
    /// ```
1541
    /// # #![allow(deprecated)]
C
Clar Charr 已提交
1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
    /// #![feature(vec_resize_default)]
    ///
    /// let mut vec = vec![1, 2, 3];
    /// vec.resize_default(5);
    /// assert_eq!(vec, [1, 2, 3, 0, 0]);
    ///
    /// let mut vec = vec![1, 2, 3, 4];
    /// vec.resize_default(2);
    /// assert_eq!(vec, [1, 2]);
    /// ```
    ///
    /// [`resize`]: #method.resize
G
Guillaume Gomez 已提交
1554 1555 1556
    /// [`Default::default()`]: ../../std/default/trait.Default.html#tymethod.default
    /// [`Default`]: ../../std/default/trait.Default.html
    /// [`Clone`]: ../../std/clone/trait.Clone.html
C
Clar Charr 已提交
1557
    #[unstable(feature = "vec_resize_default", issue = "41758")]
M
Mark Rousskov 已提交
1558 1559
    #[rustc_deprecated(
        reason = "This is moving towards being removed in favor \
1560
        of `.resize_with(Default::default)`.  If you disagree, please comment \
M
Mark Rousskov 已提交
1561 1562 1563
        in the tracking issue.",
        since = "1.33.0"
    )]
C
Clar Charr 已提交
1564 1565 1566 1567 1568
    pub fn resize_default(&mut self, new_len: usize) {
        let len = self.len();

        if new_len > len {
            self.extend_with(new_len - len, ExtendDefault);
A
Aaron Turon 已提交
1569 1570
        } else {
            self.truncate(new_len);
1571 1572
        }
    }
C
Clar Charr 已提交
1573
}
1574

C
Clar Charr 已提交
1575 1576
// This code generalises `extend_with_{element,default}`.
trait ExtendWith<T> {
1577
    fn next(&mut self) -> T;
C
Clar Charr 已提交
1578 1579 1580 1581 1582
    fn last(self) -> T;
}

struct ExtendElement<T>(T);
impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
M
Mark Rousskov 已提交
1583 1584 1585 1586 1587 1588
    fn next(&mut self) -> T {
        self.0.clone()
    }
    fn last(self) -> T {
        self.0
    }
C
Clar Charr 已提交
1589 1590 1591 1592
}

struct ExtendDefault;
impl<T: Default> ExtendWith<T> for ExtendDefault {
M
Mark Rousskov 已提交
1593 1594 1595 1596 1597 1598
    fn next(&mut self) -> T {
        Default::default()
    }
    fn last(self) -> T {
        Default::default()
    }
C
Clar Charr 已提交
1599
}
1600 1601 1602

struct ExtendFunc<F>(F);
impl<T, F: FnMut() -> T> ExtendWith<T> for ExtendFunc<F> {
M
Mark Rousskov 已提交
1603 1604 1605 1606 1607 1608
    fn next(&mut self) -> T {
        (self.0)()
    }
    fn last(mut self) -> T {
        (self.0)()
    }
1609 1610
}

C
Clar Charr 已提交
1611 1612
impl<T> Vec<T> {
    /// Extend the vector by `n` values, using the given generator.
1613
    fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, mut value: E) {
1614 1615 1616
        self.reserve(n);

        unsafe {
1617
            let mut ptr = self.as_mut_ptr().add(self.len());
1618
            // Use SetLenOnDrop to work around bug where compiler
K
king6cong 已提交
1619
            // may not realize the store through `ptr` through self.set_len()
1620 1621 1622
            // don't alias.
            let mut local_len = SetLenOnDrop::new(&mut self.len);

1623
            // Write all elements except the last one
1624
            for _ in 1..n {
C
Clar Charr 已提交
1625
                ptr::write(ptr, value.next());
1626
                ptr = ptr.offset(1);
C
Clar Charr 已提交
1627
                // Increment the length in every step in case next() panics
1628
                local_len.increment_len(1);
1629 1630 1631 1632
            }

            if n > 0 {
                // We can write the last element directly without cloning needlessly
C
Clar Charr 已提交
1633
                ptr::write(ptr, value.last());
1634
                local_len.increment_len(1);
1635
            }
1636 1637

            // len set by scope guard
1638 1639
        }
    }
1640 1641
}

1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
// Set the length of the vec when the `SetLenOnDrop` value goes out of scope.
//
// The idea is: The length field in SetLenOnDrop is a local variable
// that the optimizer will see does not alias with any stores through the Vec's data
// pointer. This is a workaround for alias analysis issue #32155
struct SetLenOnDrop<'a> {
    len: &'a mut usize,
    local_len: usize,
}

impl<'a> SetLenOnDrop<'a> {
    #[inline]
    fn new(len: &'a mut usize) -> Self {
        SetLenOnDrop { local_len: *len, len: len }
    }

    #[inline]
    fn increment_len(&mut self, increment: usize) {
        self.local_len += increment;
    }
}

1664
impl Drop for SetLenOnDrop<'_> {
1665 1666 1667 1668 1669 1670
    #[inline]
    fn drop(&mut self) {
        *self.len = self.local_len;
    }
}

P
P1start 已提交
1671
impl<T: PartialEq> Vec<T> {
1672 1673
    /// Removes consecutive repeated elements in the vector according to the
    /// [`PartialEq`] trait implementation.
S
Steven Fackler 已提交
1674 1675 1676
    ///
    /// If the vector is sorted, this removes all duplicates.
    ///
1677
    /// # Examples
S
Steven Fackler 已提交
1678
    ///
J
Jonas Hietala 已提交
1679
    /// ```
T
Tobias Bucher 已提交
1680
    /// let mut vec = vec![1, 2, 2, 3, 2];
S
Steve Klabnik 已提交
1681
    ///
S
Steven Fackler 已提交
1682
    /// vec.dedup();
S
Steve Klabnik 已提交
1683
    ///
1684
    /// assert_eq!(vec, [1, 2, 3, 2]);
S
Steven Fackler 已提交
1685
    /// ```
B
Brian Anderson 已提交
1686
    #[stable(feature = "rust1", since = "1.0.0")]
1687
    #[inline]
1688
    pub fn dedup(&mut self) {
1689
        self.dedup_by(|a, b| a == b)
A
Aaron Turon 已提交
1690
    }
D
dylan_DPC 已提交
1691 1692
}

D
dylan_DPC 已提交
1693
impl<T> Vec<T> {
M
madseagames 已提交
1694 1695 1696 1697 1698
    /// Removes the first instance of `item` from the vector if the item exists.
    ///
    /// # Examples
    ///
    /// ```
1699
    /// # #![feature(vec_remove_item)]
M
madseagames 已提交
1700 1701 1702 1703 1704 1705
    /// let mut vec = vec![1, 2, 3, 1];
    ///
    /// vec.remove_item(&1);
    ///
    /// assert_eq!(vec, vec![2, 3, 1]);
    /// ```
1706
    #[unstable(feature = "vec_remove_item", reason = "recently added", issue = "40062")]
D
dylan_DPC 已提交
1707
    pub fn remove_item<V>(&mut self, item: &V) -> Option<T>
D
dylan_DPC 已提交
1708 1709
    where
        T: PartialEq<V>,
D
dylan_DPC 已提交
1710
    {
1711
        let pos = self.iter().position(|x| *x == *item)?;
M
madseagames 已提交
1712 1713
        Some(self.remove(pos))
    }
A
Aaron Turon 已提交
1714 1715 1716 1717 1718 1719
}

////////////////////////////////////////////////////////////////////////////////
// Internal methods and functions
////////////////////////////////////////////////////////////////////////////////

1720 1721 1722
#[doc(hidden)]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
    <T as SpecFromElem>::from_elem(elem, n)
}

// Specialization trait used for Vec::from_elem
trait SpecFromElem: Sized {
    fn from_elem(elem: Self, n: usize) -> Vec<Self>;
}

impl<T: Clone> SpecFromElem for T {
    default fn from_elem(elem: Self, n: usize) -> Vec<Self> {
        let mut v = Vec::with_capacity(n);
C
Clar Charr 已提交
1734
        v.extend_with(n, ExtendElement(elem));
1735 1736 1737 1738 1739 1740 1741 1742
        v
    }
}

impl SpecFromElem for u8 {
    #[inline]
    fn from_elem(elem: u8, n: usize) -> Vec<u8> {
        if elem == 0 {
M
Mark Rousskov 已提交
1743
            return Vec { buf: RawVec::with_capacity_zeroed(n), len: n };
1744 1745 1746 1747 1748 1749 1750 1751
        }
        unsafe {
            let mut v = Vec::with_capacity(n);
            ptr::write_bytes(v.as_mut_ptr(), elem, n);
            v.set_len(n);
            v
        }
    }
1752 1753
}

1754 1755 1756 1757
impl<T: Clone + IsZero> SpecFromElem for T {
    #[inline]
    fn from_elem(elem: T, n: usize) -> Vec<T> {
        if elem.is_zero() {
M
Mark Rousskov 已提交
1758
            return Vec { buf: RawVec::with_capacity_zeroed(n), len: n };
1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
        }
        let mut v = Vec::with_capacity(n);
        v.extend_with(n, ExtendElement(elem));
        v
    }
}

unsafe trait IsZero {
    /// Whether this value is zero
    fn is_zero(&self) -> bool;
}

macro_rules! impl_is_zero {
1772
    ($t: ty, $is_zero: expr) => {
1773
        unsafe impl IsZero for $t {
1774
            #[inline]
1775 1776
            fn is_zero(&self) -> bool {
                $is_zero(*self)
1777 1778
            }
        }
M
Mark Rousskov 已提交
1779
    };
1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
}

impl_is_zero!(i8, |x| x == 0);
impl_is_zero!(i16, |x| x == 0);
impl_is_zero!(i32, |x| x == 0);
impl_is_zero!(i64, |x| x == 0);
impl_is_zero!(i128, |x| x == 0);
impl_is_zero!(isize, |x| x == 0);

impl_is_zero!(u16, |x| x == 0);
impl_is_zero!(u32, |x| x == 0);
impl_is_zero!(u64, |x| x == 0);
impl_is_zero!(u128, |x| x == 0);
impl_is_zero!(usize, |x| x == 0);

1795
impl_is_zero!(bool, |x| x == false);
1796 1797
impl_is_zero!(char, |x| x == '\0');

1798 1799 1800
impl_is_zero!(f32, |x: f32| x.to_bits() == 0);
impl_is_zero!(f64, |x: f64| x.to_bits() == 0);

1801
unsafe impl<T> IsZero for *const T {
1802 1803 1804 1805 1806 1807
    #[inline]
    fn is_zero(&self) -> bool {
        (*self).is_null()
    }
}

1808
unsafe impl<T> IsZero for *mut T {
1809 1810 1811 1812
    #[inline]
    fn is_zero(&self) -> bool {
        (*self).is_null()
    }
1813 1814
}

1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
// `Option<&T>`, `Option<&mut T>` and `Option<Box<T>>` are guaranteed to represent `None` as null.
// For fat pointers, the bytes that would be the pointer metadata in the `Some` variant
// are padding in the `None` variant, so ignoring them and zero-initializing instead is ok.

unsafe impl<T: ?Sized> IsZero for Option<&T> {
    #[inline]
    fn is_zero(&self) -> bool {
        self.is_none()
    }
}

unsafe impl<T: ?Sized> IsZero for Option<&mut T> {
    #[inline]
    fn is_zero(&self) -> bool {
        self.is_none()
    }
}

unsafe impl<T: ?Sized> IsZero for Option<Box<T>> {
    #[inline]
    fn is_zero(&self) -> bool {
        self.is_none()
    }
}

A
Aaron Turon 已提交
1840 1841 1842 1843
////////////////////////////////////////////////////////////////////////////////
// Common trait implementations for Vec
////////////////////////////////////////////////////////////////////////////////

1844
#[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
1845
impl<T: Clone> Clone for Vec<T> {
1846
    #[cfg(not(test))]
N
Nick Cameron 已提交
1847 1848 1849
    fn clone(&self) -> Vec<T> {
        <[T]>::to_vec(&**self)
    }
J
Jorge Aparicio 已提交
1850

A
Alex Crichton 已提交
1851 1852 1853
    // HACK(japaric): with cfg(test) the inherent `[T]::to_vec` method, which is
    // required for this method definition, is not available. Instead use the
    // `slice::to_vec`  function which is only available with cfg(test)
1854
    // NB see the slice::hack module in slice.rs for more information
1855
    #[cfg(test)]
1856
    fn clone(&self) -> Vec<T> {
1857
        crate::slice::to_vec(&**self)
1858
    }
1859

A
Aaron Turon 已提交
1860
    fn clone_from(&mut self, other: &Vec<T>) {
1861
        other.as_slice().clone_into(self);
A
Aaron Turon 已提交
1862 1863 1864
    }
}

A
Alex Crichton 已提交
1865 1866 1867 1868 1869 1870 1871
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Hash> Hash for Vec<T> {
    #[inline]
    fn hash<H: hash::Hasher>(&self, state: &mut H) {
        Hash::hash(&**self, state)
    }
}
A
Aaron Turon 已提交
1872

1873
#[stable(feature = "rust1", since = "1.0.0")]
1874
#[rustc_on_unimplemented(
M
Mark Rousskov 已提交
1875 1876
    message = "vector indices are of type `usize` or ranges of `usize`",
    label = "vector indices are of type `usize` or ranges of `usize`"
1877
)]
1878
impl<T, I: SliceIndex<[T]>> Index<I> for Vec<T> {
1879
    type Output = I::Output;
J
Jorge Aparicio 已提交
1880

1881
    #[inline]
1882
    fn index(&self, index: I) -> &Self::Output {
1883
        Index::index(&**self, index)
1884
    }
J
Jorge Aparicio 已提交
1885 1886
}

1887
#[stable(feature = "rust1", since = "1.0.0")]
1888
#[rustc_on_unimplemented(
M
Mark Rousskov 已提交
1889 1890
    message = "vector indices are of type `usize` or ranges of `usize`",
    label = "vector indices are of type `usize` or ranges of `usize`"
1891
)]
1892
impl<T, I: SliceIndex<[T]>> IndexMut<I> for Vec<T> {
1893
    #[inline]
1894
    fn index_mut(&mut self, index: I) -> &mut Self::Output {
1895
        IndexMut::index_mut(&mut **self, index)
1896
    }
J
Jorge Aparicio 已提交
1897 1898
}

B
Brian Anderson 已提交
1899
#[stable(feature = "rust1", since = "1.0.0")]
1900 1901 1902
impl<T> ops::Deref for Vec<T> {
    type Target = [T];

A
Aaron Turon 已提交
1903
    fn deref(&self) -> &[T] {
M
Mark Rousskov 已提交
1904
        unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
A
Aaron Turon 已提交
1905
    }
A
Aaron Turon 已提交
1906 1907
}

B
Brian Anderson 已提交
1908
#[stable(feature = "rust1", since = "1.0.0")]
1909
impl<T> ops::DerefMut for Vec<T> {
E
Erick Tryzelaar 已提交
1910
    fn deref_mut(&mut self) -> &mut [T] {
M
Mark Rousskov 已提交
1911
        unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
E
Erick Tryzelaar 已提交
1912
    }
A
Aaron Turon 已提交
1913 1914
}

B
Brian Anderson 已提交
1915
#[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
1916 1917
impl<T> FromIterator<T> for Vec<T> {
    #[inline]
1918
    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Vec<T> {
1919
        <Self as SpecExtend<T, I::IntoIter>>::from_iter(iter.into_iter())
A
Aaron Turon 已提交
1920 1921 1922
    }
}

1923
#[stable(feature = "rust1", since = "1.0.0")]
1924 1925 1926 1927
impl<T> IntoIterator for Vec<T> {
    type Item = T;
    type IntoIter = IntoIter<T>;

1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941
    /// Creates a consuming iterator, that is, one that moves each value out of
    /// the vector (from start to end). The vector cannot be used after calling
    /// this.
    ///
    /// # Examples
    ///
    /// ```
    /// let v = vec!["a".to_string(), "b".to_string()];
    /// for s in v.into_iter() {
    ///     // s has type String, not &String
    ///     println!("{}", s);
    /// }
    /// ```
    #[inline]
1942
    fn into_iter(mut self) -> IntoIter<T> {
1943
        unsafe {
1944
            let begin = self.as_mut_ptr();
1945
            let end = if mem::size_of::<T>() == 0 {
1946
                arith_offset(begin as *const i8, self.len() as isize) as *const T
1947
            } else {
1948
                begin.add(self.len()) as *const T
1949
            };
1950
            let cap = self.buf.capacity();
1951
            mem::forget(self);
N
Nick Cameron 已提交
1952
            IntoIter {
S
Simon Sapin 已提交
1953
                buf: NonNull::new_unchecked(begin),
1954
                phantom: PhantomData,
1955
                cap,
N
Nick Cameron 已提交
1956
                ptr: begin,
1957
                end,
N
Nick Cameron 已提交
1958
            }
1959 1960
        }
    }
1961 1962
}

1963
#[stable(feature = "rust1", since = "1.0.0")]
1964
impl<'a, T> IntoIterator for &'a Vec<T> {
1965
    type Item = &'a T;
1966
    type IntoIter = slice::Iter<'a, T>;
1967 1968 1969 1970 1971 1972

    fn into_iter(self) -> slice::Iter<'a, T> {
        self.iter()
    }
}

1973
#[stable(feature = "rust1", since = "1.0.0")]
1974
impl<'a, T> IntoIterator for &'a mut Vec<T> {
1975
    type Item = &'a mut T;
1976
    type IntoIter = slice::IterMut<'a, T>;
1977

1978
    fn into_iter(self) -> slice::IterMut<'a, T> {
1979 1980 1981 1982
        self.iter_mut()
    }
}

1983
#[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
1984 1985
impl<T> Extend<T> for Vec<T> {
    #[inline]
1986
    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1987
        <Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter())
1988 1989
    }
}
1990

1991
// Specialization trait used for Vec::from_iter and Vec::extend
1992
trait SpecExtend<T, I> {
1993
    fn from_iter(iter: I) -> Self;
1994
    fn spec_extend(&mut self, iter: I);
1995 1996
}

1997
impl<T, I> SpecExtend<T, I> for Vec<T>
M
Mark Rousskov 已提交
1998 1999
where
    I: Iterator<Item = T>,
2000
{
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
    default fn from_iter(mut iterator: I) -> Self {
        // Unroll the first iteration, as the vector is going to be
        // expanded on this iteration in every case when the iterable is not
        // empty, but the loop in extend_desugared() is not going to see the
        // vector being full in the few subsequent loop iterations.
        // So we get better branch prediction.
        let mut vector = match iterator.next() {
            None => return Vec::new(),
            Some(element) => {
                let (lower, _) = iterator.size_hint();
                let mut vector = Vec::with_capacity(lower.saturating_add(1));
                unsafe {
                    ptr::write(vector.get_unchecked_mut(0), element);
                    vector.set_len(1);
                }
                vector
            }
        };
2019
        <Vec<T> as SpecExtend<T, I>>::spec_extend(&mut vector, iterator);
2020 2021 2022
        vector
    }

2023 2024 2025 2026 2027
    default fn spec_extend(&mut self, iter: I) {
        self.extend_desugared(iter)
    }
}

2028
impl<T, I> SpecExtend<T, I> for Vec<T>
M
Mark Rousskov 已提交
2029 2030
where
    I: TrustedLen<Item = T>,
2031
{
2032
    default fn from_iter(iterator: I) -> Self {
2033 2034 2035 2036 2037
        let mut vector = Vec::new();
        vector.spec_extend(iterator);
        vector
    }

2038
    default fn spec_extend(&mut self, iterator: I) {
2039 2040
        // This is the case for a TrustedLen iterator.
        let (low, high) = iterator.size_hint();
2041
        if let Some(high_value) = high {
M
Mark Rousskov 已提交
2042 2043 2044 2045 2046 2047
            debug_assert_eq!(
                low,
                high_value,
                "TrustedLen iterator's size hint is not exact: {:?}",
                (low, high)
            );
2048
        }
2049
        if let Some(additional) = high {
2050
            self.reserve(additional);
M
Mikhail Zabaluev 已提交
2051
            unsafe {
2052
                let mut ptr = self.as_mut_ptr().add(self.len());
2053
                let mut local_len = SetLenOnDrop::new(&mut self.len);
N
Nathan West 已提交
2054
                iterator.for_each(move |element| {
2055 2056 2057 2058
                    ptr::write(ptr, element);
                    ptr = ptr.offset(1);
                    // NB can't overflow since we would have had to alloc the address space
                    local_len.increment_len(1);
N
Nathan West 已提交
2059
                });
2060 2061
            }
        } else {
2062 2063 2064 2065 2066
            self.extend_desugared(iterator)
        }
    }
}

2067 2068 2069 2070 2071
impl<T> SpecExtend<T, IntoIter<T>> for Vec<T> {
    fn from_iter(iterator: IntoIter<T>) -> Self {
        // A common case is passing a vector into a function which immediately
        // re-collects into a vector. We can short circuit this if the IntoIter
        // has not been advanced at all.
2072
        if iterator.buf.as_ptr() as *const _ == iterator.ptr {
2073
            unsafe {
M
Mark Rousskov 已提交
2074
                let vec = Vec::from_raw_parts(iterator.buf.as_ptr(), iterator.len(), iterator.cap);
2075 2076 2077 2078 2079 2080 2081 2082 2083
                mem::forget(iterator);
                vec
            }
        } else {
            let mut vector = Vec::new();
            vector.spec_extend(iterator);
            vector
        }
    }
2084 2085 2086 2087 2088 2089 2090

    fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
        unsafe {
            self.append_elements(iterator.as_slice() as _);
        }
        iterator.ptr = iterator.end;
    }
2091 2092
}

2093
impl<'a, T: 'a, I> SpecExtend<&'a T, I> for Vec<T>
M
Mark Rousskov 已提交
2094 2095 2096
where
    I: Iterator<Item = &'a T>,
    T: Clone,
2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107
{
    default fn from_iter(iterator: I) -> Self {
        SpecExtend::from_iter(iterator.cloned())
    }

    default fn spec_extend(&mut self, iterator: I) {
        self.spec_extend(iterator.cloned())
    }
}

impl<'a, T: 'a> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T>
M
Mark Rousskov 已提交
2108 2109
where
    T: Copy,
2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121
{
    fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
        let slice = iterator.as_slice();
        self.reserve(slice.len());
        unsafe {
            let len = self.len();
            self.set_len(len + slice.len());
            self.get_unchecked_mut(len..).copy_from_slice(slice);
        }
    }
}

2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140
impl<T> Vec<T> {
    fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
        // This is the case for a general iterator.
        //
        // This function should be the moral equivalent of:
        //
        //      for item in iterator {
        //          self.push(item);
        //      }
        while let Some(element) = iterator.next() {
            let len = self.len();
            if len == self.capacity() {
                let (lower, _) = iterator.size_hint();
                self.reserve(lower.saturating_add(1));
            }
            unsafe {
                ptr::write(self.get_unchecked_mut(len), element);
                // NB can't overflow since we would have had to alloc the address space
                self.set_len(len + 1);
2141
            }
A
Aaron Turon 已提交
2142 2143
        }
    }
S
Simon Sapin 已提交
2144 2145 2146 2147 2148

    /// Creates a splicing iterator that replaces the specified range in the vector
    /// with the given `replace_with` iterator and yields the removed items.
    /// `replace_with` does not need to be the same length as `range`.
    ///
F
Felix Rabe 已提交
2149
    /// The element range is removed even if the iterator is not consumed until the end.
S
Simon Sapin 已提交
2150
    ///
F
Felix Rabe 已提交
2151
    /// It is unspecified how many elements are removed from the vector
S
Simon Sapin 已提交
2152 2153
    /// if the `Splice` value is leaked.
    ///
F
Felix Rabe 已提交
2154
    /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped.
S
Simon Sapin 已提交
2155
    ///
F
Felix Rabe 已提交
2156
    /// This is optimal if:
S
Simon Sapin 已提交
2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178
    ///
    /// * The tail (elements in the vector after `range`) is empty,
    /// * or `replace_with` yields fewer elements than `range`’s length
    /// * or the lower bound of its `size_hint()` is exact.
    ///
    /// Otherwise, a temporary vector is allocated and the tail is moved twice.
    ///
    /// # Panics
    ///
    /// Panics if the starting point is greater than the end point or if
    /// the end point is greater than the length of the vector.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut v = vec![1, 2, 3];
    /// let new = [7, 8];
    /// let u: Vec<_> = v.splice(..2, new.iter().cloned()).collect();
    /// assert_eq!(v, &[7, 8, 3]);
    /// assert_eq!(u, &[1, 2]);
    /// ```
    #[inline]
2179
    #[stable(feature = "vec_splice", since = "1.21.0")]
2180
    pub fn splice<R, I>(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter>
M
Mark Rousskov 已提交
2181 2182 2183
    where
        R: RangeBounds<usize>,
        I: IntoIterator<Item = T>,
S
Simon Sapin 已提交
2184
    {
M
Mark Rousskov 已提交
2185
        Splice { drain: self.drain(range), replace_with: replace_with.into_iter() }
S
Simon Sapin 已提交
2186 2187
    }

A
Alexis Beingessner 已提交
2188 2189 2190
    /// Creates an iterator which uses a closure to determine if an element should be removed.
    ///
    /// If the closure returns true, then the element is removed and yielded.
2191 2192
    /// If the closure returns false, the element will remain in the vector and will not be yielded
    /// by the iterator.
A
Alexis Beingessner 已提交
2193 2194 2195 2196
    ///
    /// Using this method is equivalent to the following code:
    ///
    /// ```
D
David Adler 已提交
2197 2198
    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6 };
    /// # let mut vec = vec![1, 2, 3, 4, 5, 6];
A
Alexis Beingessner 已提交
2199 2200 2201 2202 2203
    /// let mut i = 0;
    /// while i != vec.len() {
    ///     if some_predicate(&mut vec[i]) {
    ///         let val = vec.remove(i);
    ///         // your code here
D
David Adler 已提交
2204 2205
    ///     } else {
    ///         i += 1;
A
Alexis Beingessner 已提交
2206 2207
    ///     }
    /// }
D
David Adler 已提交
2208 2209
    ///
    /// # assert_eq!(vec, vec![1, 4, 5]);
A
Alexis Beingessner 已提交
2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233
    /// ```
    ///
    /// But `drain_filter` is easier to use. `drain_filter` is also more efficient,
    /// because it can backshift the elements of the array in bulk.
    ///
    /// Note that `drain_filter` also lets you mutate every element in the filter closure,
    /// regardless of whether you choose to keep or remove it.
    ///
    ///
    /// # Examples
    ///
    /// Splitting an array into evens and odds, reusing the original allocation:
    ///
    /// ```
    /// #![feature(drain_filter)]
    /// let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
    ///
    /// let evens = numbers.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
    /// let odds = numbers;
    ///
    /// assert_eq!(evens, vec![2, 4, 6, 8, 14]);
    /// assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
    /// ```
    #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
2234
    pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, T, F>
M
Mark Rousskov 已提交
2235 2236
    where
        F: FnMut(&mut T) -> bool,
A
Alexis Beingessner 已提交
2237 2238 2239 2240
    {
        let old_len = self.len();

        // Guard against us getting leaked (leak amplification)
M
Mark Rousskov 已提交
2241 2242
        unsafe {
            self.set_len(0);
A
Alexis Beingessner 已提交
2243
        }
M
Mark Rousskov 已提交
2244 2245

        DrainFilter { vec: self, idx: 0, del: 0, old_len, pred: filter, panic_flag: false }
A
Alexis Beingessner 已提交
2246
    }
A
Aaron Turon 已提交
2247 2248
}

2249 2250 2251 2252 2253 2254
/// Extend implementation that copies elements out of references before pushing them onto the Vec.
///
/// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to
/// append the entire slice at once.
///
/// [`copy_from_slice`]: ../../std/primitive.slice.html#method.copy_from_slice
J
Johannes Oertel 已提交
2255 2256
#[stable(feature = "extend_ref", since = "1.2.0")]
impl<'a, T: 'a + Copy> Extend<&'a T> for Vec<T> {
N
Nick Cameron 已提交
2257
    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
2258
        self.spec_extend(iter.into_iter())
J
Johannes Oertel 已提交
2259 2260 2261
    }
}

2262
macro_rules! __impl_slice_eq1 {
2263
    ([$($vars:tt)*] $lhs:ty, $rhs:ty, $($constraints:tt)*) => {
2264
        #[stable(feature = "rust1", since = "1.0.0")]
2265 2266 2267 2268 2269
        impl<A, B, $($vars)*> PartialEq<$rhs> for $lhs
        where
            A: PartialEq<B>,
            $($constraints)*
        {
2270
            #[inline]
2271
            fn eq(&self, other: &$rhs) -> bool { self[..] == other[..] }
2272
            #[inline]
2273
            fn ne(&self, other: &$rhs) -> bool { self[..] != other[..] }
2274 2275 2276 2277
        }
    }
}

2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
__impl_slice_eq1! { [] Vec<A>, Vec<B>, }
__impl_slice_eq1! { [] Vec<A>, &[B], }
__impl_slice_eq1! { [] Vec<A>, &mut [B], }
__impl_slice_eq1! { [] Cow<'_, [A]>, &[B], A: Clone }
__impl_slice_eq1! { [] Cow<'_, [A]>, &mut [B], A: Clone }
__impl_slice_eq1! { [] Cow<'_, [A]>, Vec<B>, A: Clone }
__impl_slice_eq1! { [const N: usize] Vec<A>, [B; N], [B; N]: LengthAtMost32 }
__impl_slice_eq1! { [const N: usize] Vec<A>, &[B; N], [B; N]: LengthAtMost32 }

// NOTE: some less important impls are omitted to reduce code bloat
// FIXME(Centril): Reconsider this?
//__impl_slice_eq1! { [const N: usize] Vec<A>, &mut [B; N], [B; N]: LengthAtMost32 }
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, [B; N], [B; N]: LengthAtMost32 }
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &[B; N], [B; N]: LengthAtMost32 }
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &mut [B; N], [B; N]: LengthAtMost32 }
A
Aaron Turon 已提交
2293

2294
/// Implements comparison of vectors, lexicographically.
A
Aaron Turon 已提交
2295
#[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
2296 2297 2298
impl<T: PartialOrd> PartialOrd for Vec<T> {
    #[inline]
    fn partial_cmp(&self, other: &Vec<T>) -> Option<Ordering> {
2299
        PartialOrd::partial_cmp(&**self, &**other)
A
Aaron Turon 已提交
2300 2301 2302
    }
}

A
Aaron Turon 已提交
2303
#[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
2304 2305
impl<T: Eq> Eq for Vec<T> {}

2306
/// Implements ordering of vectors, lexicographically.
A
Aaron Turon 已提交
2307
#[stable(feature = "rust1", since = "1.0.0")]
A
Aaron Turon 已提交
2308 2309 2310
impl<T: Ord> Ord for Vec<T> {
    #[inline]
    fn cmp(&self, other: &Vec<T>) -> Ordering {
2311
        Ord::cmp(&**self, &**other)
2312
    }
2313 2314
}

B
Brian Anderson 已提交
2315
#[stable(feature = "rust1", since = "1.0.0")]
2316
unsafe impl<#[may_dangle] T> Drop for Vec<T> {
2317
    fn drop(&mut self) {
2318 2319 2320
        unsafe {
            // use drop for [T]
            ptr::drop_in_place(&mut self[..]);
2321
        }
2322
        // RawVec handles deallocation
2323 2324 2325
    }
}

B
Brian Anderson 已提交
2326
#[stable(feature = "rust1", since = "1.0.0")]
2327
impl<T> Default for Vec<T> {
2328
    /// Creates an empty `Vec<T>`.
2329 2330 2331 2332 2333
    fn default() -> Vec<T> {
        Vec::new()
    }
}

2334
#[stable(feature = "rust1", since = "1.0.0")]
2335
impl<T: fmt::Debug> fmt::Debug for Vec<T> {
2336
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2337
        fmt::Debug::fmt(&**self, f)
2338 2339 2340
    }
}

A
Aaron Turon 已提交
2341 2342 2343 2344 2345 2346 2347
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> AsRef<Vec<T>> for Vec<T> {
    fn as_ref(&self) -> &Vec<T> {
        self
    }
}

U
Ulrik Sverdrup 已提交
2348 2349 2350 2351 2352 2353 2354
#[stable(feature = "vec_as_mut", since = "1.5.0")]
impl<T> AsMut<Vec<T>> for Vec<T> {
    fn as_mut(&mut self) -> &mut Vec<T> {
        self
    }
}

A
Aaron Turon 已提交
2355 2356 2357 2358 2359 2360 2361
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> AsRef<[T]> for Vec<T> {
    fn as_ref(&self) -> &[T] {
        self
    }
}

U
Ulrik Sverdrup 已提交
2362 2363 2364 2365 2366 2367 2368
#[stable(feature = "vec_as_mut", since = "1.5.0")]
impl<T> AsMut<[T]> for Vec<T> {
    fn as_mut(&mut self) -> &mut [T] {
        self
    }
}

A
Aaron Turon 已提交
2369
#[stable(feature = "rust1", since = "1.0.0")]
2370
impl<T: Clone> From<&[T]> for Vec<T> {
2371
    #[cfg(not(test))]
2372
    fn from(s: &[T]) -> Vec<T> {
A
Aaron Turon 已提交
2373 2374
        s.to_vec()
    }
2375
    #[cfg(test)]
2376
    fn from(s: &[T]) -> Vec<T> {
2377
        crate::slice::to_vec(s)
2378
    }
A
Aaron Turon 已提交
2379 2380
}

2381
#[stable(feature = "vec_from_mut", since = "1.19.0")]
2382
impl<T: Clone> From<&mut [T]> for Vec<T> {
2383
    #[cfg(not(test))]
2384
    fn from(s: &mut [T]) -> Vec<T> {
2385 2386 2387
        s.to_vec()
    }
    #[cfg(test)]
2388
    fn from(s: &mut [T]) -> Vec<T> {
2389
        crate::slice::to_vec(s)
2390 2391 2392
    }
}

2393
#[stable(feature = "vec_from_cow_slice", since = "1.14.0")]
M
Mark Rousskov 已提交
2394 2395 2396 2397
impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
where
    [T]: ToOwned<Owned = Vec<T>>,
{
2398 2399 2400 2401 2402
    fn from(s: Cow<'a, [T]>) -> Vec<T> {
        s.into_owned()
    }
}

C
Clar Charr 已提交
2403 2404
// note: test pulls in libstd, which causes errors here
#[cfg(not(test))]
2405
#[stable(feature = "vec_from_box", since = "1.18.0")]
C
Clar Charr 已提交
2406 2407 2408 2409 2410 2411
impl<T> From<Box<[T]>> for Vec<T> {
    fn from(s: Box<[T]>) -> Vec<T> {
        s.into_vec()
    }
}

2412 2413 2414 2415 2416 2417
// note: test pulls in libstd, which causes errors here
#[cfg(not(test))]
#[stable(feature = "box_from_vec", since = "1.20.0")]
impl<T> From<Vec<T>> for Box<[T]> {
    fn from(v: Vec<T>) -> Box<[T]> {
        v.into_boxed_slice()
C
Clar Charr 已提交
2418 2419 2420
    }
}

A
Aaron Turon 已提交
2421
#[stable(feature = "rust1", since = "1.0.0")]
2422 2423
impl From<&str> for Vec<u8> {
    fn from(s: &str) -> Vec<u8> {
2424
        From::from(s.as_bytes())
A
Aaron Turon 已提交
2425 2426 2427
    }
}

A
Aaron Turon 已提交
2428 2429 2430 2431
////////////////////////////////////////////////////////////////////////////////
// Clone-on-write
////////////////////////////////////////////////////////////////////////////////

2432
#[stable(feature = "cow_from_vec", since = "1.8.0")]
2433 2434 2435 2436 2437 2438
impl<'a, T: Clone> From<&'a [T]> for Cow<'a, [T]> {
    fn from(s: &'a [T]) -> Cow<'a, [T]> {
        Cow::Borrowed(s)
    }
}

2439
#[stable(feature = "cow_from_vec", since = "1.8.0")]
2440 2441 2442 2443 2444 2445
impl<'a, T: Clone> From<Vec<T>> for Cow<'a, [T]> {
    fn from(v: Vec<T>) -> Cow<'a, [T]> {
        Cow::Owned(v)
    }
}

G
George Burton 已提交
2446
#[stable(feature = "cow_from_vec_ref", since = "1.28.0")]
2447 2448 2449 2450 2451 2452
impl<'a, T: Clone> From<&'a Vec<T>> for Cow<'a, [T]> {
    fn from(v: &'a Vec<T>) -> Cow<'a, [T]> {
        Cow::Borrowed(v.as_slice())
    }
}

2453
#[stable(feature = "rust1", since = "1.0.0")]
M
Mark Rousskov 已提交
2454 2455 2456 2457
impl<'a, T> FromIterator<T> for Cow<'a, [T]>
where
    T: Clone,
{
N
Nick Cameron 已提交
2458
    fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Cow<'a, [T]> {
A
Aaron Turon 已提交
2459 2460 2461 2462 2463 2464 2465 2466
        Cow::Owned(FromIterator::from_iter(it))
    }
}

////////////////////////////////////////////////////////////////////////////////
// Iterators
////////////////////////////////////////////////////////////////////////////////

S
Steven Fackler 已提交
2467
/// An iterator that moves out of a vector.
2468
///
M
Matthew Kraai 已提交
2469
/// This `struct` is created by the `into_iter` method on [`Vec`] (provided
2470 2471 2472 2473
/// by the [`IntoIterator`] trait).
///
/// [`Vec`]: struct.Vec.html
/// [`IntoIterator`]: ../../std/iter/trait.IntoIterator.html
B
Brian Anderson 已提交
2474
#[stable(feature = "rust1", since = "1.0.0")]
2475
pub struct IntoIter<T> {
S
Simon Sapin 已提交
2476
    buf: NonNull<T>,
2477
    phantom: PhantomData<T>,
2478 2479
    cap: usize,
    ptr: *const T,
N
Nick Cameron 已提交
2480
    end: *const T,
2481 2482
}

2483
#[stable(feature = "vec_intoiter_debug", since = "1.13.0")]
2484
impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
2485
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
M
Mark Rousskov 已提交
2486
        f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
2487 2488 2489
    }
}

2490 2491 2492 2493 2494
impl<T> IntoIter<T> {
    /// Returns the remaining items of this iterator as a slice.
    ///
    /// # Examples
    ///
2495
    /// ```
2496 2497 2498 2499 2500 2501
    /// let vec = vec!['a', 'b', 'c'];
    /// let mut into_iter = vec.into_iter();
    /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
    /// let _ = into_iter.next().unwrap();
    /// assert_eq!(into_iter.as_slice(), &['b', 'c']);
    /// ```
2502
    #[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")]
2503
    pub fn as_slice(&self) -> &[T] {
M
Mark Rousskov 已提交
2504
        unsafe { slice::from_raw_parts(self.ptr, self.len()) }
2505
    }
2506 2507 2508 2509 2510

    /// Returns the remaining items of this iterator as a mutable slice.
    ///
    /// # Examples
    ///
2511
    /// ```
2512 2513 2514 2515 2516 2517 2518 2519
    /// let vec = vec!['a', 'b', 'c'];
    /// let mut into_iter = vec.into_iter();
    /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
    /// into_iter.as_mut_slice()[2] = 'z';
    /// assert_eq!(into_iter.next().unwrap(), 'a');
    /// assert_eq!(into_iter.next().unwrap(), 'b');
    /// assert_eq!(into_iter.next().unwrap(), 'z');
    /// ```
2520
    #[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")]
2521
    pub fn as_mut_slice(&mut self) -> &mut [T] {
M
Mark Rousskov 已提交
2522
        unsafe { slice::from_raw_parts_mut(self.ptr as *mut T, self.len()) }
2523
    }
2524 2525
}

2526
#[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
2527
unsafe impl<T: Send> Send for IntoIter<T> {}
2528
#[stable(feature = "rust1", since = "1.0.0")]
N
Nick Cameron 已提交
2529
unsafe impl<T: Sync> Sync for IntoIter<T> {}
2530

B
Brian Anderson 已提交
2531
#[stable(feature = "rust1", since = "1.0.0")]
J
Jorge Aparicio 已提交
2532 2533 2534
impl<T> Iterator for IntoIter<T> {
    type Item = T;

2535
    #[inline]
2536 2537
    fn next(&mut self) -> Option<T> {
        unsafe {
2538
            if self.ptr as *const _ == self.end {
2539 2540 2541 2542 2543 2544
                None
            } else {
                if mem::size_of::<T>() == 0 {
                    // purposefully don't use 'ptr.offset' because for
                    // vectors with 0-size elements this would return the
                    // same pointer.
2545
                    self.ptr = arith_offset(self.ptr as *const i8, 1) as *mut T;
2546

2547 2548
                    // Make up a value of this ZST.
                    Some(mem::zeroed())
2549 2550 2551 2552 2553 2554 2555 2556 2557 2558
                } else {
                    let old = self.ptr;
                    self.ptr = self.ptr.offset(1);

                    Some(ptr::read(old))
                }
            }
        }
    }

2559
    #[inline]
A
Alexis 已提交
2560
    fn size_hint(&self) -> (usize, Option<usize>) {
2561 2562 2563 2564
        let exact = if mem::size_of::<T>() == 0 {
            (self.end as usize).wrapping_sub(self.ptr as usize)
        } else {
            unsafe { self.end.offset_from(self.ptr) as usize }
A
Amanieu d'Antras 已提交
2565
        };
2566
        (exact, Some(exact))
2567
    }
2568 2569 2570

    #[inline]
    fn count(self) -> usize {
2571
        self.len()
2572
    }
2573 2574
}

B
Brian Anderson 已提交
2575
#[stable(feature = "rust1", since = "1.0.0")]
J
Jorge Aparicio 已提交
2576
impl<T> DoubleEndedIterator for IntoIter<T> {
2577
    #[inline]
2578 2579 2580 2581 2582 2583 2584
    fn next_back(&mut self) -> Option<T> {
        unsafe {
            if self.end == self.ptr {
                None
            } else {
                if mem::size_of::<T>() == 0 {
                    // See above for why 'ptr.offset' isn't used
2585
                    self.end = arith_offset(self.end as *const i8, -1) as *mut T;
2586

2587 2588
                    // Make up a value of this ZST.
                    Some(mem::zeroed())
2589 2590 2591
                } else {
                    self.end = self.end.offset(-1);

2592
                    Some(ptr::read(self.end))
2593 2594 2595 2596
                }
            }
        }
    }
2597 2598
}

B
Brian Anderson 已提交
2599
#[stable(feature = "rust1", since = "1.0.0")]
2600 2601 2602 2603 2604
impl<T> ExactSizeIterator for IntoIter<T> {
    fn is_empty(&self) -> bool {
        self.ptr == self.end
    }
}
2605

2606
#[stable(feature = "fused", since = "1.26.0")]
S
Steven Allen 已提交
2607 2608
impl<T> FusedIterator for IntoIter<T> {}

2609
#[unstable(feature = "trusted_len", issue = "37572")]
U
Ulrik Sverdrup 已提交
2610 2611
unsafe impl<T> TrustedLen for IntoIter<T> {}

2612 2613 2614
#[stable(feature = "vec_into_iter_clone", since = "1.8.0")]
impl<T: Clone> Clone for IntoIter<T> {
    fn clone(&self) -> IntoIter<T> {
2615
        self.as_slice().to_owned().into_iter()
2616 2617 2618
    }
}

B
Brian Anderson 已提交
2619
#[stable(feature = "rust1", since = "1.0.0")]
2620
unsafe impl<#[may_dangle] T> Drop for IntoIter<T> {
2621 2622
    fn drop(&mut self) {
        // destroy the remaining elements
2623
        for _x in self.by_ref() {}
2624 2625

        // RawVec handles deallocation
2626
        let _ = unsafe { RawVec::from_raw_parts(self.buf.as_ptr(), self.cap) };
2627 2628
    }
}
2629

2630
/// A draining iterator for `Vec<T>`.
2631 2632 2633 2634 2635
///
/// This `struct` is created by the [`drain`] method on [`Vec`].
///
/// [`drain`]: struct.Vec.html#method.drain
/// [`Vec`]: struct.Vec.html
2636
#[stable(feature = "drain", since = "1.6.0")]
2637 2638 2639 2640 2641 2642
pub struct Drain<'a, T: 'a> {
    /// Index of tail to preserve
    tail_start: usize,
    /// Length of tail
    tail_len: usize,
    /// Current remaining range to remove
2643
    iter: slice::Iter<'a, T>,
S
Simon Sapin 已提交
2644
    vec: NonNull<Vec<T>>,
2645 2646
}

2647
#[stable(feature = "collection_debug", since = "1.17.0")]
2648
impl<T: fmt::Debug> fmt::Debug for Drain<'_, T> {
2649
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
M
Mark Rousskov 已提交
2650
        f.debug_tuple("Drain").field(&self.iter.as_slice()).finish()
2651 2652 2653
    }
}

2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666
impl<'a, T> Drain<'a, T> {
    /// Returns the remaining items of this iterator as a slice.
    ///
    /// # Examples
    ///
    /// ```
    /// # #![feature(vec_drain_as_slice)]
    /// let mut vec = vec!['a', 'b', 'c'];
    /// let mut drain = vec.drain(..);
    /// assert_eq!(drain.as_slice(), &['a', 'b', 'c']);
    /// let _ = drain.next().unwrap();
    /// assert_eq!(drain.as_slice(), &['b', 'c']);
    /// ```
2667
    #[unstable(feature = "vec_drain_as_slice", reason = "recently added", issue = "58957")]
2668 2669 2670 2671 2672
    pub fn as_slice(&self) -> &[T] {
        self.iter.as_slice()
    }
}

2673
#[stable(feature = "drain", since = "1.6.0")]
2674
unsafe impl<T: Sync> Sync for Drain<'_, T> {}
2675
#[stable(feature = "drain", since = "1.6.0")]
2676
unsafe impl<T: Send> Send for Drain<'_, T> {}
E
Edward Wang 已提交
2677

2678
#[stable(feature = "drain", since = "1.6.0")]
2679
impl<T> Iterator for Drain<'_, T> {
J
Jorge Aparicio 已提交
2680 2681
    type Item = T;

2682 2683
    #[inline]
    fn next(&mut self) -> Option<T> {
N
Nick Cameron 已提交
2684
        self.iter.next().map(|elt| unsafe { ptr::read(elt as *const _) })
2685 2686
    }

A
Alexis 已提交
2687
    fn size_hint(&self) -> (usize, Option<usize>) {
2688
        self.iter.size_hint()
2689 2690 2691
    }
}

2692
#[stable(feature = "drain", since = "1.6.0")]
2693
impl<T> DoubleEndedIterator for Drain<'_, T> {
2694 2695
    #[inline]
    fn next_back(&mut self) -> Option<T> {
N
Nick Cameron 已提交
2696
        self.iter.next_back().map(|elt| unsafe { ptr::read(elt as *const _) })
2697 2698 2699
    }
}

2700
#[stable(feature = "drain", since = "1.6.0")]
2701
impl<T> Drop for Drain<'_, T> {
2702
    fn drop(&mut self) {
2703
        // exhaust self first
2704
        self.for_each(drop);
2705

2706 2707
        if self.tail_len > 0 {
            unsafe {
2708
                let source_vec = self.vec.as_mut();
2709 2710 2711
                // memmove back untouched tail, update to new length
                let start = source_vec.len();
                let tail = self.tail_start;
2712
                if tail != start {
2713 2714
                    let src = source_vec.as_ptr().add(tail);
                    let dst = source_vec.as_mut_ptr().add(start);
2715 2716
                    ptr::copy(src, dst, self.tail_len);
                }
2717 2718 2719
                source_vec.set_len(start + self.tail_len);
            }
        }
2720 2721 2722
    }
}

2723
#[stable(feature = "drain", since = "1.6.0")]
2724
impl<T> ExactSizeIterator for Drain<'_, T> {
2725 2726 2727 2728
    fn is_empty(&self) -> bool {
        self.iter.is_empty()
    }
}
S
Steven Allen 已提交
2729

2730 2731 2732
#[unstable(feature = "trusted_len", issue = "37572")]
unsafe impl<T> TrustedLen for Drain<'_, T> {}

2733
#[stable(feature = "fused", since = "1.26.0")]
2734
impl<T> FusedIterator for Drain<'_, T> {}
2735

M
Matt Ickstadt 已提交
2736 2737 2738 2739 2740 2741 2742 2743
/// A splicing iterator for `Vec`.
///
/// This struct is created by the [`splice()`] method on [`Vec`]. See its
/// documentation for more.
///
/// [`splice()`]: struct.Vec.html#method.splice
/// [`Vec`]: struct.Vec.html
#[derive(Debug)]
2744
#[stable(feature = "vec_splice", since = "1.21.0")]
S
Simon Sapin 已提交
2745 2746 2747 2748 2749
pub struct Splice<'a, I: Iterator + 'a> {
    drain: Drain<'a, I::Item>,
    replace_with: I,
}

2750
#[stable(feature = "vec_splice", since = "1.21.0")]
2751
impl<I: Iterator> Iterator for Splice<'_, I> {
S
Simon Sapin 已提交
2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762
    type Item = I::Item;

    fn next(&mut self) -> Option<Self::Item> {
        self.drain.next()
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.drain.size_hint()
    }
}

2763
#[stable(feature = "vec_splice", since = "1.21.0")]
2764
impl<I: Iterator> DoubleEndedIterator for Splice<'_, I> {
S
Simon Sapin 已提交
2765 2766 2767 2768 2769
    fn next_back(&mut self) -> Option<Self::Item> {
        self.drain.next_back()
    }
}

2770
#[stable(feature = "vec_splice", since = "1.21.0")]
2771
impl<I: Iterator> ExactSizeIterator for Splice<'_, I> {}
S
Simon Sapin 已提交
2772

2773
#[stable(feature = "vec_splice", since = "1.21.0")]
2774
impl<I: Iterator> Drop for Splice<'_, I> {
S
Simon Sapin 已提交
2775
    fn drop(&mut self) {
2776
        self.drain.by_ref().for_each(drop);
S
Simon Sapin 已提交
2777 2778 2779

        unsafe {
            if self.drain.tail_len == 0 {
2780
                self.drain.vec.as_mut().extend(self.replace_with.by_ref());
M
Mark Rousskov 已提交
2781
                return;
S
Simon Sapin 已提交
2782 2783 2784 2785
            }

            // First fill the range left by drain().
            if !self.drain.fill(&mut self.replace_with) {
M
Mark Rousskov 已提交
2786
                return;
S
Simon Sapin 已提交
2787 2788 2789 2790 2791
            }

            // There may be more elements. Use the lower bound as an estimate.
            // FIXME: Is the upper bound a better guess? Or something else?
            let (lower_bound, _upper_bound) = self.replace_with.size_hint();
M
Mark Rousskov 已提交
2792
            if lower_bound > 0 {
S
Simon Sapin 已提交
2793 2794
                self.drain.move_tail(lower_bound);
                if !self.drain.fill(&mut self.replace_with) {
M
Mark Rousskov 已提交
2795
                    return;
S
Simon Sapin 已提交
2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814
                }
            }

            // Collect any remaining elements.
            // This is a zero-length vector which does not allocate if `lower_bound` was exact.
            let mut collected = self.replace_with.by_ref().collect::<Vec<I::Item>>().into_iter();
            // Now we have an exact count.
            if collected.len() > 0 {
                self.drain.move_tail(collected.len());
                let filled = self.drain.fill(&mut collected);
                debug_assert!(filled);
                debug_assert_eq!(collected.len(), 0);
            }
        }
        // Let `Drain::drop` move the tail back if necessary and restore `vec.len`.
    }
}

/// Private helper methods for `Splice::drop`
2815
impl<T> Drain<'_, T> {
S
Simon Sapin 已提交
2816 2817 2818
    /// The range from `self.vec.len` to `self.tail_start` contains elements
    /// that have been moved out.
    /// Fill that range as much as possible with new elements from the `replace_with` iterator.
A
Alexander Regueiro 已提交
2819
    /// Returns `true` if we filled the entire range. (`replace_with.next()` didn’t return `None`.)
M
Mark Rousskov 已提交
2820
    unsafe fn fill<I: Iterator<Item = T>>(&mut self, replace_with: &mut I) -> bool {
2821
        let vec = self.vec.as_mut();
S
Simon Sapin 已提交
2822 2823
        let range_start = vec.len;
        let range_end = self.tail_start;
M
Mark Rousskov 已提交
2824 2825
        let range_slice =
            slice::from_raw_parts_mut(vec.as_mut_ptr().add(range_start), range_end - range_start);
S
Simon Sapin 已提交
2826 2827 2828 2829 2830 2831

        for place in range_slice {
            if let Some(new_item) = replace_with.next() {
                ptr::write(place, new_item);
                vec.len += 1;
            } else {
M
Mark Rousskov 已提交
2832
                return false;
S
Simon Sapin 已提交
2833 2834 2835 2836 2837
            }
        }
        true
    }

A
Alexander Regueiro 已提交
2838
    /// Makes room for inserting more elements before the tail.
S
Simon Sapin 已提交
2839
    unsafe fn move_tail(&mut self, extra_capacity: usize) {
2840
        let vec = self.vec.as_mut();
S
Simon Sapin 已提交
2841 2842 2843 2844
        let used_capacity = self.tail_start + self.tail_len;
        vec.buf.reserve(used_capacity, extra_capacity);

        let new_tail_start = self.tail_start + extra_capacity;
2845 2846
        let src = vec.as_ptr().add(self.tail_start);
        let dst = vec.as_mut_ptr().add(new_tail_start);
S
Simon Sapin 已提交
2847 2848 2849 2850
        ptr::copy(src, dst, self.tail_len);
        self.tail_start = new_tail_start;
    }
}
A
Alexis Beingessner 已提交
2851 2852 2853 2854

/// An iterator produced by calling `drain_filter` on Vec.
#[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
#[derive(Debug)]
2855
pub struct DrainFilter<'a, T, F>
M
Mark Rousskov 已提交
2856 2857
where
    F: FnMut(&mut T) -> bool,
A
Alexis Beingessner 已提交
2858 2859
{
    vec: &'a mut Vec<T>,
2860
    /// The index of the item that will be inspected by the next call to `next`.
A
Alexis Beingessner 已提交
2861
    idx: usize,
2862
    /// The number of items that have been drained (removed) thus far.
A
Alexis Beingessner 已提交
2863
    del: usize,
2864
    /// The original length of `vec` prior to draining.
A
Alexis Beingessner 已提交
2865
    old_len: usize,
2866
    /// The filter test predicate.
A
Alexis Beingessner 已提交
2867
    pred: F,
B
Brian Wignall 已提交
2868
    /// A flag that indicates a panic has occurred in the filter test prodicate.
2869 2870 2871 2872
    /// This is used as a hint in the drop implmentation to prevent consumption
    /// of the remainder of the `DrainFilter`. Any unprocessed items will be
    /// backshifted in the `vec`, but no further items will be dropped or
    /// tested by the filter predicate.
2873
    panic_flag: bool,
A
Alexis Beingessner 已提交
2874 2875 2876
}

#[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
2877
impl<T, F> Iterator for DrainFilter<'_, T, F>
M
Mark Rousskov 已提交
2878 2879
where
    F: FnMut(&mut T) -> bool,
A
Alexis Beingessner 已提交
2880 2881 2882 2883 2884
{
    type Item = T;

    fn next(&mut self) -> Option<T> {
        unsafe {
2885
            while self.idx < self.old_len {
A
Alexis Beingessner 已提交
2886 2887
                let i = self.idx;
                let v = slice::from_raw_parts_mut(self.vec.as_mut_ptr(), self.old_len);
2888 2889 2890
                self.panic_flag = true;
                let drained = (self.pred)(&mut v[i]);
                self.panic_flag = false;
2891 2892 2893 2894
                // Update the index *after* the predicate is called. If the index
                // is updated prior and the predicate panics, the element at this
                // index would be leaked.
                self.idx += 1;
2895
                if drained {
A
Alexis Beingessner 已提交
2896 2897 2898
                    self.del += 1;
                    return Some(ptr::read(&v[i]));
                } else if self.del > 0 {
J
Jacob Kiesel 已提交
2899
                    let del = self.del;
J
Jacob Kiesel 已提交
2900 2901
                    let src: *const T = &v[i];
                    let dst: *mut T = &mut v[i - del];
J
Jacob Kiesel 已提交
2902
                    ptr::copy_nonoverlapping(src, dst, 1);
A
Alexis Beingessner 已提交
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914
                }
            }
            None
        }
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        (0, Some(self.old_len - self.idx))
    }
}

#[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")]
2915
impl<T, F> Drop for DrainFilter<'_, T, F>
M
Mark Rousskov 已提交
2916 2917
where
    F: FnMut(&mut T) -> bool,
A
Alexis Beingessner 已提交
2918 2919
{
    fn drop(&mut self) {
2920
        struct BackshiftOnDrop<'a, 'b, T, F>
M
Mark Rousskov 已提交
2921 2922
        where
            F: FnMut(&mut T) -> bool,
2923 2924 2925 2926 2927
        {
            drain: &'b mut DrainFilter<'a, T, F>,
        }

        impl<'a, 'b, T, F> Drop for BackshiftOnDrop<'a, 'b, T, F>
M
Mark Rousskov 已提交
2928 2929
        where
            F: FnMut(&mut T) -> bool,
2930 2931 2932
        {
            fn drop(&mut self) {
                unsafe {
2933 2934 2935 2936 2937 2938
                    if self.drain.idx < self.drain.old_len && self.drain.del > 0 {
                        // This is a pretty messed up state, and there isn't really an
                        // obviously right thing to do. We don't want to keep trying
                        // to execute `pred`, so we just backshift all the unprocessed
                        // elements and tell the vec that they still exist. The backshift
                        // is required to prevent a double-drop of the last successfully
A
Aaron Loucks 已提交
2939
                        // drained item prior to a panic in the predicate.
2940 2941 2942 2943 2944
                        let ptr = self.drain.vec.as_mut_ptr();
                        let src = ptr.add(self.drain.idx);
                        let dst = src.sub(self.drain.del);
                        let tail_len = self.drain.old_len - self.drain.idx;
                        src.copy_to(dst, tail_len);
2945 2946 2947 2948 2949 2950
                    }
                    self.drain.vec.set_len(self.drain.old_len - self.drain.del);
                }
            }
        }

M
Mark Rousskov 已提交
2951
        let backshift = BackshiftOnDrop { drain: self };
2952

2953 2954 2955
        // Attempt to consume any remaining elements if the filter predicate
        // has not yet panicked. We'll backshift any remaining elements
        // whether we've already panicked or if the consumption here panics.
2956 2957
        if !backshift.drain.panic_flag {
            backshift.drain.for_each(drop);
A
Alexis Beingessner 已提交
2958 2959 2960
        }
    }
}