rust/library/alloc/tests
bors f6cb45ad01 Auto merge of #79015 - WaffleLapkin:vec_append_from_within, r=KodrAus
add `Vec::extend_from_within` method under `vec_extend_from_within` feature gate

Implement <https://github.com/rust-lang/rfcs/pull/2714>

### tl;dr

This PR adds a `extend_from_within` method to `Vec` which allows copying elements from a range to the end:

```rust
#![feature(vec_extend_from_within)]

let mut vec = vec![0, 1, 2, 3, 4];

vec.extend_from_within(2..);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);

vec.extend_from_within(..2);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);

vec.extend_from_within(4..8);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
```

### Implementation notes

Originally I've copied `@Shnatsel's` [implementation](690742a0de/src/lib.rs (L74)) with some minor changes to support other ranges:
```rust
pub fn append_from_within<R>(&mut self, src: R)
where
    T: Copy,
    R: RangeBounds<usize>,
{
    let len = self.len();
    let Range { start, end } = src.assert_len(len);;

    let count = end - start;
    self.reserve(count);
    unsafe {
        // This is safe because `reserve()` above succeeded,
        // so `self.len() + count` did not overflow usize
        ptr::copy_nonoverlapping(
            self.get_unchecked(src.start),
            self.as_mut_ptr().add(len),
            count,
        );
        self.set_len(len + count);
    }
}
```

But then I've realized that this duplicates most of the code from (private) `Vec::append_elements`, so I've used it instead.

Then I've applied `@KodrAus` suggestions from https://github.com/rust-lang/rust/pull/79015#issuecomment-727200852.
2021-02-02 09:12:53 +00:00
..
arc.rs
binary_heap.rs in-place collect for Vec. Box<[]> and BinaryHeap IntoIter and some adapters 2020-09-03 20:59:03 +02:00
borrow.rs Move various ui const tests to library 2020-09-04 02:35:27 +02:00
boxed.rs review: fix nits and move panic safety tests to the correct place 2020-09-25 23:10:24 +02:00
btree_set_hash.rs Move btree unit test to their native, privileged location 2020-08-14 17:54:09 +02:00
cow_str.rs
fmt.rs review: fix nits and move panic safety tests to the correct place 2020-09-25 23:10:24 +02:00
heap.rs Rename AllocRef to Allocator and (de)alloc to (de)allocate 2020-12-04 14:47:15 +01:00
lib.rs Auto merge of #79015 - WaffleLapkin:vec_append_from_within, r=KodrAus 2021-02-02 09:12:53 +00:00
linked_list.rs
rc.rs
slice.rs Update the slice GroupBy/Mut test 2020-12-10 13:42:31 +01:00
str.rs break formatting so rustfmt is happy 2020-12-02 14:09:36 +01:00
string.rs Fix soundness issue for replace_range and range 2021-01-18 22:14:38 -05:00
vec_deque.rs replace assert! with assert_eq! 2020-12-13 10:21:24 +01:00
vec.rs add Vec::extend_from_within method 2021-01-31 22:30:19 +03:00