#![no_std]
#[macro_export]
macro_rules! map_on {
( ($type_name:tt), $mac:ident $(, $args:tt)* ) => {
$mac!($type_name $(, $args)*);
};
( ($first_type:tt, $($rest_type:tt),+), $mac:ident $(, $args:tt)* ) => {
$crate::map_on!(($first_type), $mac $(, $args)*);
$crate::map_on!(($($rest_type),+), $mac $(, $args)*);
};
($tokens:tt, $($macro_arms:tt)+) => {
const _: () = {
macro_rules! __map_on_inliner {
$($macro_arms)+
}
$crate::map_on!(@expand_tokens $tokens);
};
};
(@expand_tokens ($first:tt $(, $rest:tt)*)) => {
__map_on_inliner!($first);
$crate::map_on!(@expand_tokens ($($rest),*))
};
(@expand_tokens ($last:tt)) => {
__map_on_inliner!($last);
};
(@expand_tokens ()) => {};
( ( $(($a:tt, $b:tt)),* $(,)? ), ($($params:tt)*) => $body:block ) => {
const _: () = {
macro_rules! __map_on_inliner {
($($params)*) => $body
}
$(
__map_on_inliner!($a, $b);
)*
};
};
( ($($types:tt),+), $mac:ident $(, $args:tt)* ) => {
$(
$mac!($types $(, $args)*);
)+
};
}
#[macro_export]
macro_rules! map_on_integer_unsigned {
($($macro_arms:tt)*) => {
$crate::map_on!((u8, u16, u32, u64, usize), $($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_integer_signed {
($($macro_arms:tt)*) => {
$crate::map_on!((i8, i16, i32, i64, isize), $($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_integer
{
($($macro_arms:tt)*) => {
$crate::map_on_integer_unsigned!($($macro_arms)*);
$crate::map_on_integer_signed!($($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_float
{
($($macro_arms:tt)*) => {
$crate::map_on!((f32, f64), $($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_number
{
($($macro_arms:tt)*) => {
$crate::map_on_integer!($($macro_arms)*);
$crate::map_on_float!($($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_number_and_bool
{
($($macro_arms:tt)*) => {
$crate::map_on_number!($($macro_arms)*);
$crate::map_on!((bool), $($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_operator_binary_arithmetic_unit {
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(Add, add),
(Sub, sub)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_binary_arithmetic {
($($macro_arms:tt)*) => {
$crate::map_on_operator_binary_arithmetic_unit!($($macro_arms)*);
$crate::map_on!
(
(
(Mul, mul),
(Div, div),
(Rem, rem)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_binary_bit {
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(BitOr, bitor),
(BitAnd, bitand),
(Shl, shl),
(Shr, shr)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_binary
{
($($macro_arms:tt)*) => {
$crate::map_on_operator_binary_arithmetic!($($macro_arms)*);
$crate::map_on_operator_binary_bit!($($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_operator_assign_arithmetic_unit {
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(AddAssign, add_assign),
(SubAssign, sub_assign)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_assign_arithmetic {
($($macro_arms:tt)*) => {
$crate::map_on_operator_assign_arithmetic_unit!($($macro_arms)*);
$crate::map_on!
(
(
(MulAssign, mul_assign),
(DivAssign, div_assign),
(RemAssign, rem_assign)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_assign_bit {
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(BitOrAssign, bitor_assign),
(BitAndAssign, bitand_assign),
(ShlAssign, shl_assign),
(ShrAssign, shr_assign)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_assign
{
($($macro_arms:tt)*) => {
$crate::map_on_operator_assign_arithmetic!($($macro_arms)*);
$crate::map_on_operator_assign_bit!($($macro_arms)*);
};
}
#[macro_export]
macro_rules! map_on_operator_unary_bit
{
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(Not, not)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_unary_arithmetic_unit
{
($($macro_arms:tt)*) => {
$crate::map_on!
(
(
(Neg, neg),
(Abs, abs)
),
$($macro_arms)*
);
};
}
#[macro_export]
macro_rules! map_on_operator_unary
{
($($macro_arms:tt)*) => {
$crate::map_on_operator_unary_bit!($($macro_arms)*);
$crate::map_on_operator_unary_arithmetic_unit!($($macro_arms)*);
};
}
pub mod prelude
{
pub use super::*;
}