Remove ExtendWith and ExtendElement

This commit is contained in:
Grisha Vartanyan 2023-06-04 08:06:25 +02:00
parent 4e4f0417aa
commit dd2bd03d0a
2 changed files with 10 additions and 26 deletions

View File

@ -2355,7 +2355,7 @@ pub fn resize(&mut self, new_len: usize, value: T) {
let len = self.len(); let len = self.len();
if new_len > len { if new_len > len {
self.extend_with(new_len - len, ExtendElement(value)) self.extend_with(new_len - len, value)
} else { } else {
self.truncate(new_len); self.truncate(new_len);
} }
@ -2469,26 +2469,10 @@ pub fn into_flattened(self) -> Vec<T, A> {
} }
} }
// This code generalizes `extend_with_{element,default}`. impl<T: Clone, A: Allocator> Vec<T, A> {
trait ExtendWith<T> {
fn next(&mut self) -> T;
fn last(self) -> T;
}
struct ExtendElement<T>(T);
impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
fn next(&mut self) -> T {
self.0.clone()
}
fn last(self) -> T {
self.0
}
}
impl<T, A: Allocator> Vec<T, A> {
#[cfg(not(no_global_oom_handling))] #[cfg(not(no_global_oom_handling))]
/// Extend the vector by `n` values, using the given generator. /// Extend the vector by `n` clones of value.
fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, mut value: E) { fn extend_with(&mut self, n: usize, value: T) {
self.reserve(n); self.reserve(n);
unsafe { unsafe {
@ -2500,15 +2484,15 @@ fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, mut value: E) {
// Write all elements except the last one // Write all elements except the last one
for _ in 1..n { for _ in 1..n {
ptr::write(ptr, value.next()); ptr::write(ptr, value.clone());
ptr = ptr.add(1); ptr = ptr.add(1);
// Increment the length in every step in case next() panics // Increment the length in every step in case clone() panics
local_len.increment_len(1); local_len.increment_len(1);
} }
if n > 0 { if n > 0 {
// We can write the last element directly without cloning needlessly // We can write the last element directly without cloning needlessly
ptr::write(ptr, value.last()); ptr::write(ptr, value);
local_len.increment_len(1); local_len.increment_len(1);
} }

View File

@ -3,7 +3,7 @@
use crate::alloc::Allocator; use crate::alloc::Allocator;
use crate::raw_vec::RawVec; use crate::raw_vec::RawVec;
use super::{ExtendElement, IsZero, Vec}; use super::{IsZero, Vec};
// Specialization trait used for Vec::from_elem // Specialization trait used for Vec::from_elem
pub(super) trait SpecFromElem: Sized { pub(super) trait SpecFromElem: Sized {
@ -13,7 +13,7 @@ pub(super) trait SpecFromElem: Sized {
impl<T: Clone> SpecFromElem for T { impl<T: Clone> SpecFromElem for T {
default fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A> { default fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A> {
let mut v = Vec::with_capacity_in(n, alloc); let mut v = Vec::with_capacity_in(n, alloc);
v.extend_with(n, ExtendElement(elem)); v.extend_with(n, elem);
v v
} }
} }
@ -25,7 +25,7 @@ impl<T: Clone + IsZero> SpecFromElem for T {
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n }; return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
} }
let mut v = Vec::with_capacity_in(n, alloc); let mut v = Vec::with_capacity_in(n, alloc);
v.extend_with(n, ExtendElement(elem)); v.extend_with(n, elem);
v v
} }
} }