use super::cached_float80;
use super::float::ExtendedFloat;
#[doc(hidden)]
pub(crate) struct ExtendedFloatArray {
pub mant: &'static [u64],
pub exp: &'static [i32],
}
impl ExtendedFloatArray {
#[inline]
pub fn get_extended_float(&self, index: usize) -> ExtendedFloat {
let mant = self.mant[index];
let exp = self.exp[index];
ExtendedFloat { mant, exp }
}
#[inline]
pub fn len(&self) -> usize {
self.mant.len()
}
}
#[doc(hidden)]
pub(crate) struct ModeratePathPowers {
pub small: ExtendedFloatArray,
pub large: ExtendedFloatArray,
pub small_int: &'static [u64],
pub step: i32,
pub bias: i32,
}
impl ModeratePathPowers {
#[inline]
pub fn get_small(&self, index: usize) -> ExtendedFloat {
self.small.get_extended_float(index)
}
#[inline]
pub fn get_large(&self, index: usize) -> ExtendedFloat {
self.large.get_extended_float(index)
}
#[inline]
pub fn get_small_int(&self, index: usize) -> u64 {
self.small_int[index]
}
}
pub(crate) trait ModeratePathCache {
fn get_powers() -> &'static ModeratePathPowers;
}
impl ModeratePathCache for ExtendedFloat {
#[inline]
fn get_powers() -> &'static ModeratePathPowers {
cached_float80::get_powers()
}
}