feat: specialize SpecFromElem for ()

While a better approach would be to implement it for all ZSTs
which are `Copy` and have trivial `Clone`,
the last property cannot be detected for now.

Signed-off-by: Petr Portnov <me@progrm-jarvis.ru>
This commit is contained in:
Petr Portnov
2023-11-20 16:47:32 +03:00
parent 79e961fa72
commit 2fd9442afc
+19 -4
View File
@@ -36,12 +36,12 @@ fn from_elem<A: Allocator>(elem: i8, n: usize, alloc: A) -> Vec<i8, A> {
if elem == 0 {
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
}
let mut v = Vec::with_capacity_in(n, alloc);
unsafe {
let mut v = Vec::with_capacity_in(n, alloc);
ptr::write_bytes(v.as_mut_ptr(), elem as u8, n);
v.set_len(n);
v
}
v
}
}
@@ -51,11 +51,26 @@ fn from_elem<A: Allocator>(elem: u8, n: usize, alloc: A) -> Vec<u8, A> {
if elem == 0 {
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
}
let mut v = Vec::with_capacity_in(n, alloc);
unsafe {
let mut v = Vec::with_capacity_in(n, alloc);
ptr::write_bytes(v.as_mut_ptr(), elem, n);
v.set_len(n);
v
}
v
}
}
// A better way would be to implement this for all ZSTs which are `Copy` and have trivial `Clone`
// but this cannot be implemented currently
impl SpecFromElem for () {
#[inline]
fn from_elem<A: Allocator>(elem: (), n: usize, alloc: A) -> Vec<(), A> {
let mut v = Vec::with_capacity_in(n, alloc);
// SAFETY: the capacity has just been set to `n` and `()`
// is a ZST with trivial `Clone` implementation
unsafe {
v.set_len(n);
}
v
}
}