stm32f1_hal/common/
atomic_cell.rs

1use 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    /// # Safety
42    ///
43    /// Be careful about the range of the value.
44    unsafe fn from_num(value: usize) -> Self;
45}