use crate::{ConstInit, Sign};
#[doc = crate::_tags!(fmt num)]
#[doc = crate::_doc_location!("text/fmt")]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FmtNumConf {
pub sign: FmtNumSign,
pub pad_sign: bool,
pub int: u16,
pub fract: u16,
}
impl ConstInit for FmtNumConf {
const INIT: Self = FmtNumConf {
sign: FmtNumSign::INIT,
pad_sign: false,
int: 0,
fract: 0,
};
}
#[rustfmt::skip]
impl FmtNumConf {
const _SIZE: () = const { assert![size_of::<Self>() == 6]; };
#[inline(always)]
pub const fn new() -> Self { Self::INIT }
#[inline(always)]
pub const fn new_int(int: u16) -> Self { Self::INIT.with_int(int) }
#[inline(always)]
pub const fn new_float(int: u16, fract: u16) -> Self { Self::new_int(int).with_fract(fract) }
#[inline(always)]
pub const fn set_sign(&mut self, sign: FmtNumSign) { self.sign = sign }
#[inline(always)]
pub const fn with_sign(mut self, sign: FmtNumSign) -> Self { self.sign = sign; self }
#[inline(always)]
pub const fn set_pad_sign(&mut self, pad_sign: bool) { self.pad_sign = pad_sign }
#[inline(always)]
pub const fn with_pad_sign(mut self, pad_sign: bool) -> Self { self.pad_sign = pad_sign; self }
#[inline(always)]
pub const fn set_int(&mut self, int: u16) { self.int = int }
#[inline(always)]
pub const fn with_int(mut self, int: u16) -> Self { self.int = int; self }
#[inline(always)]
pub const fn set_fract(&mut self, fract: u16) { self.fract = fract }
#[inline(always)]
pub const fn with_fract(mut self, fract: u16) -> Self { self.fract = fract; self }
}
#[doc = crate::_tags!(fmt num)]
#[doc = crate::_doc_location!("text/fmt")]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum FmtNumSign {
#[default]
NegativeOnly,
Always,
Never,
PositiveOnly,
}
impl ConstInit for FmtNumSign {
const INIT: Self = FmtNumSign::NegativeOnly;
}
impl FmtNumSign {
pub const fn from_quant(sign: Sign) -> Self {
match sign {
Sign::Negative => Self::NegativeOnly,
Sign::Zero | Sign::Positive => Self::PositiveOnly,
}
}
pub const fn emit_sign(&self, is_negative: bool) -> bool {
match self {
Self::NegativeOnly => is_negative,
Self::Always => true,
Self::Never => false,
Self::PositiveOnly => !is_negative,
}
}
}