Skip to content

Commit c678970

Browse files
committed
Try some golf
1 parent 103ca9c commit c678970

File tree

1 file changed

+34
-38
lines changed

1 file changed

+34
-38
lines changed

library/core/src/displaywrapper.rs

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::fmt::{Display, Formatter, Result};
2+
use core::num::NonZeroU128;
23

34
#[allow(missing_debug_implementations)]
45
pub 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-
8459
impl 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

Comments
 (0)