1 module yyd.arith; 2 3 private import yyd.y : _y; 4 5 // Arithmatic expression evaluator templates 6 7 template add(alias A, alias B) 8 { 9 enum add = A + B; 10 } 11 12 template sub(alias A, alias B) 13 { 14 enum sub = A - B; 15 } 16 17 template mul(alias A, alias B) 18 { 19 enum mul = A * B; 20 } 21 22 template div(alias A, alias B) 23 { 24 enum div = A / B; 25 } 26 27 28 template booleanOr(alias A, alias B) 29 { 30 enum booleanOr = A | B; 31 } 32 33 template booleanAnd(alias A, alias B) 34 { 35 enum booleanAnd = A & B; 36 } 37 38 template logicalOr(alias A, alias B) 39 { 40 enum logicalOr = A || B; 41 } 42 43 template logicalAnd(alias A, alias B) 44 { 45 enum logicalAnd = A && B; 46 } 47 48 template concat(alias A, alias B) 49 { 50 enum concat = A ~ B; 51 } 52 53 template equal(alias A, alias B) 54 { 55 enum equal = A == B; 56 } 57 58 template notEqual(alias A, alias B) 59 { 60 enum equal = A != B; 61 } 62 63 template condExpr(alias cond, alias _if, alias _else) 64 { 65 enum condExpr = cond ? _if : _else; 66 } 67 68 template sum(T...) 69 if(T.length == 0) 70 {} 71 72 template sum(T...) 73 if(T.length == 1) 74 { 75 enum sum = T[0]; 76 } 77 78 template sum(T...) 79 if (T.length > 1) 80 { 81 enum sum = add!(T[0],sum!(T[1..$])); 82 } 83 84 unittest { 85 static assert(sum!(1,1,1) == 3); 86 } 87 88 template concantenate(T...) if(T.length == 0) 89 {} 90 91 template concantenate(T...) if(T.length == 1) 92 { 93 enum concantenate = T[0]; 94 } 95 96 template concantenate(T...) if(T.length > 1) 97 { 98 enum concantenate = concat!(T[0],concantenate!(T[1..$])); 99 } 100 101 unittest { 102 static assert(concantenate!("a","a","a") == "aaa"); 103 } 104 105 106 mixin template _add(alias A, alias B) 107 { 108 alias _ = add!(A,B); 109 } 110 111 mixin template _sub(alias A, alias B) 112 { 113 alias _ = sub!(A,B); 114 } 115 116 mixin template _mul(alias A, alias B) 117 { 118 alias _ = mul!(A,B); 119 } 120 121 mixin template _div(alias A, alias B) 122 { 123 alias _ = div!(A,B); 124 } 125 126 mixin template _concat(alias A, alias B) 127 { 128 alias _ = concat!(A,B); 129 } 130 131 mixin template _sum(T...) 132 { 133 alias _ = sum!(T); 134 } 135 136 mixin template _concantenate(T...) 137 { 138 alias _ = concantenate!(T); 139 } 140 141 142 unittest { 143 mixin _sum!(1,1,1) t; 144 static assert (_y!t == 3); 145 } 146 147 unittest { 148 mixin _concantenate!("a","b","c") t; 149 static assert (_y!t == "abc"); 150 } 151 152 //alias add(A,B) = (const A a, const B b) => a + b; 153 //alias sub(A,B) = (const A a, const B b) => a - b; 154 //alias mul(A,B) = (A a, B b) => a * b; 155 //alias div(A,B) = (const A a, const B b) => a / b; 156 157 alias add_(alias A,alias B) = () => A() + B(); 158 alias sub_(alias A,alias B) = () => A() - B(); 159 alias mul_(alias A,alias B) = () => A() * B(); 160 alias div_(alias A,alias B) = () => A() / B(); 161 162 163 alias booleanOr_(alias A, alias B) = () => A() | B(); 164 alias booleanAnd_(alias A, alias B) = () => A() & B(); 165 alias logicalOr_(alias A, alias B) = () => A() || B(); 166 alias logicalAnd_(alias A, alias B) = () => A() && B(); 167 168 alias concat_(alias A, alias B) = () => A() ~ B(); 169 170 alias equal_(alias A, alias B) = () => A() == B(); 171 alias notEqual_(alias A, alias B) = () => A() != B(); 172 173 alias condExpr_(alias Cond, alias _If, alias _Else) = () => Cond() ? _If() : _Else(); 174 175 176 177 //alias add(A,B) = (const A function() a,const B function() b) => add!(a,b); 178 179 //alias sub(A,B) = (const A function() a,const B function() b) => sub!(a,b); 180 181 //alias mul(A,B) = (const A function() a,const B function() b) => mul!(a,b); 182 183 //alias div(A,B) = (const A function() a,const B function() b) => div!(a,b); 184 185 template addTo(alias T) 186 { 187 alias addTo(V) = () => T += V; 188 } 189 190 template addToX(alias T) 191 { 192 alias addToX(V) = (V v) => T += v; 193 } 194 195 mixin template _addTo(alias T,alias V) 196 { 197 alias _ = addTo!(T,V); 198 } 199