@@ -199,35 +199,41 @@ static DEC_DIGITS_LUT: &[u8; 200] = b"0001020304050607080910111213141516171819\
199199       8081828384858687888990919293949596979899"; 
200200
201201macro_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+                 if  * self  < 0  { 
212223                    #[ cfg( not( feature = "optimize_for_size" ) ) ] 
213224                    { 
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-                         } 
225+                         return  ( self . wrapping_neg( )  as  $unsigned) . _fmt( false ,  f) ; 
218226                    } 
219227                    #[ cfg( feature = "optimize_for_size" ) ] 
220228                    { 
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-                         } 
229+                         return  $gen_name( self . wrapping_neg( ) . $conv_fn( ) ,  false ,  f) ; 
225230                    } 
226-                 ) ?
231+                 } 
232+ 
227233                // If it's a positive integer. 
228234                #[ cfg( not( feature = "optimize_for_size" ) ) ] 
229235                { 
230-                     self . _fmt( true ,  f) 
236+                     ( * self   as  $unsigned ) . _fmt( true ,  f) 
231237                } 
232238                #[ cfg( feature = "optimize_for_size" ) ] 
233239                { 
@@ -237,9 +243,9 @@ macro_rules! impl_Display {
237243        } 
238244
239245        #[ 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 ; 
246+         impl  $unsigned  { 
247+             fn  _fmt( mut  self ,  is_nonnegative:  bool ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
248+                 const  SIZE :  usize  = $unsigned :: MAX . ilog( 10 )  as  usize  + 1 ; 
243249                let  mut  buf = [ MaybeUninit :: <u8 >:: uninit( ) ;  SIZE ] ; 
244250                let  mut  curr = SIZE ; 
245251                let  buf_ptr = MaybeUninit :: slice_as_mut_ptr( & mut  buf) ; 
@@ -258,7 +264,7 @@ macro_rules! impl_Display {
258264                    #[ allow( unused_comparisons) ] 
259265                    // This block will be removed for smaller types at compile time and in the worst 
260266                    // case, it will prevent to have the `10000` literal to overflow for `i8` and `u8`. 
261-                     if  core:: mem:: size_of:: <$t >( )  >= 2  { 
267+                     if  core:: mem:: size_of:: <$unsigned >( )  >= 2  { 
262268                        // eagerly decode 4 characters at a time 
263269                        while  self  >= 10000  { 
264270                            let  rem = ( self  % 10000 )  as  usize ; 
@@ -312,8 +318,8 @@ macro_rules! impl_Display {
312318
313319        #[ cfg( feature = "optimize_for_size" ) ] 
314320        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 ] ; 
321+             const   SIZE :   usize  = $u :: MAX . ilog ( 10 )   as   usize  +  1 ; 
322+             let  mut  buf = [ MaybeUninit :: <u8 >:: uninit( ) ;  SIZE ] ; 
317323            let  mut  curr = buf. len( ) ; 
318324            let  buf_ptr = MaybeUninit :: slice_as_mut_ptr( & mut  buf) ; 
319325
@@ -523,16 +529,11 @@ impl_Debug! {
523529mod  imp { 
524530    use  super :: * ; 
525531    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, 
532+         i8 ,  u8 , 
533+         i16 ,  u16 , 
534+         i32 ,  u32 , 
535+         i64 ,  u64 , 
536+         isize ,  usize , 
536537        ;  as  u64  via to_u64 named fmt_u64
537538    ) ; 
538539    impl_Exp ! ( 
@@ -545,18 +546,13 @@ mod imp {
545546mod  imp { 
546547    use  super :: * ; 
547548    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, 
549+         i8 ,  u8 , 
550+         i16 ,  u16 , 
551+         i32 ,  u32 , 
552+         isize ,  usize , 
556553        ;  as  u32  via to_u32 named fmt_u32) ; 
557554    impl_Display ! ( 
558-         i64  as  u64  named fmt_i64, 
559-         u64  named fmt_u64, 
555+         i64 ,  u64 , 
560556        ;  as  u64  via to_u64 named fmt_u64) ; 
561557
562558    impl_Exp ! ( i8 ,  u8 ,  i16 ,  u16 ,  i32 ,  u32 ,  isize ,  usize  as  u32  via to_u32 named exp_u32) ; 
0 commit comments