Skip to content

Commit 7db7489

Browse files
committed
Auto merge of rust-lang#133247 - GuillaumeGomez:reduce-integer-display-impl, r=workingjubilee
Reduce integer `Display` implementation size I was thinking about rust-lang#128204 and how we could reduce the size of the code and just realized that we didn't need the `_fmt` method to be implemented on signed integers, which in turns allow to simplify greatly the macro call. r? `@workingjubilee`
2 parents 1278dad + 0d4b52f commit 7db7489

File tree

1 file changed

+32
-48
lines changed

1 file changed

+32
-48
lines changed

library/core/src/fmt/num.rs

+32-48
Original file line numberDiff line numberDiff line change
@@ -199,32 +199,12 @@ 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;
211-
212-
#[cfg(not(feature = "optimize_for_size"))]
213-
{
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-
}
218-
}
219-
#[cfg(feature = "optimize_for_size")]
220-
{
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-
}
225-
}
226-
)?
227-
// If it's a positive integer.
228208
#[cfg(not(feature = "optimize_for_size"))]
229209
{
230210
self._fmt(true, f)
@@ -236,10 +216,24 @@ macro_rules! impl_Display {
236216
}
237217
}
238218

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+
#[cfg(not(feature = "optimize_for_size"))]
223+
{
224+
return self.unsigned_abs()._fmt(*self >= 0, f);
225+
}
226+
#[cfg(feature = "optimize_for_size")]
227+
{
228+
return $gen_name(self.unsigned_abs().$conv_fn(), *self >= 0, f);
229+
}
230+
}
231+
}
232+
239233
#[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;
234+
impl $unsigned {
235+
fn _fmt(mut self, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
236+
const SIZE: usize = $unsigned::MAX.ilog(10) as usize + 1;
243237
let mut buf = [MaybeUninit::<u8>::uninit(); SIZE];
244238
let mut curr = SIZE;
245239
let buf_ptr = MaybeUninit::slice_as_mut_ptr(&mut buf);
@@ -258,7 +252,7 @@ macro_rules! impl_Display {
258252
#[allow(unused_comparisons)]
259253
// This block will be removed for smaller types at compile time and in the worst
260254
// case, it will prevent to have the `10000` literal to overflow for `i8` and `u8`.
261-
if core::mem::size_of::<$t>() >= 2 {
255+
if core::mem::size_of::<$unsigned>() >= 2 {
262256
// eagerly decode 4 characters at a time
263257
while self >= 10000 {
264258
let rem = (self % 10000) as usize;
@@ -312,8 +306,8 @@ macro_rules! impl_Display {
312306

313307
#[cfg(feature = "optimize_for_size")]
314308
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];
309+
const SIZE: usize = $u::MAX.ilog(10) as usize + 1;
310+
let mut buf = [MaybeUninit::<u8>::uninit(); SIZE];
317311
let mut curr = buf.len();
318312
let buf_ptr = MaybeUninit::slice_as_mut_ptr(&mut buf);
319313

@@ -523,16 +517,11 @@ impl_Debug! {
523517
mod imp {
524518
use super::*;
525519
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,
520+
i8, u8,
521+
i16, u16,
522+
i32, u32,
523+
i64, u64,
524+
isize, usize,
536525
; as u64 via to_u64 named fmt_u64
537526
);
538527
impl_Exp!(
@@ -545,18 +534,13 @@ mod imp {
545534
mod imp {
546535
use super::*;
547536
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,
537+
i8, u8,
538+
i16, u16,
539+
i32, u32,
540+
isize, usize,
556541
; as u32 via to_u32 named fmt_u32);
557542
impl_Display!(
558-
i64 as u64 named fmt_i64,
559-
u64 named fmt_u64,
543+
i64, u64,
560544
; as u64 via to_u64 named fmt_u64);
561545

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

0 commit comments

Comments
 (0)