]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/vec/spec_from_elem.rs
Auto merge of #104990 - matthiaskrgr:rollup-oskk8v3, r=matthiaskrgr
[rust.git] / library / alloc / src / vec / spec_from_elem.rs
1 use core::ptr;
2
3 use crate::alloc::Allocator;
4 use crate::raw_vec::RawVec;
5
6 use super::{ExtendElement, IsZero, Vec};
7
8 // Specialization trait used for Vec::from_elem
9 pub(super) trait SpecFromElem: Sized {
10     fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A>;
11 }
12
13 impl<T: Clone> SpecFromElem for T {
14     default fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A> {
15         let mut v = Vec::with_capacity_in(n, alloc);
16         v.extend_with(n, ExtendElement(elem));
17         v
18     }
19 }
20
21 impl<T: Clone + IsZero> SpecFromElem for T {
22     #[inline]
23     default fn from_elem<A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
24         if elem.is_zero() {
25             return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
26         }
27         let mut v = Vec::with_capacity_in(n, alloc);
28         v.extend_with(n, ExtendElement(elem));
29         v
30     }
31 }
32
33 impl SpecFromElem for i8 {
34     #[inline]
35     fn from_elem<A: Allocator>(elem: i8, n: usize, alloc: A) -> Vec<i8, A> {
36         if elem == 0 {
37             return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
38         }
39         unsafe {
40             let mut v = Vec::with_capacity_in(n, alloc);
41             ptr::write_bytes(v.as_mut_ptr(), elem as u8, n);
42             v.set_len(n);
43             v
44         }
45     }
46 }
47
48 impl SpecFromElem for u8 {
49     #[inline]
50     fn from_elem<A: Allocator>(elem: u8, n: usize, alloc: A) -> Vec<u8, A> {
51         if elem == 0 {
52             return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
53         }
54         unsafe {
55             let mut v = Vec::with_capacity_in(n, alloc);
56             ptr::write_bytes(v.as_mut_ptr(), elem, n);
57             v.set_len(n);
58             v
59         }
60     }
61 }