1 use crate::alloc::Allocator;
2 use crate::raw_vec::RawVec;
5 use super::{ExtendElement, IsZero, Vec};
7 // Specialization trait used for Vec::from_elem
8 pub(super) trait SpecFromElem: Sized {
9 fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A>;
12 impl<T: Clone> SpecFromElem for T {
13 default fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A> {
14 let mut v = Vec::with_capacity_in(n, alloc);
15 v.extend_with(n, ExtendElement(elem));
20 impl SpecFromElem for i8 {
22 fn from_elem<A: Allocator>(elem: i8, n: usize, alloc: A) -> Vec<i8, A> {
24 return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
27 let mut v = Vec::with_capacity_in(n, alloc);
28 ptr::write_bytes(v.as_mut_ptr(), elem as u8, n);
35 impl SpecFromElem for u8 {
37 fn from_elem<A: Allocator>(elem: u8, n: usize, alloc: A) -> Vec<u8, A> {
39 return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
42 let mut v = Vec::with_capacity_in(n, alloc);
43 ptr::write_bytes(v.as_mut_ptr(), elem, n);
50 impl<T: Clone + IsZero> SpecFromElem for T {
52 fn from_elem<A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
54 return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
56 let mut v = Vec::with_capacity_in(n, alloc);
57 v.extend_with(n, ExtendElement(elem));