use std::{
slice,
sync::atomic::{AtomicU8, Ordering, fence},
};
pub trait U8SliceExt {
unsafe fn atomic_copy_from_ptr(
&mut self,
src: *const [u8],
load_order: Ordering,
fence_order: Ordering,
);
}
impl U8SliceExt for [u8] {
unsafe fn atomic_copy_from_ptr(
&mut self,
src: *const [u8],
load_order: Ordering,
fence_order: Ordering,
) {
assert_eq!(self.len(), src.len(), "slice length mismatch");
let src = unsafe { slice::from_raw_parts(src as *const AtomicU8, self.len()) };
for (dst, src) in self.iter_mut().zip(src) {
*dst = src.load(load_order);
}
fence(fence_order);
}
}