#![no_std]
#[macro_use]
mod util;
#[macro_use]
mod core_impl;
#[macro_use]
mod gen_ops_bin;
#[macro_use]
mod gen_ops_un;
#[macro_use]
mod gen_ops_asgn;
#[macro_export]
macro_rules! gen_ops {
($(<$($($lt:lifetime),+)? $(,)? $($($gen:ident),+)? $(| $(const $C:ident : $Ct:ty),+)?>;)? types $($rest:tt)+) => {
gen_ops!(@step1 ($(<$($($lt),+,)? $($($gen),+ ,)? $($(const $C : $Ct),+)?>)?); types $($rest)+);
};
(@step1 ($($gen:tt)*); types $lhs:ty, $rhs:ty => $out:ty;$($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs own own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &$lhs:ty, $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs ref_ own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty, &$rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs own ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*);types &$lhs:ty, &$rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs ref_ ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &mut $lhs:ty, $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs mut_ own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty, &mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs own mut_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &mut $lhs:ty, &mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs mut_ mut_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &mut $lhs:ty, &$rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs mut_ ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &$lhs:ty, &mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs ref_ mut_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty, $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty, &$rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty, &mut $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own mut_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, &$rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, &mut $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ mut_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types $lhs:ty => $output:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $output;
refs own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &$lhs:ty => $output:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $output;
refs ref_;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types &mut$lhs:ty => $output:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $output;
refs mut_;
$($rest)+
);
};
}
#[macro_export]
macro_rules! gen_ops_comm {
($(<$($($lt:lifetime),+)? $(,)? $($($gen:ident),+)? $(| $(const $C:ident : $Ct:ty),+)?>;)? types $($rest:tt)+) => {
gen_ops_comm!(@step1 ($(<$($($lt),+,)? $($($gen),+ ,)? $($(const $C : $Ct),+)?>)?); types $($rest)+);
};
(@step1 ($($gen:tt)*); types $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types &$lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types &mut $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm!(@step2 ($($gen)*); types mut_: $lhs, $($rest)+);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $rhs, $lhs => $out;
refs own $lref rev;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, &$rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref ref_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $rhs, $lhs => $out;
refs ref_ $lref rev;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, &mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref mut_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $rhs, $lhs => $out;
refs mut_ $lref rev;
$($rest)+
);
};
}
#[macro_export]
macro_rules! gen_ops_ex {
($(<$($($lt:lifetime),+)? $(,)? $($($gen:ident),+)? $(| $(const $C:ident : $Ct:ty),+)?>;)? types $($rest:tt)+) => {
gen_ops_ex!(@step1 ($(<$($($lt),+,)? $($($gen),+ ,)? $($(const $C : $Ct),+)?>)?); types $($rest)+);
};
(@step1 ($($gen:tt)*); types $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types ref $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_ex!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
$crate::gen_ops_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_ex!(@step2 ($($gen)*); types mut_: $lhs, $($rest)+);
$crate::gen_ops_ex!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
$crate::gen_ops_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_ex!(@step2 ($($gen)*); types mut_: $lhs, $($rest)+);
$crate::gen_ops_ex!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
$crate::gen_ops_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, ref $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref ref_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref mut_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref ref_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*);
types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types own: $lhs:ty, $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types own: $lhs:ty, ref $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own ref_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types own: $lhs:ty, mut $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own mut_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own ref_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs own own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types mut_: $lhs:ty, $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types mut_: $lhs:ty, ref $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ ref_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types mut_: $lhs:ty, mut $rhs:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ mut_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ ref_;
$($rest)+
);
$crate::_gen_ops_internal_asgn!(
($($gen)*);
types $lhs, $rhs;
refs mut_ own;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types ref_: $lhs:ty, mut $rhs:ty; $($rest:tt)+) => {};
(@step2 ($($gen:tt)*); types ref_: $lhs:ty, ref $rhs:ty; $($rest:tt)+) => {};
(@step2 ($($gen:tt)*); types ref_: $lhs:ty, $rhs:ty; $($rest:tt)+) => {};
(@step1 ($($gen:tt)*); types $lhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types ref $lhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs ref_;
$($rest)+
);
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs own;
$($rest)+
);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs mut_;
$($rest)+
);
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs ref_;
$($rest)+
);
$crate::_gen_ops_internal_un!(
($($gen)*);
types $lhs => $out;
refs own;
$($rest)+
);
};
}
#[macro_export]
macro_rules! gen_ops_comm_ex {
($(<$($($lt:lifetime),+)? $(,)? $($($gen:ident),+)? $(| $(const $C:ident : $Ct:ty),+)?>;)? types $($rest:tt)+) => {
gen_ops_comm_ex!(@step1 ($(<$($($lt),+,)? $($($gen),+ ,)? $($(const $C : $Ct),+)?>)?); types $($rest)+);
};
(@step1 ($($gen:tt)*); types $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types ref $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step1 ($($gen:tt)*); types mut $lhs:ty, $($rest:tt)+) => {
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types mut_: $lhs, $($rest)+);
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types ref_: $lhs, $($rest)+);
$crate::gen_ops_comm_ex!(@step2 ($($gen)*); types own: $lhs, $($rest)+);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs own $lref rev;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, ref $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref ref_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs ref_ $lref rev;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs own $lref rev;
$($rest)+
);
};
(@step2 ($($gen:tt)*); types $lref:ident: $lhs:ty, mut $rhs:ty => $out:ty; $($rest:tt)+) => {
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref mut_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs mut_ $lref rev;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref ref_;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs ref_ $lref rev;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $lhs, $rhs => $out;
refs $lref own;
$($rest)+
);
$crate::_gen_ops_internal_bin!(
($($gen)*); types $rhs, $lhs => $out;
refs own $lref rev;
$($rest)+
);
};
}