1
Fork 0

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:
Waffle 2020-11-13 12:50:12 +03:00
parent 95cbcad920
commit d5c221107e
4 changed files with 181 additions and 4 deletions

View file

@ -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};

View file

@ -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"]);
}