Skip to content

Commit

Permalink
Rollup merge of rust-lang#49099 - glandium:master, r=sfackler
Browse files Browse the repository at this point in the history
Use associated consts for GenericRadix base and prefix

The trait being private, this does not imply an API change.
  • Loading branch information
kennytm committed Mar 19, 2018
2 parents 23e2e3a + b910d6b commit 63ab361
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 63ab361

Please sign in to comment.