ufmt/impls/
ptr.rs
1use core::{mem::MaybeUninit, slice, str};
2
3use crate::{uDebug, uWrite, Formatter};
4
5macro_rules! hex {
6 ($self:expr, $f:expr, $N:expr) => {{
7 let mut buf = [MaybeUninit::<u8>::uninit(); $N];
8
9 let i = hex(*$self as usize, &mut buf);
10
11 unsafe {
12 $f.write_str(str::from_utf8_unchecked(slice::from_raw_parts(
13 buf.as_mut_ptr().add(i).cast(),
14 $N - i,
15 )))
16 }
17 }};
18}
19
20fn hex(mut n: usize, buf: &mut [MaybeUninit<u8>]) -> usize {
21 let ptr = buf.as_mut_ptr().cast::<u8>();
22 let len = buf.len();
23 let mut i = len - 1;
24
25 loop {
26 let d = (n % 16) as u8;
27 unsafe {
28 ptr.add(i)
29 .write(if d < 10 { d + b'0' } else { (d - 10) + b'a' });
30 }
31 n /= 16;
32
33 i -= 1;
34 if n == 0 {
35 break;
36 }
37 }
38
39 unsafe { ptr.add(i).write(b'x') }
40 i -= 1;
41
42 unsafe { ptr.add(i).write(b'0') }
43
44 i
45}
46
47impl<T> uDebug for *const T {
48 #[cfg(target_pointer_width = "16")]
49 fn fmt<W>(&self, f: &mut Formatter<'_, W>) -> Result<(), W::Error>
50 where
51 W: uWrite + ?Sized,
52 {
53 hex!(self, f, 6)
54 }
55
56 #[cfg(target_pointer_width = "32")]
57 fn fmt<W>(&self, f: &mut Formatter<'_, W>) -> Result<(), W::Error>
58 where
59 W: uWrite + ?Sized,
60 {
61 hex!(self, f, 10)
62 }
63
64 #[cfg(target_pointer_width = "64")]
65 fn fmt<W>(&self, f: &mut Formatter<'_, W>) -> Result<(), W::Error>
66 where
67 W: uWrite + ?Sized,
68 {
69 hex!(self, f, 18)
70 }
71}
72
73impl<T> uDebug for *mut T {
74 #[inline(always)]
75 fn fmt<W>(&self, f: &mut Formatter<'_, W>) -> Result<(), W::Error>
76 where
77 W: uWrite + ?Sized,
78 {
79 (*self as *const T).fmt(f)
80 }
81}