pub mod expanded;
use crate::{
rbig::{RBig, Relaxed},
repr::Repr,
};
use core::fmt::{self, Write};
macro_rules! impl_radix_fmt {
($trait:ident) => {
impl fmt::$trait for Repr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.denominator.is_one() {
fmt::$trait::fmt(&self.numerator, f)
} else {
fmt::$trait::fmt(&self.numerator, f)?;
f.write_char('/')?;
fmt::$trait::fmt(&self.denominator, f)
}
}
}
impl fmt::$trait for RBig {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::$trait::fmt(&self.0, f)
}
}
impl fmt::$trait for Relaxed {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::$trait::fmt(&self.0, f)
}
}
};
}
impl_radix_fmt!(Binary);
impl_radix_fmt!(Octal);
impl_radix_fmt!(LowerHex);
impl_radix_fmt!(UpperHex);
impl fmt::Debug for Repr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
f.debug_struct("Repr")
.field("numerator", &format_args!("{:#?}", self.numerator))
.field("denominator", &format_args!("{:#?}", self.denominator))
.finish()
} else {
f.write_fmt(format_args!("{:?} / {:?}", self.numerator, self.denominator))
}
}
}
impl fmt::Display for Repr {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.denominator.is_one() {
fmt::Display::fmt(&self.numerator, f)
} else {
fmt::Display::fmt(&self.numerator, f)?;
f.write_char('/')?;
fmt::Display::fmt(&self.denominator, f)
}
}
}
impl fmt::Debug for RBig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
f.debug_struct("RBig")
.field("numerator", &format_args!("{:#?}", self.numerator()))
.field("denominator", &format_args!("{:#?}", self.denominator()))
.finish()
} else {
f.write_fmt(format_args!("{:?} / {:?}", self.numerator(), self.denominator()))
}
}
}
impl fmt::Display for RBig {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
impl fmt::Debug for Relaxed {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
f.debug_struct("Relaxed")
.field("numerator", &format_args!("{:#?}", self.numerator()))
.field("denominator", &format_args!("{:#?}", self.denominator()))
.finish()
} else {
f.write_fmt(format_args!("{:?} / {:?}", self.numerator(), self.denominator()))
}
}
}
impl fmt::Display for Relaxed {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
pub struct InRadix<'a> {
numerator: &'a dashu_int::IBig,
denominator: &'a dashu_int::UBig,
radix: u8,
}
impl fmt::Display for InRadix<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let r = self.radix;
let num = self.numerator.in_radix(r);
if self.denominator.is_one() {
if f.alternate() {
write!(f, "{:#}", num)
} else {
write!(f, "{}", num)
}
} else {
let den = self.denominator.in_radix(r);
if f.alternate() {
write!(f, "{:#}/{:#}", num, den)
} else {
write!(f, "{}/{}", num, den)
}
}
}
}
impl RBig {
#[inline]
pub fn in_radix(&self, radix: u8) -> InRadix<'_> {
InRadix {
numerator: self.numerator(),
denominator: self.denominator(),
radix,
}
}
}
impl Relaxed {
#[inline]
pub fn in_radix(&self, radix: u8) -> InRadix<'_> {
InRadix {
numerator: self.numerator(),
denominator: self.denominator(),
radix,
}
}
}