equator/spec/
sized.rs

1use crate::{spec::Wrapper, Cmp, CmpDisplay, CmpError};
2use core::fmt;
3
4#[repr(transparent)]
5#[derive(Copy, Clone)]
6pub struct SizedWrapper<T>(pub T);
7#[repr(transparent)]
8pub struct NoSizedWrapper<'a, T: ?Sized>(pub &'a T);
9
10impl<T: ?Sized> Copy for NoSizedWrapper<'_, T> {}
11impl<T: ?Sized> Clone for NoSizedWrapper<'_, T> {
12    #[inline(always)]
13    fn clone(&self) -> Self {
14        *self
15    }
16}
17
18impl<T: fmt::Debug> fmt::Debug for SizedWrapper<T> {
19    #[inline(always)]
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        self.0.fmt(f)
22    }
23}
24
25impl<T: ?Sized + fmt::Debug> fmt::Debug for NoSizedWrapper<'_, T> {
26    #[inline(always)]
27    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28        self.0.fmt(f)
29    }
30}
31
32impl<T> SizedWrapper<T> {
33    #[inline(always)]
34    pub fn get(&self) -> &Self {
35        self
36    }
37}
38impl<T: ?Sized> NoSizedWrapper<'_, T> {
39    #[inline(always)]
40    pub fn get(&self) -> &Self {
41        self
42    }
43}
44
45impl<
46        Lhs: ?Sized + core::ops::Deref,
47        Rhs: ?Sized + core::ops::Deref,
48        C: Cmp<Wrapper<Lhs::Target>, Wrapper<Rhs::Target>>,
49    > Cmp<Wrapper<Lhs>, Wrapper<Rhs>> for CmpSizedWrapper<C>
50{
51    #[inline(always)]
52    fn test(&self, lhs: &Wrapper<Lhs>, rhs: &Wrapper<Rhs>) -> Result<(), Self::Error> {
53        self.0
54            .test(
55                unsafe { &*((&*lhs.0) as *const Lhs::Target as *const Wrapper<Lhs::Target>) },
56                unsafe { &*((&*rhs.0) as *const Rhs::Target as *const Wrapper<Rhs::Target>) },
57            )
58            .map_err(CmpSizedWrapper)
59    }
60}
61
62impl<
63        Lhs: ?Sized + core::ops::Deref,
64        Rhs: ?Sized + core::ops::Deref,
65        C: CmpError<C, Wrapper<Lhs::Target>, Wrapper<Rhs::Target>>,
66    > CmpError<CmpSizedWrapper<C>, Wrapper<Lhs>, Wrapper<Rhs>> for CmpSizedWrapper<C>
67{
68    type Error = CmpSizedWrapper<C::Error>;
69}
70
71impl<
72        Lhs: ?Sized + core::ops::Deref,
73        Rhs: ?Sized + core::ops::Deref,
74        C,
75        E: CmpDisplay<C, Wrapper<Lhs::Target>, Wrapper<Rhs::Target>>,
76    > CmpDisplay<CmpSizedWrapper<C>, Wrapper<Lhs>, Wrapper<Rhs>> for CmpSizedWrapper<E>
77{
78    fn fmt(
79        &self,
80        cmp: &CmpSizedWrapper<C>,
81        lhs: &Wrapper<Lhs>,
82        lhs_source: &str,
83        lhs_debug: &dyn fmt::Debug,
84        rhs: &Wrapper<Rhs>,
85        rhs_source: &str,
86        rhs_debug: &dyn fmt::Debug,
87        f: &mut fmt::Formatter,
88    ) -> fmt::Result {
89        self.0.fmt(
90            &cmp.0,
91            unsafe { &*((&*lhs.0) as *const Lhs::Target as *const Wrapper<Lhs::Target>) },
92            lhs_source,
93            lhs_debug,
94            unsafe { &*((&*rhs.0) as *const Rhs::Target as *const Wrapper<Rhs::Target>) },
95            rhs_source,
96            rhs_debug,
97            f,
98        )
99    }
100}
101
102impl<T> core::ops::Deref for SizedWrapper<T> {
103    type Target = T;
104
105    #[inline]
106    fn deref(&self) -> &Self::Target {
107        &self.0
108    }
109}
110
111impl<T: ?Sized> core::ops::Deref for NoSizedWrapper<'_, T> {
112    type Target = T;
113
114    #[inline]
115    fn deref(&self) -> &Self::Target {
116        self.0
117    }
118}
119
120impl SizedWrap {
121    #[inline(always)]
122    pub fn do_wrap<T>(self, value: &T) -> &SizedWrapper<T> {
123        unsafe { &*(value as *const T as *const _) }
124    }
125}
126impl NoSizedWrap {
127    #[inline(always)]
128    pub fn do_wrap<T: ?Sized>(self, value: &T) -> NoSizedWrapper<'_, T> {
129        NoSizedWrapper(value)
130    }
131}
132
133#[repr(transparent)]
134#[derive(Copy, Clone)]
135pub struct CmpSizedWrapper<T>(pub T);
136
137pub struct SizedWrap;
138pub struct NoSizedWrap;
139
140pub trait TrySizedWrap {
141    type Wrap;
142    fn wrap_sized(&self) -> Self::Wrap;
143}
144
145impl<T: Sized> TrySizedWrap for &Wrapper<&T> {
146    type Wrap = SizedWrap;
147
148    #[inline]
149    fn wrap_sized(&self) -> Self::Wrap {
150        SizedWrap
151    }
152}
153impl<T: ?Sized> TrySizedWrap for Wrapper<&T> {
154    type Wrap = NoSizedWrap;
155
156    #[inline]
157    fn wrap_sized(&self) -> Self::Wrap {
158        NoSizedWrap
159    }
160}