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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#[macro_export] macro_rules! analit ( ( +-- $($t:tt)+) => (analit!(X 1 , , ;$($t)+)); (X $x:expr, , ; -- $($t:tt)+) => (analit!(X $x+1, , ;$($t)+)); (X $x:expr, , ; + ) => (($x)); ( +| $($t:tt)+) => (analit!(Y 1 , , ;$($t)+)); (Y $x:expr, , ; | $($t:tt)+) => (analit!(Y $x+1, , ;$($t)+)); (Y $x:expr, , ; + ) => (($x)); ( +/ $($t:tt)+) => (analit!(Z 1 , , ;$($t)+)); (Z $x:expr, , ; / $($t:tt)+) => (analit!(Z $x+1, , ;$($t)+)); (Z $x:expr, , ; + ) => (($x)); (X $x:expr, , ; +/ $($t:tt)+) => (analit!(XZ $x ,1 , ;$($t)+)); (XZ $x:expr,$y:expr, ; / $($t:tt)+) => (analit!(XZ $x ,$y+1, ;$($t)+)); (XZ $x:expr,$y:expr, ; + $($t:tt)+) => (($x,$y/2)); (X $x:expr, , ; +| $($t:tt)+) => (analit!(XY $x ,1 , ;$($t)+)); (XY $x:expr,$y:expr, ; | $($t:tt)+) => (analit!(XY $x ,$y+1, ;$($t)+)); (XY $x:expr,$y:expr, ; +- $($t:tt)+) => (($x,$y/2)); (Z $x:expr, , ; | $($t:tt)+) => (analit!(YZ $x ,1 , ;$($t)+)); (YZ $x:expr,$y:expr, ; | $($t:tt)+) => (analit!(YZ $x ,$y+1, ;$($t)+)); (YZ $x:expr,$y:expr, ; / $($t:tt)+) => (analit!(YZ $x+1,$y , ;$($t)+)); (YZ $x:expr,$y:expr, ; + $($t:tt)+) => (analit!(YZ $x ,$y , ;$($t)+)); (YZ $x:expr,$y:expr, ; + ) => (($x/2,$y/2)); (XZ $x:expr,$y:expr, ; | $($t:tt)+) => (analit!(XYZ $x ,1 ,$y*2;$($t)+)); (XYZ $x:expr,$y:expr,$z:expr; | $($t:tt)+) => (analit!(XYZ $x ,$y+1,$z ;$($t)+)); (XYZ $x:expr,$y:expr,$z:expr; / $($t:tt)+) => (analit!(XYZ $x ,$y ,$z+1;$($t)+)); (XYZ $x:expr,$y:expr,$z:expr; - $($t:tt)+) => (analit!(XYZ $x ,$y ,$z ;$($t)+)); (XYZ $x:expr,$y:expr,$z:expr; + $($t:tt)+) => (analit!(XYZ $x ,$y ,$z ;$($t)+)); (XYZ $x:expr,$y:expr,$z:expr; + ) => (($x, $y/3, $z/3)); ); #[test] fn one_dimension() { assert_eq!(2, analit!( +----+ )); assert_eq!(2, analit!( + | | + )); assert_eq!(2,analit!( + / / + )); } #[test] fn two_dimensional() { assert_eq!((2,1),analit!( +----+ | | +----+ )); assert_eq!((2,1),analit!( +----+ / / +----+ )); assert_eq!((2,1),analit!( + /| / + + / |/ + )); assert_eq!((1,1),analit!( + /| + + |/ + )); assert_eq!((1,2),analit!( + /| + | | + |/ + )); } #[test] fn three_dimensional() { assert_eq!((1,1,3),analit!( +--+ / /| / / + / / / +--+ / | |/ +--+ )); assert_eq!((4,1,1),analit!( +--------+ / /| +--------+ + | |/ +--------+ )); }