From be0782f5d28066387b9126764dd56d3fe203d8b9 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 7 Mar 2026 14:35:17 +0100 Subject: [PATCH] atomic_enum: add new utility --- src/utils.rs | 1 + src/utils/atomic_enum.rs | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/utils/atomic_enum.rs diff --git a/src/utils.rs b/src/utils.rs index 109bb822..8b0ac860 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,6 +2,7 @@ pub mod activation_token; pub mod array; pub mod array_to_tuple; pub mod asyncevent; +pub mod atomic_enum; pub mod binary_search_map; pub mod bindings; pub mod bitfield; diff --git a/src/utils/atomic_enum.rs b/src/utils/atomic_enum.rs new file mode 100644 index 00000000..5fa00a83 --- /dev/null +++ b/src/utils/atomic_enum.rs @@ -0,0 +1,43 @@ +use { + linearize::Linearize, + std::{ + marker::PhantomData, + sync::atomic::{AtomicUsize, Ordering}, + }, +}; + +pub struct AtomicEnum { + v: AtomicUsize, + _phantom: PhantomData, +} + +impl Default for AtomicEnum +where + T: Default + Linearize + Copy, +{ + fn default() -> Self { + Self::new(T::default()) + } +} + +impl AtomicEnum +where + T: Linearize + Copy, +{ + pub fn new(t: T) -> Self { + Self { + v: AtomicUsize::new(t.linearize()), + _phantom: Default::default(), + } + } + + #[expect(dead_code)] + pub fn load(&self, ordering: Ordering) -> T { + unsafe { T::from_linear_unchecked(self.v.load(ordering)) } + } + + #[expect(dead_code)] + pub fn store(&self, t: T, ordering: Ordering) { + self.v.store(t.linearize(), ordering); + } +}