1#![doc = include_str!("../README.md")]
2
3#[doc(hidden)]
4pub mod macro_docs {
5 pub mod inner_attr {
6 pub mod mod_value_namespace {}
9
10 pub mod derive {
12 pub use ::core::clone::Clone;
13 pub use ::core::cmp::{Eq, Ord, PartialEq, PartialOrd};
14 pub use ::core::default::Default;
15 pub use ::core::fmt::Debug;
16 pub use ::core::hash::Hash;
17 pub use ::core::marker::Copy;
18 }
19 }
20}
21
22#[doc(hidden)]
23#[macro_export]
24macro_rules! expand_a_or_b {
25 ([][$($b:tt)*]) => {
26 $($b)*
27 };
28 ([$($a:tt)+][$($b:tt)*]) => {
29 $($a)+
30 };
31}
32
33#[doc(hidden)]
34#[macro_export]
35macro_rules! __impl_value_namespace {
36 ([] $vis:tt $name:ident) => {
37 $crate::__impl_value_namespace! {
38 [__impl_value_namespace] $vis $name
39 }
40 };
41 ([$mod_value_namespace:ident] {$($vis:tt)*} $name:ident) => {
42 mod $mod_value_namespace {
43 $crate::__impl_value_namespace_use! {
44 $name $($vis)*
45 }
46 }
47
48 #[doc(hidden)]
49 $($vis)* use $mod_value_namespace::*;
50 };
51}
52
53#[doc(hidden)]
54#[macro_export]
55macro_rules! __impl_value_namespace_use {
56 ($name:ident) => {
57 pub(super) use super::$name::$name;
58 };
59 ($name:ident pub) => {
60 pub use super::$name::$name;
61 };
62 ($name:ident pub($(in)? self $($p:tt)*)) => {
63 pub(in super $($p)*) use super::$name::$name;
64 };
65 ($name:ident pub($(in)? super $($p:tt)*)) => {
66 pub(in super::super $($p)*) use super::$name::$name;
67 };
68 ($name:ident pub($(in)? crate $($p:tt)*)) => {
69 pub(in crate $($p)*) use super::$name::$name;
70 };
71 ($name:ident $($vis:tt)+) => {
72 pub(super) use super::$name::$name;
73 };
74}
75
76#[doc(hidden)]
77#[macro_export]
78macro_rules! __impl_phantom_types {
79 ([$($type_generic:tt)*]) => {
80 (
81 $( $crate::__impl_phantom_type![$type_generic] ,)*
82 )
83 };
84}
85
86#[doc(hidden)]
87#[macro_export]
88macro_rules! __impl_phantom_type {
89 ({$lt:lifetime}) => {
90 & $lt ()
91 };
92 ({{const $const_ident:ident} $($t:tt)*}) => {
93 ()
94 };
95 ({{} $($t:tt)*}) => {
96 ::core::marker::PhantomData<$($t)*>
97 };
99}
100
101#[doc(hidden)]
102#[macro_export]
103macro_rules! __impl_inner_attr {
104 (
105 $vis:tt $name:ident $data:tt
106 mod_value_namespace $(= $mod_value_namespace:ident)?
107 ) => {
108 $crate::__impl_value_namespace! {
109 [$($mod_value_namespace)?]
110 $vis
111 $name
112 }
113 };
114 (
115 $vis:tt $name:ident $data:tt
116 derive $(( $($derive_macro_name:ident),* $(,)? ))?
117 ) => {
118 $($(
119 $crate::__impl_derive_macro! {
120 $derive_macro_name
121 $derive_macro_name
122 $name $data
123 }
124 )*)?
125 };
126}
127
128#[doc(hidden)]
129#[macro_export]
130macro_rules! __impl_derive_macro {
131 (Copy $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
132 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
133 for $name<$($type_generics)*> $($where_clause)* {}
134 };
135 (Clone $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
136 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
137 for $name<$($type_generics)*> $($where_clause)* {
138 #[inline]
139 fn clone(&self) -> Self {
140 Self::$name
141 }
142 }
143 };
144 (Default $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
145 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
146 for $name<$($type_generics)*> $($where_clause)* {
147 #[inline]
148 fn default() -> Self {
149 Self::$name
150 }
151 }
152 };
153 (Hash $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
154 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
155 for $name<$($type_generics)*> $($where_clause)* {
156 #[inline]
157 fn hash<H: ::core::hash::Hasher>(&self, _: &mut H) {}
158 }
159 };
160 (PartialOrd $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
161 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
162 for $name<$($type_generics)*> $($where_clause)* {
163 fn partial_cmp(&self, _other: &Self) -> Option<::core::cmp::Ordering> {
164 ::core::option::Option::Some(::core::cmp::Ordering::Equal)
165 }
166 }
167 };
168 (Ord $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
169 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
170 for $name<$($type_generics)*> $($where_clause)* {
171 fn cmp(&self, _other: &Self) -> ::core::cmp::Ordering {
172 ::core::cmp::Ordering::Equal
173 }
174 }
175 };
176 (PartialEq $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
177 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
178 for $name<$($type_generics)*> $($where_clause)* {
179 fn eq(&self, _other: &Self) -> ::core::primitive::bool {
180 true
181 }
182 }
183 };
184 (Eq $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
185 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
186 for $name<$($type_generics)*> $($where_clause)* {
187 }
188 };
189 (Debug $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
190 impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
191 for $name<$($type_generics)*> $($where_clause)* {
192 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
193 write!(f, ::core::stringify!($name))
194 }
195 }
196 };
197}
198
199#[doc(hidden)]
200#[macro_export]
201macro_rules! __impl_ghost {
202 ($data:tt $phantom_types:tt) => {
203 $crate::__impl_ghost_enum! { $data $phantom_types }
204 $crate::__impl_ghost_inner_attrs! { $data }
205 };
206}
207
208#[doc(hidden)]
209#[macro_export]
210macro_rules! __impl_ghost_enum {
211 ({
212 {
213 $attrs_inner:tt
214 {$($attr:tt)*}
215 {$($vis:tt)*}
216 $name:ident
217 }
218 {$($rest:tt)+}
219 $impl_generics:tt
220 $type_generics:tt
221 $where_clause:tt
222 } $phantom_types:tt) => {
223 $($attr)*
224 $($vis)* enum $name<$($rest)+ {
225 $name,
226 #[doc(hidden)]
227 __Phantom(
228 ::core::convert::Infallible,
229 ::core::marker::PhantomData<
230 $crate::__impl_phantom_types![$phantom_types]
231 >
232 ),
233 }
234 };
235}
236
237#[doc(hidden)]
238#[macro_export]
239macro_rules! __impl_ghost_inner_attrs {
240 ({
241 {
242 {$(#![$inner_attr_name:ident $($inner_attr:tt)* ])*}
243 $attrs:tt
244 $vis:tt
245 $name:ident
246 }
247 $rest:tt
248 $impl_generics:tt
249 $type_generics:tt
250 $where_clause:tt
251 }) => {
252 $(
253 $crate::__impl_inner_attr! {
254 $vis $name
255 {$rest $impl_generics $type_generics $where_clause}
256 $inner_attr_name $($inner_attr)*
257 }
258 )*
259 };
260}
261
262#[doc(hidden)]
263#[macro_export]
264macro_rules! __impl_resolve_type_generics_expand {
265 (
266 $data:tt
267 $rest:tt
268 ) => {
269 $crate::__impl_resolve_type_generics! {
270 $data
271 $rest
272 $rest
273 }
274 };
275}
276
277#[doc(hidden)]
278#[macro_export]
279macro_rules! __impl_resolve_type_generics {
280 (
281 $data:tt
282 $rest:tt
283 {
284 $(
285 $lt:lifetime
286 $(:
287 $($lt_bound:lifetime)?
288 $(+ $lt_bounds:lifetime)*
289 )?
290 ),*
291 $($($ignore_comma:literal)? ,)?
292 $(
293 $const_or_tp:ident
294 $($tp:ident)?
295 $(:
296 $($tp_lt_bound:lifetime)?
297 $(+ $tp_lt_bounds:lifetime)*
298 $($($ignore:literal)? +)?
299 $(
300 $(? $($tp_bound_relax_ignore:literal)?)?
301 $tp_bound:path
302 )?
303 )?
304 ),*
305 $(,)?
306 >
307 $(where $($where_clause:tt)*)?
308 }
309 ) => {
310 $crate::__impl_ghost! {
311 {
312 $data
313 $rest
314 [
316 $(
317 $lt
318 $(:
319 $($lt_bound)?
320 $(+ $lt_bounds)*
321 )?
322 ),*
323 $($($ignore_comma)? ,)?
324 $(
325 $const_or_tp
326 $($tp)?
327 $(:
328 $($tp_lt_bound)?
329 $(+ $tp_lt_bounds)*
330 $($($ignore)? +)?
331 $(
332 $(? $($tp_bound_relax_ignore)?)?
333 $tp_bound
334 )?
335 )?
336 ),*
337 ]
338 [
340 $(
341 $lt
342 ),*
343 $($($ignore_comma)? ,)?
344 $(
345 $crate::expand_a_or_b![
346 [$($tp)?]
347 [$const_or_tp]
348 ]
349 ),*
350 ]
351 [$(where $($where_clause)*)?]
353 }
354 [
356 $({ $lt })*
357 $({
358 {$(const $tp)?}
359 $crate::expand_a_or_b![
360 [$($tp)?]
361 [$const_or_tp]
362 ]
363 })*
364 ]
365 }
366 };
367}
368
369#[doc(hidden)]
370#[macro_export]
371macro_rules! __impl_default_mod_value_namespace {
372 (
373 $vis:tt $name:ident
374 $([mod_value_namespace $(= $mod_value_namespace:ident)?])?
375 $([derive $($rest:tt)*])*
376 ) => {
377 $crate::__impl_default_mod_value_namespace_impl! {
378 $vis $name
379 $(mod_value_namespace $(= $mod_value_namespace)?)?
380 }
381 };
382}
383
384#[doc(hidden)]
385#[macro_export]
386macro_rules! __impl_default_mod_value_namespace_impl {
387 ($vis:tt $name:ident mod_value_namespace $($rest:tt)*) => {};
388 ($vis:tt $name:ident) => {
389 $crate::__impl_value_namespace! {
390 []
391 $vis
392 $name
393 }
394 };
395}
396
397#[macro_export]
398macro_rules! ghost {
399 (
400 $(#![$attr_inner_name:ident $($attr_inner:tt)*])*
401 $(#[$($attr:tt)*])*
402 $(pub $( ($($vis_path:tt)*) )?)?
403 struct $name:ident <
404 $($rest:tt)+
405 ) => {
406 $(
407 #[allow(unused_imports)]
408 use $crate::macro_docs::inner_attr::$attr_inner_name as _;
409 )*
410
411 $crate::__impl_resolve_type_generics_expand! {
412 {
413 {$(#![$attr_inner_name $($attr_inner)*])*}
414 {$(#[$($attr)*])*}
415 {$(pub $( ($($vis_path)*) )?)?}
416 $name
417 }
418 {$($rest)+}
419 }
420
421 $crate::__impl_default_mod_value_namespace! {
422 {$(pub $( ($($vis_path)*) )?)?}
423 $name
424 $([$attr_inner_name $($attr_inner)*])*
425 }
426 };
427}