rstm_core/state/impls/
impl_ops.rs

1/*
2    Appellation: impl_ops <state>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use crate::state::State;
6
7impl<Q> core::ops::Neg for State<Q>
8where
9    Q: core::ops::Neg,
10{
11    type Output = State<Q::Output>;
12
13    fn neg(self) -> Self::Output {
14        State(core::ops::Neg::neg(self.0))
15    }
16}
17
18impl<'a, Q> core::ops::Neg for &'a State<Q>
19where
20    &'a Q: core::ops::Neg,
21{
22    type Output = State<<&'a Q as core::ops::Neg>::Output>;
23
24    fn neg(self) -> Self::Output {
25        State(core::ops::Neg::neg(self.get()))
26    }
27}
28
29impl<Q> core::ops::Not for State<Q>
30where
31    Q: core::ops::Not,
32{
33    type Output = State<Q::Output>;
34
35    fn not(self) -> Self::Output {
36        State(core::ops::Not::not(self.0))
37    }
38}
39
40impl<'a, Q> core::ops::Not for &'a State<Q>
41where
42    &'a Q: core::ops::Not,
43{
44    type Output = State<<&'a Q as core::ops::Not>::Output>;
45
46    fn not(self) -> Self::Output {
47        State(core::ops::Not::not(self.get()))
48    }
49}
50
51impl<Q> num_traits::Num for State<Q>
52where
53    Q: num_traits::Num,
54{
55    type FromStrRadixErr = Q::FromStrRadixErr;
56
57    fn from_str_radix(str: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
58        Q::from_str_radix(str, radix).map(State)
59    }
60}
61
62impl<Q> num_traits::One for State<Q>
63where
64    Q: PartialEq + num_traits::One,
65{
66    fn one() -> Self {
67        State(Q::one())
68    }
69
70    fn is_one(&self) -> bool {
71        self.0.is_one()
72    }
73}
74
75impl<Q> num_traits::Zero for State<Q>
76where
77    Q: num_traits::Zero,
78{
79    fn zero() -> Self {
80        State(Q::zero())
81    }
82
83    fn is_zero(&self) -> bool {
84        self.0.is_zero()
85    }
86}
87
88impl_assign_op! {
89    State(
90        AddAssign::add_assign,
91        SubAssign::sub_assign,
92        MulAssign::mul_assign,
93        DivAssign::div_assign,
94        RemAssign::rem_assign,
95        BitAndAssign::bitand_assign,
96        BitOrAssign::bitor_assign,
97        BitXorAssign::bitxor_assign,
98        ShlAssign::shl_assign,
99        ShrAssign::shr_assign,
100    )
101}
102
103impl_bin_op! {
104    State(
105        Add::add,
106        Sub::sub,
107        Mul::mul,
108        Div::div,
109        Rem::rem,
110        BitAnd::bitand,
111        BitOr::bitor,
112        BitXor::bitxor,
113        Shl::shl,
114        Shr::shr,
115    )
116}