equator/spec/
debug.rs

1use crate::{spec::Wrapper, Cmp, CmpDisplay, CmpError};
2use core::fmt;
3
4#[repr(transparent)]
5#[derive(Copy, Clone)]
6pub struct DebugWrapper<T: ?Sized>(pub T);
7#[repr(transparent)]
8#[derive(Copy, Clone)]
9pub struct NoDebugWrapper<T: ?Sized>(pub T);
10
11impl<
12        Lhs: ?Sized + core::ops::Deref,
13        Rhs: ?Sized + core::ops::Deref,
14        C: CmpError<C, Lhs::Target, Rhs::Target>,
15    > CmpError<CmpDebugWrapper<C>, Wrapper<Lhs>, Wrapper<Rhs>> for CmpDebugWrapper<C>
16{
17    type Error = CmpDebugWrapper<C::Error>;
18}
19
20impl<
21        Lhs: ?Sized + core::ops::Deref,
22        Rhs: ?Sized + core::ops::Deref,
23        C,
24        E: CmpDisplay<C, Lhs::Target, Rhs::Target>,
25    > CmpDisplay<CmpDebugWrapper<C>, Wrapper<Lhs>, Wrapper<Rhs>> for CmpDebugWrapper<E>
26{
27    fn fmt(
28        &self,
29        cmp: &CmpDebugWrapper<C>,
30        lhs: &Wrapper<Lhs>,
31        lhs_source: &str,
32        lhs_debug: &dyn fmt::Debug,
33        rhs: &Wrapper<Rhs>,
34        rhs_source: &str,
35        rhs_debug: &dyn fmt::Debug,
36        f: &mut fmt::Formatter,
37    ) -> fmt::Result {
38        self.0.fmt(
39            &cmp.0, &*lhs.0, lhs_source, lhs_debug, &*rhs.0, rhs_source, rhs_debug, f,
40        )
41    }
42}
43
44impl<
45        Lhs: ?Sized + core::ops::Deref,
46        Rhs: ?Sized + core::ops::Deref,
47        C: Cmp<Lhs::Target, Rhs::Target>,
48    > Cmp<Wrapper<Lhs>, Wrapper<Rhs>> for CmpDebugWrapper<C>
49{
50    #[inline(always)]
51    fn test(&self, lhs: &Wrapper<Lhs>, rhs: &Wrapper<Rhs>) -> Result<(), Self::Error> {
52        self.0.test(&*lhs.0, &*rhs.0).map_err(CmpDebugWrapper)
53    }
54}
55
56impl<T: ?Sized> core::ops::Deref for DebugWrapper<T> {
57    type Target = T;
58
59    #[inline]
60    fn deref(&self) -> &Self::Target {
61        &self.0
62    }
63}
64
65impl<T: ?Sized> core::ops::Deref for NoDebugWrapper<T> {
66    type Target = T;
67
68    #[inline]
69    fn deref(&self) -> &Self::Target {
70        &self.0
71    }
72}
73
74impl<T: ?Sized + fmt::Debug> fmt::Debug for DebugWrapper<T> {
75    #[inline(always)]
76    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77        self.0.fmt(f)
78    }
79}
80impl<T: ?Sized> fmt::Debug for NoDebugWrapper<T> {
81    #[inline(always)]
82    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83        write!(
84            f,
85            "<object of type \"{}\" at address {:?}>",
86            core::any::type_name::<T>(),
87            self as *const _ as *const ()
88        )
89    }
90}
91
92pub struct DebugWrap;
93pub struct NoDebugWrap;
94
95impl DebugWrap {
96    #[inline(always)]
97    pub fn do_wrap<T: ?Sized>(self, value: &T) -> &DebugWrapper<T> {
98        unsafe { &*(value as *const T as *const DebugWrapper<T>) }
99    }
100}
101impl NoDebugWrap {
102    #[inline(always)]
103    pub fn do_wrap<T: ?Sized>(self, value: &T) -> &NoDebugWrapper<T> {
104        unsafe { &*(value as *const T as *const NoDebugWrapper<T>) }
105    }
106}
107
108#[repr(transparent)]
109#[derive(Copy, Clone)]
110pub struct CmpDebugWrapper<T>(pub T);
111
112pub trait TryDebugWrap {
113    type Wrap;
114    fn wrap_debug(&self) -> Self::Wrap;
115}
116
117impl<T: fmt::Debug + ?Sized> TryDebugWrap for &Wrapper<T> {
118    type Wrap = DebugWrap;
119
120    #[inline]
121    fn wrap_debug(&self) -> Self::Wrap {
122        DebugWrap
123    }
124}
125impl<T: ?Sized> TryDebugWrap for Wrapper<T> {
126    type Wrap = NoDebugWrap;
127
128    #[inline]
129    fn wrap_debug(&self) -> Self::Wrap {
130        NoDebugWrap
131    }
132}