Remove ExtendWith and ExtendElement
This commit is contained in:
parent
4e4f0417aa
commit
dd2bd03d0a
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user