Skip to content

Commit f74b38a

Browse files
Reduce integer Display implementation size
1 parent 607b493 commit f74b38a

File tree

1 file changed

+41
-41
lines changed

1 file changed

+41
-41
lines changed

core/src/fmt/num.rs

+41-41
Original file line numberDiff line numberDiff line change
@@ -199,35 +199,45 @@ static DEC_DIGITS_LUT: &[u8; 200] = b"0001020304050607080910111213141516171819\
199199
8081828384858687888990919293949596979899";
200200

201201
macro_rules! impl_Display {
202-
($($t:ident $(as $positive:ident)? named $name:ident,)* ; as $u:ident via $conv_fn:ident named $gen_name:ident) => {
202+
($($signed:ident, $unsigned:ident,)* ; as $u:ident via $conv_fn:ident named $gen_name:ident) => {
203203

204204
$(
205205
#[stable(feature = "rust1", since = "1.0.0")]
206-
impl fmt::Display for $t {
206+
impl fmt::Display for $unsigned {
207207
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208-
// If it's a signed integer.
209-
$(
210-
let is_nonnegative = *self >= 0;
208+
#[cfg(not(feature = "optimize_for_size"))]
209+
{
210+
self._fmt(true, f)
211+
}
212+
#[cfg(feature = "optimize_for_size")]
213+
{
214+
$gen_name(self.$conv_fn(), true, f)
215+
}
216+
}
217+
}
211218

219+
#[stable(feature = "rust1", since = "1.0.0")]
220+
impl fmt::Display for $signed {
221+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
222+
let is_nonnegative = *self >= 0;
223+
224+
if !is_nonnegative {
212225
#[cfg(not(feature = "optimize_for_size"))]
213226
{
214-
if !is_nonnegative {
215-
// convert the negative num to positive by summing 1 to its 2s complement
216-
return (!self as $positive).wrapping_add(1)._fmt(false, f);
217-
}
227+
// convert the negative num to positive by summing 1 to its 2s complement
228+
return (!self as $unsigned).wrapping_add(1)._fmt(false, f);
218229
}
219230
#[cfg(feature = "optimize_for_size")]
220231
{
221-
if !is_nonnegative {
222-
// convert the negative num to positive by summing 1 to its 2s complement
223-
return $gen_name((!self.$conv_fn()).wrapping_add(1), false, f);
224-
}
232+
// convert the negative num to positive by summing 1 to its 2s complement
233+
return $gen_name((!self.$conv_fn()).wrapping_add(1), false, f);
225234
}
226-
)?
235+
}
236+
227237
// If it's a positive integer.
228238
#[cfg(not(feature = "optimize_for_size"))]
229239
{
230-
self._fmt(true, f)
240+
(*self as $unsigned)._fmt(true, f)
231241
}
232242
#[cfg(feature = "optimize_for_size")]
233243
{
@@ -237,9 +247,9 @@ macro_rules! impl_Display {
237247
}
238248

239249
#[cfg(not(feature = "optimize_for_size"))]
240-
impl $t {
241-
fn _fmt(mut self: $t, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
242-
const SIZE: usize = $t::MAX.ilog(10) as usize + 1;
250+
impl $unsigned {
251+
fn _fmt(mut self, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
252+
const SIZE: usize = $unsigned::MAX.ilog(10) as usize + 1;
243253
let mut buf = [MaybeUninit::<u8>::uninit(); SIZE];
244254
let mut curr = SIZE;
245255
let buf_ptr = MaybeUninit::slice_as_mut_ptr(&mut buf);
@@ -258,7 +268,7 @@ macro_rules! impl_Display {
258268
#[allow(unused_comparisons)]
259269
// This block will be removed for smaller types at compile time and in the worst
260270
// case, it will prevent to have the `10000` literal to overflow for `i8` and `u8`.
261-
if core::mem::size_of::<$t>() >= 2 {
271+
if core::mem::size_of::<$unsigned>() >= 2 {
262272
// eagerly decode 4 characters at a time
263273
while self >= 10000 {
264274
let rem = (self % 10000) as usize;
@@ -312,8 +322,8 @@ macro_rules! impl_Display {
312322

313323
#[cfg(feature = "optimize_for_size")]
314324
fn $gen_name(mut n: $u, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
315-
// 2^128 is about 3*10^38, so 39 gives an extra byte of space
316-
let mut buf = [MaybeUninit::<u8>::uninit(); 39];
325+
const SIZE: usize = $u::MAX.ilog(10) as usize + 1;
326+
let mut buf = [MaybeUninit::<u8>::uninit(); SIZE];
317327
let mut curr = buf.len();
318328
let buf_ptr = MaybeUninit::slice_as_mut_ptr(&mut buf);
319329

@@ -523,16 +533,11 @@ impl_Debug! {
523533
mod imp {
524534
use super::*;
525535
impl_Display!(
526-
i8 as u8 named fmt_i8,
527-
u8 named fmt_u8,
528-
i16 as u16 named fmt_i16,
529-
u16 named fmt_u16,
530-
i32 as u32 named fmt_i32,
531-
u32 named fmt_u32,
532-
i64 as u64 named fmt_i64,
533-
u64 named fmt_u64,
534-
isize as usize named fmt_isize,
535-
usize named fmt_usize,
536+
i8, u8,
537+
i16, u16,
538+
i32, u32,
539+
i64, u64,
540+
isize, usize,
536541
; as u64 via to_u64 named fmt_u64
537542
);
538543
impl_Exp!(
@@ -545,18 +550,13 @@ mod imp {
545550
mod imp {
546551
use super::*;
547552
impl_Display!(
548-
i8 as u8 named fmt_i8,
549-
u8 named fmt_u8,
550-
i16 as u16 named fmt_i16,
551-
u16 named fmt_u16,
552-
i32 as u32 named fmt_i32,
553-
u32 named fmt_u32,
554-
isize as usize named fmt_isize,
555-
usize named fmt_usize,
553+
i8, u8,
554+
i16, u16,
555+
i32, u32,
556+
isize, usize,
556557
; as u32 via to_u32 named fmt_u32);
557558
impl_Display!(
558-
i64 as u64 named fmt_i64,
559-
u64 named fmt_u64,
559+
i64, u64,
560560
; as u64 via to_u64 named fmt_u64);
561561

562562
impl_Exp!(i8, u8, i16, u16, i32, u32, isize, usize as u32 via to_u32 named exp_u32);

0 commit comments

Comments
 (0)