1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
    Appellation: order <mod>
    Contrib: FL03 <jo3mccain@icloud.com>
*/
use core::sync::atomic::Ordering;
use strum::{AsRefStr, Display, EnumCount, EnumIs, EnumIter, EnumString, VariantNames};

#[derive(
    AsRefStr,
    Clone,
    Copy,
    Debug,
    Default,
    Display,
    EnumCount,
    EnumIs,
    EnumIter,
    EnumString,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd,
    VariantNames,
)]
#[cfg_attr(
    feature = "serde",
    derive(serde::Deserialize, serde::Serialize),
    serde(rename_all = "snake_case", untagged)
)]
#[strum(serialize_all = "snake_case")]
pub enum AtomicOrder {
    Acquire,
    AcqRel,
    #[default]
    Relaxed,
    Release,
    SeqCst,
}

impl From<AtomicOrder> for Ordering {
    fn from(order: AtomicOrder) -> Self {
        match order {
            AtomicOrder::Acquire => Ordering::Acquire,
            AtomicOrder::AcqRel => Ordering::AcqRel,
            AtomicOrder::Relaxed => Ordering::Relaxed,
            AtomicOrder::Release => Ordering::Release,
            AtomicOrder::SeqCst => Ordering::SeqCst,
        }
    }
}

impl From<Ordering> for AtomicOrder {
    fn from(order: Ordering) -> Self {
        match order {
            Ordering::Acquire => AtomicOrder::Acquire,
            Ordering::AcqRel => AtomicOrder::AcqRel,
            Ordering::Release => AtomicOrder::Release,
            Ordering::SeqCst => AtomicOrder::SeqCst,
            _ => AtomicOrder::Relaxed,
        }
    }
}