Skip to content

Commit

Permalink
Use associated consts for GenericRadix base and prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
glandium committed Mar 17, 2018
1 parent 55c984e commit b910d6b
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions src/libcore/fmt/num.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,13 @@ doit! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
#[doc(hidden)]
trait GenericRadix {
/// The number of digits.
fn base(&self) -> u8;
const BASE: u8;

/// A radix-specific prefix string.
fn prefix(&self) -> &'static str {
""
}
const PREFIX: &'static str;

/// Converts an integer to corresponding radix digit.
fn digit(&self, x: u8) -> u8;
fn digit(x: u8) -> u8;

/// Format an integer using the radix using a formatter.
fn fmt_int<T: Int>(&self, mut x: T, f: &mut fmt::Formatter) -> fmt::Result {
Expand All @@ -67,14 +65,14 @@ trait GenericRadix {
let is_nonnegative = x >= zero;
let mut buf = [0; 128];
let mut curr = buf.len();
let base = T::from_u8(self.base());
let base = T::from_u8(Self::BASE);
if is_nonnegative {
// Accumulate each digit of the number from the least significant
// to the most significant figure.
for byte in buf.iter_mut().rev() {
let n = x % base; // Get the current place value.
x = x / base; // Deaccumulate the number.
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
let n = x % base; // Get the current place value.
x = x / base; // Deaccumulate the number.
*byte = Self::digit(n.to_u8()); // Store the digit in the buffer.
curr -= 1;
if x == zero {
// No more digits left to accumulate.
Expand All @@ -84,9 +82,9 @@ trait GenericRadix {
} else {
// Do the same as above, but accounting for two's complement.
for byte in buf.iter_mut().rev() {
let n = zero - (x % base); // Get the current place value.
x = x / base; // Deaccumulate the number.
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
let n = zero - (x % base); // Get the current place value.
x = x / base; // Deaccumulate the number.
*byte = Self::digit(n.to_u8()); // Store the digit in the buffer.
curr -= 1;
if x == zero {
// No more digits left to accumulate.
Expand All @@ -95,7 +93,7 @@ trait GenericRadix {
}
}
let buf = unsafe { str::from_utf8_unchecked(&buf[curr..]) };
f.pad_integral(is_nonnegative, self.prefix(), buf)
f.pad_integral(is_nonnegative, Self::PREFIX, buf)
}
}

Expand All @@ -122,12 +120,12 @@ struct UpperHex;
macro_rules! radix {
($T:ident, $base:expr, $prefix:expr, $($x:pat => $conv:expr),+) => {
impl GenericRadix for $T {
fn base(&self) -> u8 { $base }
fn prefix(&self) -> &'static str { $prefix }
fn digit(&self, x: u8) -> u8 {
const BASE: u8 = $base;
const PREFIX: &'static str = $prefix;
fn digit(x: u8) -> u8 {
match x {
$($x => $conv,)+
x => panic!("number not in the range 0..{}: {}", self.base() - 1, x),
x => panic!("number not in the range 0..{}: {}", Self::BASE - 1, x),
}
}
}
Expand Down

0 comments on commit b910d6b

Please sign in to comment.