1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
macro_rules! forward { ($(fn $method:ident(&self $(, $arg:ident: $ty:ty)*) -> $rty:ty;)*) => { $( #[inline] fn $method(&self $(, $arg: $ty )*) -> $rty { Self::$method(*self $(, $arg)*) } )* }; ($(fn $method:ident(self $(, $arg:ident: $ty:ty)*) -> $rty:ty;)*) => { $( #[inline] fn $method(self $(, $arg: $ty )*) -> $rty { Self::$method(self $(, $arg)*) } )* }; ($(const $cons:ident: $path:path;)*) => { $( const $cons: Self = <$path>::$cons; )* }; } macro_rules! impl_set { ($($operator:ident | $operation:ident => $($set:ty),*);* $(;)?) => { $( $( impl Set<$operator> for $set { #[inline] fn operate(&self, rhs: Self) -> Self { self.$operation(rhs) } } )* )* } } macro_rules! impl_identity { ($($identity:expr => $operator:ident => $($t:ty),*);* $(;)?) => { $( $( impl Identity<$operator> for $t { #[inline] fn identity() -> $t { $identity } #[inline] fn is_identity(&self) -> bool { *self == $identity } } )* )* } } macro_rules! impl_properties { ($($marker:ty => $($set:ident),*);* $(;)?) => { $( $( impl $marker for $set {} )* )* } } macro_rules! impl_invertible_add { ($($set:ident)*) => { $( impl Invertible<Additive> for $set { #[inline] fn inverse(&self) -> Self { -*self } #[inline] fn inverted(&mut self) { *self = -*self } } )* }; } macro_rules! impl_invertible_mul { ($($set:ident)*) => { $( impl Invertible<Multiplicative> for $set { #[inline] fn inverse(&self) -> Self { 1.0 / self } #[inline] fn inverted(&mut self) { *self = 1.0 / *self } } )* } }