add Vec::extend_from_within
method
Implement <https://github.com/rust-lang/rfcs/pull/2714>, changes from the RFC: - Rename the method `append_from_within` => `extend_from_within` - Loose :Copy bound => :Clone - Specialize in case of :Copy This commit also adds `Vec::split_at_spare` private method and use it to implement `Vec::spare_capacity_mut` and `Vec::extend_from_within`. This method returns 2 slices - initialized elements (same as `&mut vec[..]`) and uninitialized but allocated space (same as `vec.spare_capacity_mut()`).
This commit is contained in:
parent
95cbcad920
commit
d5c221107e
4 changed files with 181 additions and 4 deletions
|
@ -20,6 +20,7 @@
|
|||
#![feature(int_bits_const)]
|
||||
#![feature(vecdeque_binary_search)]
|
||||
#![feature(slice_group_by)]
|
||||
#![feature(vec_extend_from_within)]
|
||||
|
||||
use std::collections::hash_map::DefaultHasher;
|
||||
use std::hash::{Hash, Hasher};
|
||||
|
|
|
@ -1954,3 +1954,73 @@ fn test_vec_swap() {
|
|||
assert_eq!(a[0], 42);
|
||||
assert_eq!(n, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_spec() {
|
||||
#[derive(Copy)]
|
||||
struct CopyOnly;
|
||||
|
||||
impl Clone for CopyOnly {
|
||||
fn clone(&self) -> Self {
|
||||
panic!("extend_from_within must use specialization on copy");
|
||||
}
|
||||
}
|
||||
|
||||
vec![CopyOnly, CopyOnly].extend_from_within(..);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_clone() {
|
||||
let mut v = vec![String::from("sssss"), String::from("12334567890"), String::from("c")];
|
||||
v.extend_from_within(1..);
|
||||
|
||||
assert_eq!(v, ["sssss", "12334567890", "c", "12334567890", "c"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_complete_rande() {
|
||||
let mut v = vec![0, 1, 2, 3];
|
||||
v.extend_from_within(..);
|
||||
|
||||
assert_eq!(v, [0, 1, 2, 3, 0, 1, 2, 3]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_empty_rande() {
|
||||
let mut v = vec![0, 1, 2, 3];
|
||||
v.extend_from_within(1..1);
|
||||
|
||||
assert_eq!(v, [0, 1, 2, 3]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_extend_from_within_out_of_rande() {
|
||||
let mut v = vec![0, 1];
|
||||
v.extend_from_within(..3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_zst() {
|
||||
let mut v = vec![(); 8];
|
||||
v.extend_from_within(3..7);
|
||||
|
||||
assert_eq!(v, [(); 12]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within_empty_vec() {
|
||||
let mut v = Vec::<i32>::new();
|
||||
v.extend_from_within(..);
|
||||
|
||||
assert_eq!(v, []);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extend_from_within() {
|
||||
let mut v = vec![String::from("a"), String::from("b"), String::from("c")];
|
||||
v.extend_from_within(1..=2);
|
||||
v.extend_from_within(..=1);
|
||||
|
||||
assert_eq!(v, ["a", "b", "c", "b", "c", "a", "b"]);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue