@@ -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