1#![no_std]
2
3#[macro_export]
41macro_rules! map_on {
42 ( ($type_name:tt), $mac:ident $(, $args:tt)* ) => {
44 $mac!($type_name $(, $args)*);
45 };
46 ( ($first_type:tt, $($rest_type:tt),+), $mac:ident $(, $args:tt)* ) => {
48 $crate::map_on!(($first_type), $mac $(, $args)*);
49 $crate::map_on!(($($rest_type),+), $mac $(, $args)*);
50 };
51
52 ($tokens:tt, $($macro_arms:tt)+) => {
63 const _: () = {
64 macro_rules! __map_on_inliner {
65 $($macro_arms)+
66 }
67
68 $crate::map_on!(@expand_tokens $tokens);
69 };
70 };
71
72 (@expand_tokens ($first:tt $(, $rest:tt)*)) => {
74 __map_on_inliner!($first);
75 $crate::map_on!(@expand_tokens ($($rest),*))
76 };
77
78 (@expand_tokens ($last:tt)) => {
79 __map_on_inliner!($last);
80 };
81
82 (@expand_tokens ()) => {};
83
84
85 ( ( $(($a:tt, $b:tt)),* $(,)? ), ($($params:tt)*) => $body:block ) => {
87 const _: () = {
88 macro_rules! __map_on_inliner {
89 ($($params)*) => $body
90 }
91
92 $(
93 __map_on_inliner!($a, $b);
94 )*
95 };
96 };
97
98 ( ($($types:tt),+), $mac:ident $(, $args:tt)* ) => {
100 $(
101 $mac!($types $(, $args)*);
102 )+
103 };
104}
105
106#[macro_export]
108macro_rules! map_on_integer_unsigned {
109 ($($macro_arms:tt)*) => {
110 $crate::map_on!((u8, u16, u32, u64, usize), $($macro_arms)*);
111 };
112}
113
114
115#[macro_export]
117macro_rules! map_on_integer_signed {
118 ($($macro_arms:tt)*) => {
119 $crate::map_on!((i8, i16, i32, i64, isize), $($macro_arms)*);
120 };
121}
122
123#[macro_export]
125macro_rules! map_on_integer
126{
127 ($($macro_arms:tt)*) => {
128 $crate::map_on_integer_unsigned!($($macro_arms)*);
129 $crate::map_on_integer_signed!($($macro_arms)*);
130 };
131}
132
133#[macro_export]
135macro_rules! map_on_float
136{
137 ($($macro_arms:tt)*) => {
138 $crate::map_on!((f32, f64), $($macro_arms)*);
139 };
140}
141
142#[macro_export]
144macro_rules! map_on_number
145{
146 ($($macro_arms:tt)*) => {
147 $crate::map_on_integer!($($macro_arms)*);
148 $crate::map_on_float!($($macro_arms)*);
149 };
150}
151
152#[macro_export]
154macro_rules! map_on_number_and_bool
155{
156 ($($macro_arms:tt)*) => {
157 $crate::map_on_number!($($macro_arms)*);
158 $crate::map_on!((bool), $($macro_arms)*);
159 };
160}
161
162
163#[macro_export]
165macro_rules! map_on_operator_binary_arithmetic_unit {
166 ($($macro_arms:tt)*) => {
167 $crate::map_on!
168 (
169 (
170 (Add, add),
171 (Sub, sub)
172 ),
173 $($macro_arms)*
174 );
175 };
176}
177
178
179#[macro_export]
181macro_rules! map_on_operator_binary_arithmetic {
182 ($($macro_arms:tt)*) => {
183 $crate::map_on_operator_binary_arithmetic_unit!($($macro_arms)*);
184 $crate::map_on!
185 (
186 (
187 (Mul, mul),
188 (Div, div),
189 (Rem, rem)
190 ),
191 $($macro_arms)*
192 );
193 };
194}
195
196#[macro_export]
198macro_rules! map_on_operator_binary_bit {
199 ($($macro_arms:tt)*) => {
200 $crate::map_on!
201 (
202 (
203 (BitOr, bitor),
204 (BitAnd, bitand),
205 (Shl, shl),
206 (Shr, shr)
207 ),
208 $($macro_arms)*
209 );
210 };
211}
212
213#[macro_export]
215macro_rules! map_on_operator_binary
216{
217 ($($macro_arms:tt)*) => {
218 $crate::map_on_operator_binary_arithmetic!($($macro_arms)*);
219 $crate::map_on_operator_binary_bit!($($macro_arms)*);
220 };
221}
222
223
224
225
226
227#[macro_export]
229macro_rules! map_on_operator_assign_arithmetic_unit {
230 ($($macro_arms:tt)*) => {
231 $crate::map_on!
232 (
233 (
234 (AddAssign, add_assign),
235 (SubAssign, sub_assign)
236 ),
237 $($macro_arms)*
238 );
239 };
240}
241
242
243#[macro_export]
245macro_rules! map_on_operator_assign_arithmetic {
246 ($($macro_arms:tt)*) => {
247 $crate::map_on_operator_assign_arithmetic_unit!($($macro_arms)*);
248 $crate::map_on!
249 (
250 (
251 (MulAssign, mul_assign),
252 (DivAssign, div_assign),
253 (RemAssign, rem_assign)
254 ),
255 $($macro_arms)*
256 );
257 };
258}
259
260#[macro_export]
262macro_rules! map_on_operator_assign_bit {
263 ($($macro_arms:tt)*) => {
264 $crate::map_on!
265 (
266 (
267 (BitOrAssign, bitor_assign),
268 (BitAndAssign, bitand_assign),
269 (ShlAssign, shl_assign),
270 (ShrAssign, shr_assign)
271 ),
272 $($macro_arms)*
273 );
274 };
275}
276
277#[macro_export]
279macro_rules! map_on_operator_assign
280{
281 ($($macro_arms:tt)*) => {
282 $crate::map_on_operator_assign_arithmetic!($($macro_arms)*);
283 $crate::map_on_operator_assign_bit!($($macro_arms)*);
284 };
285}
286
287#[macro_export]
298macro_rules! map_on_std_fmt_without_debug {
299 ($($macro_arms:tt)*) => {
300 $crate::map_on!(
301 (
302 Display,
303 Octal,
304 LowerHex,
305 UpperHex,
306 Pointer,
307 Binary,
308 LowerExp,
309 UpperExp
310 ),
311 $($macro_arms)*
312 );
313 };
314}
315
316#[macro_export]
328macro_rules! map_on_std_fmt {
329 ($($macro_arms:tt)*) => {
330 $crate::map_on_std_fmt_without_debug!($($macro_arms)*);
331 $crate::map_on!((Debug), $($macro_arms)*
332 );
333 };
334}
335
336
337
338
339
340
341#[macro_export]
343macro_rules! map_on_operator_unary_bit
344{
345 ($($macro_arms:tt)*) => {
346 $crate::map_on!
347 (
348 (
349 (Not, not)
350 ),
351 $($macro_arms)*
352 );
353 };
354}
355
356#[macro_export]
358macro_rules! map_on_operator_unary_arithmetic_unit
359{
360 ($($macro_arms:tt)*) => {
361 $crate::map_on!
362 (
363 (
364 (Neg, neg),
365 (Abs, abs)
366 ),
367 $($macro_arms)*
368 );
369 };
370}
371
372
373#[macro_export]
375macro_rules! map_on_operator_unary
376{
377 ($($macro_arms:tt)*) => {
378 $crate::map_on_operator_unary_bit!($($macro_arms)*);
379 $crate::map_on_operator_unary_arithmetic_unit!($($macro_arms)*);
380 };
381}
382
383
384pub mod prelude
385{
386 pub use super::*;
387}