Skip to content

Commit 9dd3b23

Browse files
authored
Rollup merge of #150597 - antonilol:extend-from-vec-any-allocator, r=jhpratt
make specialization of `Vec::extend` and `VecDeque::extend_front` work for vec::IntoIter with any `Allocator`, not just `Global` These functions consume all the elements from the respective collection, but do not care about the `Allocator` they use. Without specifying one (like in `vec::IntoIter<T>`) the specialization is only chosen when `A=Global`. (extra context: `VecDeque::extend_front` is unstable and tracked by #146975)
2 parents 2270553 + 9a170fe commit 9dd3b23

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

library/alloc/src/collections/vec_deque/spec_extend.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ where
7777
}
7878

7979
#[cfg(not(test))]
80-
impl<T, A: Allocator> SpecExtend<T, vec::IntoIter<T>> for VecDeque<T, A> {
81-
fn spec_extend(&mut self, mut iterator: vec::IntoIter<T>) {
80+
impl<T, A1: Allocator, A2: Allocator> SpecExtend<T, vec::IntoIter<T, A2>> for VecDeque<T, A1> {
81+
fn spec_extend(&mut self, mut iterator: vec::IntoIter<T, A2>) {
8282
let slice = iterator.as_slice();
8383
self.reserve(slice.len());
8484

@@ -153,9 +153,9 @@ where
153153
}
154154

155155
#[cfg(not(test))]
156-
impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> {
156+
impl<T, A1: Allocator, A2: Allocator> SpecExtendFront<T, vec::IntoIter<T, A2>> for VecDeque<T, A1> {
157157
#[track_caller]
158-
fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T>) {
158+
fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T, A2>) {
159159
let slice = iterator.as_slice();
160160
self.reserve(slice.len());
161161
// SAFETY: `slice.len()` space was just reserved and elements in the slice are forgotten after this call
@@ -165,9 +165,11 @@ impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> {
165165
}
166166

167167
#[cfg(not(test))]
168-
impl<T, A: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T>>> for VecDeque<T, A> {
168+
impl<T, A1: Allocator, A2: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T, A2>>>
169+
for VecDeque<T, A1>
170+
{
169171
#[track_caller]
170-
fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T>>) {
172+
fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T, A2>>) {
171173
let mut iterator = iterator.into_inner();
172174
let slice = iterator.as_slice();
173175
self.reserve(slice.len());

library/alloc/src/vec/spec_extend.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ where
2828
}
2929
}
3030

31-
impl<T, A: Allocator> SpecExtend<T, IntoIter<T>> for Vec<T, A> {
32-
fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
31+
impl<T, A1: Allocator, A2: Allocator> SpecExtend<T, IntoIter<T, A2>> for Vec<T, A1> {
32+
fn spec_extend(&mut self, mut iterator: IntoIter<T, A2>) {
3333
unsafe {
3434
self.append_elements(iterator.as_slice() as _);
3535
}

0 commit comments

Comments
 (0)