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}