11use core:: fmt:: { Display , Formatter , Result } ;
2+ use core:: num:: NonZeroU128 ;
23
34#[ allow( missing_debug_implementations) ]
45pub struct DisplayWrapper < T > ( pub T ) ;
@@ -55,32 +56,6 @@ impl Display for DisplayWrapper<*mut ()> {
5556 }
5657}
5758
58- #[ inline]
59- fn format_ptr ( addr : usize , f : & mut Formatter < ' _ > ) -> Result {
60- const HEX : [ u8 ; 16 ] = * b"0123456789abcdef" ;
61- let mut buf = [ 0u8 ; 42 ] ;
62- let mut cur = buf. len ( ) ;
63-
64- let mut n = addr;
65- while n >= 16 {
66- let d = n % 16 ;
67- n /= 16 ;
68- cur -= 1 ;
69- buf[ cur] = HEX [ d] ;
70- }
71- cur -= 1 ;
72- buf[ cur] = HEX [ n] ;
73-
74- cur -= 1 ;
75- buf[ cur] = b'x' ;
76- cur -= 1 ;
77- buf[ cur] = b'0' ;
78-
79- // SAFETY: The buffer is initially ASCII and we only write ASCII bytes to it.
80- let s = unsafe { core:: str:: from_utf8_unchecked ( & buf[ cur..] ) } ;
81- f. write_str ( s)
82- }
83-
8459impl Display for DisplayWrapper < char > {
8560 #[ inline]
8661 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> Result {
@@ -101,22 +76,43 @@ impl Display for DisplayWrapper<bool> {
10176 }
10277}
10378
79+ const ALPHABET : & [ u8 ; 16 ] = b"0123456789abcdef" ;
80+
10481#[ inline]
105- fn display_int ( mut n : u128 , is_negative : bool , f : & mut Formatter < ' _ > ) -> Result {
106- let mut buf = [ 0u8 ; 42 ] ;
82+ fn format_with_radix ( mut n : u128 , buf : & mut [ u8 ] , radix : NonZeroU128 ) -> usize {
10783 let mut cur = buf. len ( ) ;
108-
109- while n >= 10 {
110- let d = n % 10 ;
111- n /= 10 ;
112- cur -= 1 ;
113- buf[ cur] = ( d as u8 ) + b'0' ;
84+ while n >= radix. get ( ) {
85+ let d = n % radix;
86+ n /= radix;
87+ cur = cur. wrapping_sub ( 1 ) ;
88+ buf[ cur] = ALPHABET [ d as usize ] ;
11489 }
115- cur -= 1 ;
116- buf[ cur] = ( n as u8 ) + b'0' ;
90+ cur = cur. wrapping_sub ( 1 ) ;
91+ buf[ cur] = ALPHABET [ n as usize ] ;
92+ cur
93+ }
94+
95+ #[ inline]
96+ pub fn format_ptr ( addr : usize , f : & mut Formatter < ' _ > ) -> Result {
97+ let mut buf = [ b'0' ; 42 ] ;
98+ let mut cur =
99+ format_with_radix ( addr as u128 , & mut buf, const { NonZeroU128 :: new ( 16 ) . unwrap ( ) } ) ;
100+
101+ cur = cur. wrapping_sub ( 1 ) ;
102+ buf[ cur] = b'x' ;
103+ cur = cur. wrapping_sub ( 1 ) ;
104+
105+ // SAFETY: The buffer is initially ASCII and we only write ASCII bytes to it.
106+ let s = unsafe { core:: str:: from_utf8_unchecked ( & buf[ cur..] ) } ;
107+ f. write_str ( s)
108+ }
109+
110+ #[ inline]
111+ pub fn display_int ( n : u128 , is_negative : bool , f : & mut Formatter < ' _ > ) -> Result {
112+ let mut buf = [ b'-' ; 42 ] ;
113+ let mut cur = format_with_radix ( n, & mut buf, const { NonZeroU128 :: new ( 10 ) . unwrap ( ) } ) ;
117114 if is_negative {
118- cur -= 1 ;
119- buf[ cur] = b'-' ;
115+ cur = cur. wrapping_sub ( 1 ) ;
120116 }
121117 // SAFETY: The buffer is initially ASCII and we only write ASCII bytes to it.
122118 let s = unsafe { core:: str:: from_utf8_unchecked ( & buf[ cur..] ) } ;
0 commit comments