#[macro_use]
pub mod custom_ops {
#[macro_export]
macro_rules! cai {
(@expr_block ($($ex:tt)+) => { $($b1:tt)* } else { $($b2:tt)* } $($tail:tt)*) =>{
$($ex)+ {
cai!($($b1)*);
}else{
cai!($($b2)*);
}
cai!($($tail)*)
};
(@expr_block ($($ex:tt)+) => { $($b1:tt)* } $($tail:tt)*) =>{
$($ex)+ {
cai!($($b1)*);
}
cai!($($tail)*)
};
({ $($b1:tt)* } $($tail:tt)*) =>{
{
cai!($($b1)*);
};
cai!($($tail)*)
};
(@split_exp_block ($($ex:tt)+) => { $($b:tt)* } $($tail:tt)*) => {
cai!(@expr_block ($($ex)+) => {$($b)*} $($tail)*)
};
(@split_exp_block ($($ex:tt)+) => $t:tt $($tail:tt)*) => {
cai!(@split_exp_block ($($ex)+ $t) => $($tail)*)
};
(if $t:tt $($tail:tt)*) => {
cai!(@split_exp_block (if $t) => $($tail)*)
};
(while $t:tt $($tail:tt)*) => {
cai!(@split_exp_block (while $t) => $($tail)*)
};
(break { $($b:tt)* } $($tail:tt)*) => {
break { cai!($($b)*); };
cai!($($tail)*)
};
(loop { $($b:tt)* } $($tail:tt)*) => {
loop { cai!($($b)*); } ;
cai!($($tail)*)
};
(for $t:tt $($tail:tt)*) => {
cai!(@split_exp_block (for $t) => $($tail)*)
};
({ $($b:tt)* } $($tail:tt)*) => {
{ cai!($($b:tt)*) }
cai!($($tail)*)
};
($id:ident ~ $ex:expr; $($tail:tt)*) => {
$id.custom_assign(cai!($ex));
cai!($($tail)*)
};
($($id:ident)+ $(: $type:ty)? : = $ex:expr; $($tail:tt)*) => {
$($id)+ $(: $type)? = CustomInitialize::custom_initialize(cai!($ex));
cai!($($tail)*)
};
($st:stmt; $($tail:tt)*) => {
$st
cai!($($tail)*)
};
($ex:expr) => {
$ex
};
() => {};
}
pub trait CustomAssign<Rhs=Self>{ fn custom_assign(&mut self, rhs:Rhs); }
pub trait CustomInitialize<Rhs=Self>{ fn custom_initialize(rhs:Rhs)->Self; }
impl<T> CustomAssign<T> for T{
#[inline(always)]
default fn custom_assign(&mut self, rhs:T){
*self=rhs
}
}
impl<T:Copy> CustomAssign<&T> for T{
#[inline(always)]
default fn custom_assign(&mut self, rhs:&T){
*self=*rhs
}
}
impl<'a,T:CustomAssign<&'a T>> CustomAssign<&'a mut T> for T{
#[inline(always)]
default fn custom_assign(&mut self, rhs:&'a mut T){
self.custom_assign(rhs as &T)
}
}
impl<T> CustomInitialize<T> for T{
#[inline(always)]
default fn custom_initialize(rhs:T)->Self{
rhs
}
}
impl<T:Copy> CustomInitialize<&T> for T{
#[inline(always)]
default fn custom_initialize(rhs:&T)->Self{
*rhs
}
}
impl<'a,T:CustomInitialize<&'a T>> CustomInitialize<&'a mut T> for T{
#[inline(always)]
default fn custom_initialize(rhs:&'a mut T)->Self{
Self::custom_initialize(rhs as &T)
}
}
}
pub mod prelude {
pub use super::{Oi32,Ei32,Ou32,Eu32,custom_ops::*};
}