mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Rollup merge of #56016 - scottmcm:vecdeque-resize-with, r=joshtriplett
Add VecDeque::resize_with This already exists on `Vec`; I'm just adding it to `VecDeque`. I wanted to resize a `VecDeque<Vec<T>>` when I didn't know `T: Clone`, so I couldn't use `.resize(n, Vec::new())`. With this I could do `.resize_with(n, Vec::new)` instead, which doesn't need `T: Clone`. Tracking issue: https://github.com/rust-lang/rust/issues/41758
This commit is contained in:
commit
f5dc12ebfc
@ -19,7 +19,7 @@
|
||||
|
||||
use core::cmp::Ordering;
|
||||
use core::fmt;
|
||||
use core::iter::{repeat, FromIterator, FusedIterator};
|
||||
use core::iter::{repeat, repeat_with, FromIterator, FusedIterator};
|
||||
use core::mem;
|
||||
use core::ops::Bound::{Excluded, Included, Unbounded};
|
||||
use core::ops::{Index, IndexMut, RangeBounds};
|
||||
@ -1920,6 +1920,44 @@ impl<T: Clone> VecDeque<T> {
|
||||
self.truncate(new_len);
|
||||
}
|
||||
}
|
||||
|
||||
/// Modifies the `VecDeque` in-place so that `len()` is equal to `new_len`,
|
||||
/// either by removing excess elements from the back or by appending
|
||||
/// elements generated by calling `generator` to the back.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(vec_resize_with)]
|
||||
///
|
||||
/// use std::collections::VecDeque;
|
||||
///
|
||||
/// let mut buf = VecDeque::new();
|
||||
/// buf.push_back(5);
|
||||
/// buf.push_back(10);
|
||||
/// buf.push_back(15);
|
||||
/// assert_eq!(buf, [5, 10, 15]);
|
||||
///
|
||||
/// buf.resize_with(5, Default::default);
|
||||
/// assert_eq!(buf, [5, 10, 15, 0, 0]);
|
||||
///
|
||||
/// buf.resize_with(2, || unreachable!());
|
||||
/// assert_eq!(buf, [5, 10]);
|
||||
///
|
||||
/// let mut state = 100;
|
||||
/// buf.resize_with(5, || { state += 1; state });
|
||||
/// assert_eq!(buf, [5, 10, 101, 102, 103]);
|
||||
/// ```
|
||||
#[unstable(feature = "vec_resize_with", issue = "41758")]
|
||||
pub fn resize_with(&mut self, new_len: usize, generator: impl FnMut()->T) {
|
||||
let len = self.len();
|
||||
|
||||
if new_len > len {
|
||||
self.extend(repeat_with(generator).take(new_len - len))
|
||||
} else {
|
||||
self.truncate(new_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the index in the underlying buffer for a given logical element index.
|
||||
|
Loading…
Reference in New Issue
Block a user