overload/
unary.rs

1#[doc(hidden)]
2#[macro_export(local_inner_macros)]
3macro_rules! _overload_unary {
4    (-, $($t:tt)+) => (_overload_unary_internal!(Neg, neg, $($t)+););
5    (!, $($t:tt)+) => (_overload_unary_internal!(Not, not, $($t)+););
6}
7
8#[doc(hidden)]
9#[macro_export(local_inner_macros)]
10macro_rules! _overload_unary_internal {
11    ($op_trait:ident, $op_fn:ident, $i:ident, $t:ty, $out:ty, $body:block) => (        
12        impl ops::$op_trait for $t {
13            type Output = $out;
14            fn $op_fn(self) -> Self::Output {
15                let $i = self;
16                $body
17            }
18        }
19    );
20}