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
No known key found for this signature in database
GPG Key ID: 3568C53A7C68A6EA
1 changed files with 19 additions and 4 deletions

View File

@ -36,12 +36,12 @@ impl SpecFromElem for i8 {
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 @@ impl SpecFromElem for u8 {
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
}
}