fastnum/decimal/
context.rs1mod rounding_mode;
2mod signal_traps;
3
4pub use rounding_mode::RoundingMode;
5pub use signal_traps::SignalsTraps;
6
7use core::fmt::{Debug, Display, Formatter};
8
9use crate::utils::assert_eq_size;
10
11#[derive(Copy, Clone, Hash, Eq, PartialEq)]
17#[repr(C)]
18pub struct Context {
19 rounding_mode: RoundingMode,
20 signal_traps: SignalsTraps,
21}
22
23impl Context {
24 const DEFAULT: Self = Self {
25 rounding_mode: RoundingMode::default(),
26 signal_traps: SignalsTraps::default(),
27 };
28
29 #[inline(always)]
31 #[must_use]
32 pub const fn default() -> Self {
33 Self::DEFAULT
34 }
35
36 #[must_use]
38 #[inline(always)]
39 pub const fn with_rounding_mode(mut self, rm: RoundingMode) -> Self {
40 self.rounding_mode = rm;
41 self
42 }
43
44 #[inline(always)]
46 #[must_use]
47 pub const fn without_traps(mut self) -> Self {
48 self.signal_traps = SignalsTraps::empty();
49 self
50 }
51
52 #[must_use]
68 #[inline(always)]
69 pub const fn with_signal_traps(mut self, traps: SignalsTraps) -> Self {
70 self.signal_traps = traps;
71 self
72 }
73
74 #[must_use]
76 #[inline(always)]
77 pub const fn rounding_mode(&self) -> RoundingMode {
78 self.rounding_mode
79 }
80
81 #[must_use]
83 #[inline(always)]
84 pub const fn signal_traps(&self) -> SignalsTraps {
85 self.signal_traps
86 }
87
88 #[inline(always)]
89 pub(crate) const fn new(rounding_mode: RoundingMode, signal_traps: SignalsTraps) -> Self {
90 Self {
91 rounding_mode,
92 signal_traps,
93 }
94 }
95
96 #[inline(always)]
97 pub(crate) const fn merge(mut self, other: Self) -> Self {
98 self.signal_traps = self.signal_traps.merge(other.signal_traps);
99
100 if !other.rounding_mode.is_default() {
101 self.rounding_mode = other.rounding_mode;
102 }
103
104 self
105 }
106}
107
108impl Display for Context {
109 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
110 write!(f, "R={}, S={}", self.rounding_mode, self.signal_traps)
111 }
112}
113
114impl Debug for Context {
115 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
116 write!(f, "{self}")
117 }
118}
119
120assert_eq_size!(Context, u16);