33use crate :: fmt:: NumBuffer ;
44use crate :: mem:: MaybeUninit ;
55use crate :: num:: fmt as numfmt;
6- use crate :: ops:: { Div , Rem , Sub } ;
76use crate :: { fmt, ptr, slice, str} ;
87
9- #[ doc( hidden) ]
10- trait DisplayInt :
11- PartialEq + PartialOrd + Div < Output = Self > + Rem < Output = Self > + Sub < Output = Self > + Copy
12- {
13- #[ cfg( not( any( target_pointer_width = "64" , target_arch = "wasm32" ) ) ) ]
14- fn to_u32 ( & self ) -> u32 ;
15- fn to_u64 ( & self ) -> u64 ;
16- fn to_u128 ( & self ) -> u128 ;
17- }
18-
19- macro_rules! impl_int {
20- ( $( $t: ident) * ) => (
21- $( impl DisplayInt for $t {
22- #[ cfg( not( any( target_pointer_width = "64" , target_arch = "wasm32" ) ) ) ]
23- fn to_u32( & self ) -> u32 { * self as u32 }
24- fn to_u64( & self ) -> u64 { * self as u64 }
25- fn to_u128( & self ) -> u128 { * self as u128 }
26- } ) *
27- )
28- }
29-
30- impl_int ! {
31- i8 i16 i32 i64 i128 isize
32- u8 u16 u32 u64 u128 usize
33- }
34-
358// Formatting of integers with a non-decimal radix.
369macro_rules! radix_integer {
3710 ( fmt:: $Trait: ident for $Signed: ident and $Unsigned: ident, $prefix: expr, $dig_tab: expr) => {
@@ -157,49 +130,49 @@ unsafe fn slice_buffer_to_str(buf: &[MaybeUninit<u8>], offset: usize) -> &str {
157130}
158131
159132macro_rules! impl_Display {
160- ( $( $signed : ident, $unsigned : ident, ) * ; as $u : ident via $conv_fn : ident named $gen_name : ident) => {
133+ ( $( $Signed : ident, $Unsigned : ident) , * ; as $T : ident into $fmt_fn : ident) => {
161134
162135 $(
163136 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
164- impl fmt:: Display for $unsigned {
137+ impl fmt:: Display for $Unsigned {
165138 fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
166139 #[ cfg( not( feature = "optimize_for_size" ) ) ]
167140 {
168- const MAX_DEC_N : usize = $unsigned :: MAX . ilog10( ) as usize + 1 ;
169- // Buffer decimals for $unsigned with right alignment.
141+ const MAX_DEC_N : usize = $Unsigned :: MAX . ilog10( ) as usize + 1 ;
142+ // Buffer decimals for self with right alignment.
170143 let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; MAX_DEC_N ] ;
171144
172145 // SAFETY: `buf` is always big enough to contain all the digits.
173146 unsafe { f. pad_integral( true , "" , self . _fmt( & mut buf) ) }
174147 }
175148 #[ cfg( feature = "optimize_for_size" ) ]
176149 {
177- $gen_name ( self . $conv_fn ( ) , true , f)
150+ $fmt_fn ( self as $T , true , f)
178151 }
179152 }
180153 }
181154
182155 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
183- impl fmt:: Display for $signed {
156+ impl fmt:: Display for $Signed {
184157 fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
185158 #[ cfg( not( feature = "optimize_for_size" ) ) ]
186159 {
187- const MAX_DEC_N : usize = $unsigned :: MAX . ilog10( ) as usize + 1 ;
188- // Buffer decimals for $unsigned with right alignment.
160+ const MAX_DEC_N : usize = $Unsigned :: MAX . ilog10( ) as usize + 1 ;
161+ // Buffer decimals for self with right alignment.
189162 let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; MAX_DEC_N ] ;
190163
191164 // SAFETY: `buf` is always big enough to contain all the digits.
192165 unsafe { f. pad_integral( * self >= 0 , "" , self . unsigned_abs( ) . _fmt( & mut buf) ) }
193166 }
194167 #[ cfg( feature = "optimize_for_size" ) ]
195168 {
196- return $gen_name ( self . unsigned_abs( ) . $conv_fn ( ) , * self >= 0 , f) ;
169+ return $fmt_fn ( self . unsigned_abs( ) as $T , * self >= 0 , f) ;
197170 }
198171 }
199172 }
200173
201174 #[ cfg( not( feature = "optimize_for_size" ) ) ]
202- impl $unsigned {
175+ impl $Unsigned {
203176 #[ doc( hidden) ]
204177 #[ unstable(
205178 feature = "fmt_internals" ,
@@ -279,7 +252,7 @@ macro_rules! impl_Display {
279252 }
280253 }
281254
282- impl $signed {
255+ impl $Signed {
283256 /// Allows users to write an integer (in signed decimal format) into a variable `buf` of
284257 /// type [`NumBuffer`] that is passed by the caller by mutable reference.
285258 ///
@@ -310,7 +283,7 @@ macro_rules! impl_Display {
310283 }
311284 #[ cfg( feature = "optimize_for_size" ) ]
312285 {
313- offset = _inner_slow_integer_to_str( self . unsigned_abs( ) . $conv_fn ( ) , & mut buf. buf) ;
286+ offset = _inner_slow_integer_to_str( self . unsigned_abs( ) as $T , & mut buf. buf) ;
314287 }
315288 // Only difference between signed and unsigned are these 4 lines.
316289 if self < 0 {
@@ -322,7 +295,7 @@ macro_rules! impl_Display {
322295 }
323296 }
324297
325- impl $unsigned {
298+ impl $Unsigned {
326299 /// Allows users to write an integer (in signed decimal format) into a variable `buf` of
327300 /// type [`NumBuffer`] that is passed by the caller by mutable reference.
328301 ///
@@ -332,15 +305,15 @@ macro_rules! impl_Display {
332305 /// #![feature(int_format_into)]
333306 /// use core::fmt::NumBuffer;
334307 ///
335- #[ doc = concat!( "let n = 0" , stringify!( $unsigned ) , ";" ) ]
308+ #[ doc = concat!( "let n = 0" , stringify!( $Unsigned ) , ";" ) ]
336309 /// let mut buf = NumBuffer::new();
337310 /// assert_eq!(n.format_into(&mut buf), "0");
338311 ///
339- #[ doc = concat!( "let n1 = 32" , stringify!( $unsigned ) , ";" ) ]
312+ #[ doc = concat!( "let n1 = 32" , stringify!( $Unsigned ) , ";" ) ]
340313 /// assert_eq!(n1.format_into(&mut buf), "32");
341314 ///
342- #[ doc = concat!( "let n2 = " , stringify!( $unsigned :: MAX ) , ";" ) ]
343- #[ doc = concat!( "assert_eq!(n2.format_into(&mut buf), " , stringify!( $unsigned :: MAX ) , ".to_string());" ) ]
315+ #[ doc = concat!( "let n2 = " , stringify!( $Unsigned :: MAX ) , ";" ) ]
316+ #[ doc = concat!( "assert_eq!(n2.format_into(&mut buf), " , stringify!( $Unsigned :: MAX ) , ".to_string());" ) ]
344317 /// ```
345318 #[ unstable( feature = "int_format_into" , issue = "138215" ) ]
346319 pub fn format_into( self , buf: & mut NumBuffer <Self >) -> & str {
@@ -353,7 +326,7 @@ macro_rules! impl_Display {
353326 }
354327 #[ cfg( feature = "optimize_for_size" ) ]
355328 {
356- offset = _inner_slow_integer_to_str( self . $conv_fn ( ) , & mut buf. buf) ;
329+ offset = _inner_slow_integer_to_str( * self as $T , & mut buf. buf) ;
357330 }
358331 // SAFETY: Starting from `offset`, all elements of the slice have been set.
359332 unsafe { slice_buffer_to_str( & buf. buf, offset) }
@@ -364,7 +337,7 @@ macro_rules! impl_Display {
364337 ) *
365338
366339 #[ cfg( feature = "optimize_for_size" ) ]
367- fn _inner_slow_integer_to_str( mut n: $u , buf: & mut [ MaybeUninit :: <u8 >] ) -> usize {
340+ fn _inner_slow_integer_to_str( mut n: $T , buf: & mut [ MaybeUninit :: <u8 >] ) -> usize {
368341 let mut curr = buf. len( ) ;
369342
370343 // SAFETY: To show that it's OK to copy into `buf_ptr`, notice that at the beginning
@@ -385,8 +358,8 @@ macro_rules! impl_Display {
385358 }
386359
387360 #[ cfg( feature = "optimize_for_size" ) ]
388- fn $gen_name ( n: $u , is_nonnegative: bool , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
389- const MAX_DEC_N : usize = $u :: MAX . ilog( 10 ) as usize + 1 ;
361+ fn $fmt_fn ( n: $T , is_nonnegative: bool , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
362+ const MAX_DEC_N : usize = $T :: MAX . ilog( 10 ) as usize + 1 ;
390363 let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; MAX_DEC_N ] ;
391364
392365 let offset = _inner_slow_integer_to_str( n, & mut buf) ;
@@ -398,9 +371,9 @@ macro_rules! impl_Display {
398371}
399372
400373macro_rules! impl_Exp {
401- ( $( $t : ident) , * as $u : ident via $conv_fn : ident named $name : ident) => {
402- fn $name (
403- mut n: $u ,
374+ ( $( $Signed : ident, $Unsigned : ident) , * ; as $T : ident into $fmt_fn : ident) => {
375+ fn $fmt_fn (
376+ mut n: $T ,
404377 is_nonnegative: bool ,
405378 upper: bool ,
406379 f: & mut fmt:: Formatter <' _>
@@ -534,32 +507,41 @@ macro_rules! impl_Exp {
534507
535508 $(
536509 #[ stable( feature = "integer_exp_format" , since = "1.42.0" ) ]
537- impl fmt:: LowerExp for $t {
538- #[ allow( unused_comparisons) ]
510+ impl fmt:: LowerExp for $Signed {
539511 fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
540512 let is_nonnegative = * self >= 0 ;
541513 let n = if is_nonnegative {
542- self . $conv_fn ( )
514+ * self as $T
543515 } else {
544- // convert the negative num to positive by summing 1 to its 2s complement
545- ( !self . $conv_fn( ) ) . wrapping_add( 1 )
516+ self . unsigned_abs( ) as $T
546517 } ;
547- $name( n, is_nonnegative, false , f)
518+ $fmt_fn( n, is_nonnegative, false , f)
519+ }
520+ }
521+ #[ stable( feature = "integer_exp_format" , since = "1.42.0" ) ]
522+ impl fmt:: LowerExp for $Unsigned {
523+ fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
524+ $fmt_fn( * self as $T, true , false , f)
548525 }
549526 } ) *
527+
550528 $(
551529 #[ stable( feature = "integer_exp_format" , since = "1.42.0" ) ]
552- impl fmt:: UpperExp for $t {
553- #[ allow( unused_comparisons) ]
530+ impl fmt:: UpperExp for $Signed {
554531 fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
555532 let is_nonnegative = * self >= 0 ;
556533 let n = if is_nonnegative {
557- self . $conv_fn ( )
534+ * self as $T
558535 } else {
559- // convert the negative num to positive by summing 1 to its 2s complement
560- ( !self . $conv_fn( ) ) . wrapping_add( 1 )
536+ self . unsigned_abs( ) as $T
561537 } ;
562- $name( n, is_nonnegative, true , f)
538+ $fmt_fn( n, is_nonnegative, true , f)
539+ }
540+ }
541+ #[ stable( feature = "integer_exp_format" , since = "1.42.0" ) ]
542+ impl fmt:: UpperExp for $Unsigned {
543+ fn fmt( & self , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
544+ $fmt_fn( * self as $T, true , true , f)
563545 }
564546 } ) *
565547 } ;
@@ -575,37 +557,20 @@ impl_Debug! {
575557#[ cfg( any( target_pointer_width = "64" , target_arch = "wasm32" ) ) ]
576558mod imp {
577559 use super :: * ;
578- impl_Display ! (
579- i8 , u8 ,
580- i16 , u16 ,
581- i32 , u32 ,
582- i64 , u64 ,
583- isize , usize ,
584- ; as u64 via to_u64 named fmt_u64
585- ) ;
586- impl_Exp ! (
587- i8 , u8 , i16 , u16 , i32 , u32 , i64 , u64 , usize , isize
588- as u64 via to_u64 named exp_u64
589- ) ;
560+ impl_Display ! ( i8 , u8 , i16 , u16 , i32 , u32 , i64 , u64 , isize , usize ; as u64 into fmt_u64) ;
561+ impl_Exp ! ( i8 , u8 , i16 , u16 , i32 , u32 , i64 , u64 , isize , usize ; as u64 into exp_u64) ;
590562}
591563
592564#[ cfg( not( any( target_pointer_width = "64" , target_arch = "wasm32" ) ) ) ]
593565mod imp {
594566 use super :: * ;
595- impl_Display ! (
596- i8 , u8 ,
597- i16 , u16 ,
598- i32 , u32 ,
599- isize , usize ,
600- ; as u32 via to_u32 named fmt_u32) ;
601- impl_Display ! (
602- i64 , u64 ,
603- ; as u64 via to_u64 named fmt_u64) ;
604-
605- impl_Exp ! ( i8 , u8 , i16 , u16 , i32 , u32 , isize , usize as u32 via to_u32 named exp_u32) ;
606- impl_Exp ! ( i64 , u64 as u64 via to_u64 named exp_u64) ;
567+ impl_Display ! ( i8 , u8 , i16 , u16 , i32 , u32 , isize , usize ; as u32 into fmt_u32) ;
568+ impl_Display ! ( i64 , u64 , ; as u64 into fmt_u64) ;
569+
570+ impl_Exp ! ( i8 , u8 , i16 , u16 , i32 , u32 , isize , usize ; as u32 into exp_u32) ;
571+ impl_Exp ! ( i64 , u64 ; as u64 into exp_u64) ;
607572}
608- impl_Exp ! ( i128 , u128 as u128 via to_u128 named exp_u128) ;
573+ impl_Exp ! ( i128 , u128 ; as u128 into exp_u128) ;
609574
610575const U128_MAX_DEC_N : usize = u128:: MAX . ilog10 ( ) as usize + 1 ;
611576
0 commit comments