@@ -199,32 +199,12 @@ static DEC_DIGITS_LUT: &[u8; 200] = b"0001020304050607080910111213141516171819\
199
199
8081828384858687888990919293949596979899";
200
200
201
201
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) => {
203
203
204
204
$(
205
205
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
206
- impl fmt:: Display for $t {
206
+ impl fmt:: Display for $unsigned {
207
207
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.
228
208
#[ cfg( not( feature = "optimize_for_size" ) ) ]
229
209
{
230
210
self . _fmt( true , f)
@@ -236,10 +216,24 @@ macro_rules! impl_Display {
236
216
}
237
217
}
238
218
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
+
239
233
#[ 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 ;
243
237
let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; SIZE ] ;
244
238
let mut curr = SIZE ;
245
239
let buf_ptr = MaybeUninit :: slice_as_mut_ptr( & mut buf) ;
@@ -258,7 +252,7 @@ macro_rules! impl_Display {
258
252
#[ allow( unused_comparisons) ]
259
253
// This block will be removed for smaller types at compile time and in the worst
260
254
// 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 {
262
256
// eagerly decode 4 characters at a time
263
257
while self >= 10000 {
264
258
let rem = ( self % 10000 ) as usize ;
@@ -312,8 +306,8 @@ macro_rules! impl_Display {
312
306
313
307
#[ cfg( feature = "optimize_for_size" ) ]
314
308
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 ] ;
317
311
let mut curr = buf. len( ) ;
318
312
let buf_ptr = MaybeUninit :: slice_as_mut_ptr( & mut buf) ;
319
313
@@ -523,16 +517,11 @@ impl_Debug! {
523
517
mod imp {
524
518
use super :: * ;
525
519
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 ,
536
525
; as u64 via to_u64 named fmt_u64
537
526
) ;
538
527
impl_Exp ! (
@@ -545,18 +534,13 @@ mod imp {
545
534
mod imp {
546
535
use super :: * ;
547
536
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 ,
556
541
; as u32 via to_u32 named fmt_u32) ;
557
542
impl_Display ! (
558
- i64 as u64 named fmt_i64,
559
- u64 named fmt_u64,
543
+ i64 , u64 ,
560
544
; as u64 via to_u64 named fmt_u64) ;
561
545
562
546
impl_Exp ! ( i8 , u8 , i16 , u16 , i32 , u32 , isize , usize as u32 via to_u32 named exp_u32) ;
0 commit comments