proc_macro_assertions/
token_cmp_wrapper.rs1use 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 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 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 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 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}