use core::fmt::{Debug, Display, Formatter};
use crate::utils::assert_eq_size;
use crate::config::*;
#[derive(Clone, Copy, Hash, PartialEq, Eq)]
#[repr(u8)]
pub enum RoundingMode {
No = 0b000,
Up = 0b001,
Down = 0b010,
Ceiling = 0b011,
Floor = 0b100,
HalfUp = 0b101,
HalfDown = 0b110,
HalfEven = 0b111, }
impl Default for RoundingMode {
#[inline(always)]
fn default() -> Self {
Self::DEFAULT
}
}
impl RoundingMode {
pub const DEFAULT: Self = DEFAULT_ROUNDING_MODE;
#[inline(always)]
pub const fn default() -> Self {
Self::DEFAULT
}
#[inline(always)]
pub const fn from_u8(val: u8) -> Option<Self> {
match val {
0b000 => Some(Self::No),
0b001 => Some(Self::Up),
0b010 => Some(Self::Down),
0b011 => Some(Self::Ceiling),
0b100 => Some(Self::Floor),
0b101 => Some(Self::HalfUp),
0b110 => Some(Self::HalfDown),
0b111 => Some(Self::HalfEven),
_ => None
}
}
pub const fn to_u8(self) -> u8 {
self as u8
}
#[inline(always)]
pub const fn is_default(&self) -> bool {
self.to_u8() == Self::DEFAULT.to_u8()
}
}
impl Display for RoundingMode {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
let rm = match self {
RoundingMode::No => "No",
RoundingMode::Up => "Up",
RoundingMode::Down => "Down",
RoundingMode::Ceiling => "Ceiling",
RoundingMode::Floor => "Floor",
RoundingMode::HalfUp => "HalfUp",
RoundingMode::HalfDown => "HalfDown",
RoundingMode::HalfEven => "HalfEven",
};
f.write_str(rm)
}
}
impl Debug for RoundingMode {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(f, "{}", self)
}
}
assert_eq_size!(RoundingMode, u8);