Skip to main content

fastnum/decimal/context/
signal_traps.rs

1use core::fmt::{Debug, Display, Formatter};
2
3use crate::decimal::Signals;
4
5/// # SignalsTraps
6///
7/// `SignalsTraps` is a list of set trap enablers for signals.
8///  When a signal's trap enabler is set, the condition causes `panic!` in debug
9/// mode.
10#[derive(Copy, Clone, Hash, PartialEq, Eq)]
11#[repr(transparent)]
12pub struct SignalsTraps(Signals);
13
14impl SignalsTraps {
15    const EMPTY: Self = Self(Signals::EMPTY);
16    const DEFAULT: Self = Self(Signals::DEFAULT_TRAPS);
17
18    #[inline(always)]
19    pub(crate) const fn new(signals: Signals) -> Self {
20        Self(signals)
21    }
22
23    #[inline(always)]
24    pub(crate) const fn signals(&self) -> Signals {
25        self.0
26    }
27
28    /// Returns the empty list of signal traps.
29    #[inline(always)]
30    pub const fn empty() -> Self {
31        Self::EMPTY
32    }
33
34    /// Returns the default set of signal traps.
35    #[inline(always)]
36    pub const fn default() -> Self {
37        Self::DEFAULT
38    }
39
40    /// Adds the signal trap for the given signal.
41    #[inline(always)]
42    pub const fn set(mut self, signal: Signals) -> Self {
43        self.0 = self.0.set(signal);
44        self
45    }
46
47    #[inline(always)]
48    pub(crate) const fn trap(&self, raised: Signals) -> Signals {
49        self.0.intersect(raised)
50    }
51
52    #[inline(always)]
53    pub(crate) const fn merge(mut self, other: Self) -> Self {
54        self = self.set(other.0);
55        self
56    }
57}
58
59impl Display for SignalsTraps {
60    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
61        Display::fmt(&self.0, f)
62    }
63}
64
65impl Debug for SignalsTraps {
66    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
67        write!(f, "{self}")
68    }
69}