#[macro_export]
macro_rules! macro_if {
(if let $i:ident = t:($x:expr) $tb:block else $fb:block) => {{
let $i = $x;
$tb
}};
(if let $i:ident = $tb:block else $fb:block) => {{
$fb
}};
}
#[macro_export]
macro_rules! body {
(($lab:tt => $res:tt.$f:tt($($exp:expr),+))) => ($res.$f($($exp),+));
(($lab:tt => $res:tt.$f:tt($($exp:expr),+)) if( $($t:tt)+ ) $($other:tt)*) => {
if $($t)+ {
body!(($lab => $res.$f($($exp),+)) $($other)* );
} else {
continue $lab;
}
};
(($lab:tt => $res:tt.$f:tt($($exp:expr),+)) for( $($t:tt)+ ) $($other:tt)*) => {
for $($t)+ {
body!(($lab => $res.$f($($exp),+)) $($other)* );
}
};
}
#[macro_export]
macro_rules! head {
(($res:ident.$f:tt($($exp:expr),+)) for( $($t:tt)+ ) $($other:tt)*) => {
#[allow(unused_labels)]
'set_derive_top: for $($t)+ {
#[warn(unused_labels)]
{
body!(('set_derive_top => $res.$f($($exp),+)) $($other)* );
}
}
};
}
#[macro_export]
macro_rules! set_derive {
($(<$($ty:ty),+>)? $(($cap:expr))?[$exp:expr; $($t:tt)+]) => {{
let mut _macro_set_derive_result = macro_if!{
if let cap = $(t:($cap))? {
Vec::$(<$($ty),+>::)?with_capacity(cap)
} else {
Vec::$(<$($ty),+>::)?new()
}
};
head!((_macro_set_derive_result.push($exp)) $($t)+);
_macro_set_derive_result
}};
($(<$($ty:ty),+>)? $(($cap:expr))?{$exp:expr; $($t:tt)+}) => {{
let mut _macro_set_derive_result = macro_if!{
if let cap = $(t:($cap))? {
std::collections::HashSet::$(<$($ty),+>::)?with_capacity(cap)
} else {
std::collections::HashSet::$(<$($ty),+>::)?new()
}
};
head!((_macro_set_derive_result.insert($exp)) $($t)+);
_macro_set_derive_result
}};
($(<$($ty:ty),+>)? $(($cap:expr))?{$k:expr => $v:expr; $($t:tt)+}) => {{
let mut _macro_set_derive_result = macro_if!{
if let cap = $(t:($cap))? {
std::collections::HashMap::$(<$($ty),+>::)?with_capacity(cap)
} else {
std::collections::HashMap::$(<$($ty),+>::)?new()
}
};
head!((_macro_set_derive_result.insert($k, $v)) $($t)+);
_macro_set_derive_result
}};
}