stm32f1_hal/common/
atomic_cell.rs1use core::{marker::PhantomData, sync::atomic::AtomicUsize};
2
3pub use core::sync::atomic::Ordering;
4
5pub struct AtomicCell<M: AtomicCellMember> {
6 value: AtomicUsize,
7 _m: PhantomData<M>,
8}
9
10unsafe impl<M: AtomicCellMember> Send for AtomicCell<M> {}
11unsafe impl<M: AtomicCellMember> Sync for AtomicCell<M> {}
12
13impl<M: AtomicCellMember> AtomicCell<M> {
14 pub fn new(value: M) -> Self {
15 Self {
16 value: AtomicUsize::new(value.to_num()),
17 _m: PhantomData,
18 }
19 }
20
21 pub const fn const_new(value: usize) -> Self {
22 Self {
23 value: AtomicUsize::new(value),
24 _m: PhantomData,
25 }
26 }
27
28 #[inline]
29 pub fn load(&self, order: Ordering) -> M {
30 unsafe { M::from_num(self.value.load(order)) }
31 }
32
33 #[inline]
34 pub fn store(&self, value: M, order: Ordering) {
35 self.value.store(value.to_num(), order);
36 }
37}
38
39pub trait AtomicCellMember: Copy {
40 fn to_num(self) -> usize;
41 unsafe fn from_num(value: usize) -> Self;
45}