use crate::digits::iter_digits;
use crate::integer::{Base, IntegerImpl};
use crate::UnsignedInteger;
use core::fmt;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct Outlined<T>(pub T);
impl<T> From<T> for Outlined<T>
where
T: UnsignedInteger,
{
fn from(value: T) -> Self {
Outlined(value)
}
}
impl<T> fmt::Binary for Outlined<T>
where
T: UnsignedInteger,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt_outlined::<_, <T::Impl as IntegerImpl>::BaseTwo>(self.0.into_impl(), f)
}
}
impl<T> fmt::Display for Outlined<T>
where
T: UnsignedInteger,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt_outlined::<_, <T::Impl as IntegerImpl>::BaseTen>(self.0.into_impl(), f)
}
}
impl<T> fmt::UpperHex for Outlined<T>
where
T: UnsignedInteger,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt_outlined::<_, <T::Impl as IntegerImpl>::BaseSixteen>(self.0.into_impl(), f)
}
}
fn fmt_outlined<T: IntegerImpl, B: Base<T>>(n: T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
iter_digits::<_, B>(n).try_for_each(|digit| write!(f, "{}", DIGITS[digit]))
}
const DIGITS: [&str; 16] = [
"\u{1CCF0}",
"\u{1CCF1}",
"\u{1CCF2}",
"\u{1CCF3}",
"\u{1CCF4}",
"\u{1CCF5}",
"\u{1CCF6}",
"\u{1CCF7}",
"\u{1CCF8}",
"\u{1CCF9}",
"\u{1CCD6}",
"\u{1CCD7}",
"\u{1CCD8}",
"\u{1CCD9}",
"\u{1CCDA}",
"\u{1CCDB}",
];