]> git.lizzy.rs Git - rust.git/blob - library/core/src/slice/specialize.rs
Merge commit '48d60ab7c505c6c1ebb042eacaafd8dc9f7a9267' into libgccjit-codegen
[rust.git] / library / core / src / slice / specialize.rs
1 use crate::mem::{size_of, transmute_copy};
2 use crate::ptr::write_bytes;
3
4 pub(super) trait SpecFill<T> {
5     fn spec_fill(&mut self, value: T);
6 }
7
8 impl<T: Clone> SpecFill<T> for [T] {
9     default fn spec_fill(&mut self, value: T) {
10         if let Some((last, elems)) = self.split_last_mut() {
11             for el in elems {
12                 el.clone_from(&value);
13             }
14
15             *last = value
16         }
17     }
18 }
19
20 impl<T: Copy> SpecFill<T> for [T] {
21     fn spec_fill(&mut self, value: T) {
22         if size_of::<T>() == 1 {
23             // SAFETY: The size_of check above ensures that values are 1 byte wide, as required
24             // for the transmute and write_bytes
25             unsafe {
26                 let value: u8 = transmute_copy(&value);
27                 write_bytes(self.as_mut_ptr(), value, self.len());
28             }
29         } else {
30             for item in self.iter_mut() {
31                 *item = value;
32             }
33         }
34     }
35 }