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