proc_macro_assertions/
token_cmp_wrapper.rs

1use std::ops::Deref;
2
3use better_any::tid;
4use quote::ToTokens;
5
6use crate::{generatable::StaticTid, maybe_borrowed::MaybeBorrowed};
7
8#[repr(transparent)]
9pub struct TokenCmpWrapper<T: ToTokens>(pub T);
10
11tid!(
12    impl<'a, T: 'static> Tid<'a> for TokenCmpWrapper<T>  where T: ToTokens
13);
14
15impl<T> Deref for TokenCmpWrapper<T>
16where
17    T: ToTokens,
18{
19    type Target = T;
20
21    fn deref(&self) -> &Self::Target {
22        &self.0
23    }
24}
25
26impl<T, U> PartialEq<TokenCmpWrapper<U>> for TokenCmpWrapper<T>
27where
28    T: ToTokens,
29    U: ToTokens,
30{
31    fn eq(&self, other: &TokenCmpWrapper<U>) -> bool {
32        self.0.to_token_stream().to_string() == other.0.to_token_stream().to_string()
33    }
34}
35
36impl<T> Eq for TokenCmpWrapper<T> where T: ToTokens {}
37
38impl<T> Ord for TokenCmpWrapper<T>
39where
40    T: ToTokens,
41{
42    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
43        self.0
44            .to_token_stream()
45            .to_string()
46            .cmp(&other.0.to_token_stream().to_string())
47    }
48}
49
50impl<T> PartialOrd for TokenCmpWrapper<T>
51where
52    T: ToTokens,
53{
54    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
55        Some(self.cmp(other))
56    }
57}
58
59impl<U> From<U> for TokenCmpWrapper<U>
60where
61    U: ToTokens,
62{
63    fn from(value: U) -> Self {
64        Self(value)
65    }
66}
67
68impl<'a, U> From<&'a U> for &'a TokenCmpWrapper<U>
69where
70    U: ToTokens,
71{
72    fn from(value: &'a U) -> Self {
73        // Safety: This is safe becaause of #[repr(transparent)].
74        unsafe { &*(value as *const U).cast::<TokenCmpWrapper<U>>() }
75    }
76}
77
78impl<'a, U> From<&'a mut U> for &'a mut TokenCmpWrapper<U>
79where
80    U: ToTokens,
81{
82    fn from(value: &'a mut U) -> Self {
83        // Safety: This is safe becaause of #[repr(transparent)].
84        unsafe { &mut *(value as *mut U).cast::<TokenCmpWrapper<U>>() }
85    }
86}
87
88impl<'a, U> From<&'a U> for MaybeBorrowed<'a, TokenCmpWrapper<U>>
89where
90    U: ToTokens,
91{
92    fn from(value: &'a U) -> Self {
93        MaybeBorrowed::Borrowed(value.into())
94    }
95}
96
97impl<'a, T> From<T> for MaybeBorrowed<'a, TokenCmpWrapper<T>>
98where
99    T: ToTokens,
100{
101    fn from(value: T) -> Self {
102        MaybeBorrowed::Owned(TokenCmpWrapper(value))
103    }
104}
105
106impl<U> From<U> for TokenCmpWrapper<StaticTid<U>>
107where
108    U: ToTokens,
109{
110    fn from(value: U) -> Self {
111        Self(value.into())
112    }
113}
114
115impl<'a, U> From<&'a U> for &'a TokenCmpWrapper<StaticTid<U>>
116where
117    U: ToTokens,
118{
119    fn from(value: &'a U) -> Self {
120        <&'a StaticTid<U>>::from(value).into()
121    }
122}
123
124impl<'a, U> From<&'a mut U> for &'a mut TokenCmpWrapper<StaticTid<U>>
125where
126    U: ToTokens,
127{
128    fn from(value: &'a mut U) -> Self {
129        <&'a mut StaticTid<U>>::from(value).into()
130    }
131}
132
133impl<'a, U> From<&'a U> for MaybeBorrowed<'a, TokenCmpWrapper<StaticTid<U>>>
134where
135    U: ToTokens,
136{
137    fn from(value: &'a U) -> Self {
138        // Safety: This is safe becaause of #[repr(transparent)].
139        MaybeBorrowed::Borrowed(value.into())
140    }
141}
142
143impl<'a, U> From<U> for MaybeBorrowed<'a, TokenCmpWrapper<StaticTid<U>>>
144where
145    U: ToTokens,
146{
147    fn from(value: U) -> Self {
148        MaybeBorrowed::Owned(TokenCmpWrapper(value.into()))
149    }
150}
151
152impl<'a, U> From<&'a U> for &'a StaticTid<TokenCmpWrapper<U>>
153where
154    U: ToTokens,
155{
156    fn from(value: &'a U) -> Self {
157        <&'a TokenCmpWrapper<U>>::from(value).into()
158    }
159}
160
161impl<'a, U> From<&'a mut U> for &'a mut StaticTid<TokenCmpWrapper<U>>
162where
163    U: ToTokens,
164{
165    fn from(value: &'a mut U) -> Self {
166        <&'a mut TokenCmpWrapper<U>>::from(value).into()
167    }
168}
169
170impl<'a, U> From<&'a U> for MaybeBorrowed<'a, StaticTid<TokenCmpWrapper<U>>>
171where
172    U: ToTokens,
173{
174    fn from(value: &'a U) -> Self {
175        // Safety: This is safe becaause of #[repr(transparent)].
176        MaybeBorrowed::Borrowed(value.into())
177    }
178}
179
180impl<'a, U> From<U> for MaybeBorrowed<'a, StaticTid<TokenCmpWrapper<U>>>
181where
182    U: ToTokens,
183{
184    fn from(value: U) -> Self {
185        MaybeBorrowed::Owned(StaticTid(value.into()))
186    }
187}
188
189impl<T> ToTokens for TokenCmpWrapper<T>
190where
191    T: ToTokens,
192{
193    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
194        (**self).to_tokens(tokens);
195    }
196
197    fn to_token_stream(&self) -> proc_macro2::TokenStream {
198        (**self).to_token_stream()
199    }
200
201    fn into_token_stream(self) -> proc_macro2::TokenStream
202    where
203        Self: Sized,
204    {
205        self.to_token_stream()
206    }
207}