use crate::types::owner::Owner;
use crate::types::precision::Precision;
use crate::types::ptr::Ptr;
use crate::types::sign::Sign;
const MANTISSA_1: [u8; 1] = [1];
const MANTISSA_5: [u8; 1] = [5];
#[derive(Clone)]
#[must_use]
pub(crate) struct Sci {
pub(crate) sign: Sign, pub(crate) data: Ptr, pub(crate) len: isize, pub(crate) exponent: isize, pub(crate) owner: Owner,
}
impl Sci {
pub(crate) const ZERO: Sci = Sci {
sign: Sign::POSITIVE, data: Ptr::new_invalid(), len: 0, exponent: 1, owner: Owner::None,
};
pub(crate) const ONE: Sci = Sci::one(Sign::POSITIVE, 0);
pub(crate) const POINT5: Sci = Sci::nz_unchecked_static_new(Sign::POSITIVE, &MANTISSA_5, -1);
#[inline]
pub(crate) const fn one(sign: Sign, exponent: isize) -> Sci {
Sci::nz_unchecked_static_new(sign, &MANTISSA_1, exponent)
}
#[inline]
pub(crate) fn assign_one(&mut self) {
self.len = 1;
self.data = Ptr::new(&MANTISSA_1);
self.owner = Owner::None;
}
#[inline]
pub(crate) fn assign_zero(&mut self) {
self.len = 0; self.exponent = 1; self.owner = Owner::None;
}
#[inline]
pub(crate) const fn nz_unchecked_static_new(
sign: Sign,
mantissa: &'static [u8],
exponent: isize,
) -> Sci {
Sci {
sign,
data: Ptr::new(mantissa),
len: mantissa.len() as isize,
exponent,
owner: Owner::None,
}
}
#[inline]
pub(crate) fn is_zero(&self) -> bool {
self.len == 0
}
#[inline]
pub(crate) fn exponent0(&self) -> isize {
self.exponent + self.len
}
#[inline]
pub(crate) fn exponent1(&self) -> isize {
self.exponent + self.len - 1
}
#[inline]
pub(crate) fn precision_len(&self, precision: Precision) -> isize {
match precision {
Precision::Digits(digits) => digits,
Precision::Decimals(decimals) => self.exponent0() + decimals,
}
}
}