Skip to main content

fastnum/decimal/macros/
signals.rs

1/// Macro helper for fast initializing of signals set.
2///
3/// # Examples
4///
5/// ```
6/// use fastnum::{*, decimal::*};
7///
8/// let signals = signals![!OFW, !CP];
9///
10/// assert_eq!(signals, Signals::OP_OVERFLOW.combine(Signals::OP_CLAMPED));
11/// ```
12#[macro_export]
13macro_rules! signals {
14    [ $(! $tts: tt),* ] => {{
15        const __SIGNALS: $crate::decimal::Signals = signals!(@ [$($tts),*]);
16        __SIGNALS
17    }};
18    (@ []) => {
19        $crate::decimal::Signals::EMPTY
20    };
21    (@ CP) => {
22        $crate::decimal::Signals::OP_CLAMPED
23    };
24    (@ DBZ) => {
25        $crate::decimal::Signals::OP_DIV_BY_ZERO
26    };
27    (@ INEXACT) => {
28        $crate::decimal::Signals::OP_INEXACT
29    };
30    (@ INV) => {
31        $crate::decimal::Signals::OP_INVALID
32    };
33    (@ OFW) => {
34        $crate::decimal::Signals::OP_OVERFLOW
35    };
36    (@ ROUND) => {
37        $crate::decimal::Signals::OP_ROUNDED
38    };
39    (@ SN) => {
40        $crate::decimal::Signals::OP_SUBNORMAL
41    };
42    (@ UFW) => {
43        $crate::decimal::Signals::OP_UNDERFLOW
44    };
45    (@ [$t:tt]) => {
46        signals!(@ $t)
47    };
48    (@ [$t:tt, $($tts:tt),*]) => {
49        signals!(@ $t).combine(signals!(@ [$($tts),*]))
50    };
51}