Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 7db7489

Browse filesBrowse 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
Copy full SHA for 7db7489

File tree

Expand file treeCollapse file tree

1 file changed

+32
-48
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+32
-48
lines changed

‎library/core/src/fmt/num.rs

Copy file name to clipboardExpand all lines: library/core/src/fmt/num.rs
+32-48Lines changed: 32 additions & 48 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.