1 module yyd.tool;
2 
3 public import yyd.y;
4 public import yyd.alg;
5 
6 // Compilation primitives and mixin combinators
7 
8 template __msg ( T ... ) 
9 {
10     pragma(msg, T);
11 }
12 
13 /* mixin template _msg ( T ... ) 
14 {
15     pragma(msg,T);
16 } */
17 
18 mixin template _compilesD(string T) 
19 {
20     enum _ = mixin("__traits(compiles,"~T~")");
21 }
22 
23 unittest {
24     mixin _compilesD!(q{blah,blah});
25     static assert(_ is false);
26 }
27 
28 unittest {
29     int x;
30     mixin _compilesD!(q{x=10});
31     static assert(_);
32 }
33 
34 mixin template __mixinD (string T) 
35 {
36     alias _ = mixin(T);
37 }
38 
39 mixin template _mixin_t (alias T = _identity, U ...) 
40 {
41     mixin T!U;
42 }
43 
44 mixin template _mixin_mt (alias T = _identity) 
45 {
46     mixin template _(U...) {
47         mixin T!U;
48     }
49 }
50 
51 template mixin_t (alias T = _identity, U ...) 
52 {
53     mixin T!U mixin_t;
54 }
55 
56 mixin template mixin_all(T ...)
57 if(T.length == 0)
58 {}
59 
60 mixin template mixin_all(T ...)
61 if(T.length == 1)
62 {
63     alias _front = T[0];
64     mixin _front;
65 }
66 
67 mixin template mixin_all(T ...)
68 if(T.length > 1)
69 {
70     alias _front = T[0];
71     mixin _front;
72     mixin mixin_all!(T[1..$]);
73 }
74 
75 mixin template bind(string label,alias T=identity)
76 {
77     mixin("alias " ~ label ~ " = T;");
78 }
79 
80 unittest {
81     enum a = 0;
82     mixin bind!("b",a);
83     static assert(is(typeof(b) == typeof(a)));
84     static assert(b is a);
85 }
86 
87 mixin template assertion (alias T) 
88 {
89     static assert (T);
90     enum _ = true;
91 }
92 
93 unittest {
94     mixin assertion!true;
95     //mixin assertion!false;
96     static assert(is(typeof(_)));
97     static assert(_);
98 }
99 
100 mixin template _contract (alias Cond, alias Fnc = identity) 
101 {
102     template _ () 
103     if(Cond) 
104     {
105         alias _ = Fnc;
106     }
107     
108     template _ (U...) 
109     if(Cond) 
110     {
111         alias _ = Fnc!U;
112     }
113 }
114 
115 mixin template _ncontract (alias Cond, alias Fnc = identity) 
116 {
117     mixin _contract!(!Cond,Fnc);
118 }
119 
120 unittest {
121     mixin _contract!(true,"Test");
122     static assert(_!() == "Test");
123 }
124 
125 unittest {
126     mixin _ncontract!(false,"Test");
127     static assert(_!() == "Test");
128 }
129 
130 mixin template _contractm (alias Cond,alias Fnc=identity) 
131 {
132     mixin template _ (U...) 
133     if(Cond) 
134     {
135         alias _ = Fnc!U;
136     }
137 }
138 
139 mixin template _mcontractm(alias Cond,alias Fnc=_identity) {
140     mixin template _ (U...) 
141     if(Cond) 
142     {
143         mixin Fnc!U;
144     }
145 }
146 
147 template contract(alias Cond,alias Fnc=identity) 
148 if (Cond) 
149 {
150     alias contract = Fnc;
151 }
152 
153 mixin template _ncontractm(alias Cond,alias Fnc=identity) 
154 {
155     mixin template _ (U...) 
156     if(!Cond) 
157     {
158         alias _ = Fnc!U;
159     }
160 }
161 
162 template ncontract(alias Cond,alias Fnc=identity) 
163 if (!Cond) 
164 {
165     alias ncontract = Fnc;
166 }
167 
168 unittest {
169     static assert(!is(typeof(contract!(false,"Test"))));
170     static assert(is(typeof(contract!(true,"Test")) == string));
171     static assert(contract!(true,"Test")=="Test");
172 }
173 
174 unittest {
175     mixin _contractm!(true,identity) m;
176     //static assert(is(typeof(m._!(true))));
177     mixin m._!("Test") n;
178     static assert(n._ == "Test");
179 }
180 
181 unittest {
182     mixin _contractm!(false,identity) m;
183     //static assert(!is(typeof(m._!(true))));
184     //mixin m._!("Test") n;
185     //mixin m._!() n;
186     //assert(n._ == "Test");
187 }
188 
189 unittest {
190     mixin _contract!(false,"Test");
191     static assert(!is(typeof(_!())));
192 //    static assert(is(typeof(_) == void));
193 }
194 
195 unittest {
196     mixin _contract!(true,"Test");
197     static assert(_!() == "Test");
198 }
199 
200 unittest {
201     mixin _contract!(true,identity);
202     static assert(_!("Test") == "Test");
203 }
204 
205 unittest {
206     alias c = mixin_t!(_contract,true,identity);
207     //static assert(is(typeof(c._)));
208     mixin c._!("Test") d;
209     static assert(d._ == "Test");
210 
211     mixin _mixin_t!(_contract,true,identity) e;
212     mixin e._!("Test") f;
213     static assert(f._ == "Test");
214 
215     mixin _mixin_t!(_contract,false,identity) g;
216     //static assert(!is(typeof(g._)));
217 
218 }
219 
220 mixin template _version (
221         alias Fnc = _identity,
222         alias N = _identity,
223         V ...
224 ) {
225     version (V) {
226         mixin Fnc;
227     } else {
228         mixin N;
229     }
230 }
231 
232 template version_ (
233         string V,
234         alias Fnc = identity,
235         alias N = identity
236 ) {
237     mixin(q{
238         version ( } ~ V ~ q{ ) {
239             alias version_ = Fnc;
240         } else {
241             alias version_ = N;       
242         }
243     });
244 }
245 
246 unittest {
247     alias r = version_!("unittest",true,false);
248     static assert (r);
249 }
250 
251 mixin template tryCatch(alias _try, _catchType, alias _catchBody, alias _finally)
252 {
253     alias _f = () {        
254         try {
255             mixin _try!();
256         } catch (_catchType e) {
257             mixin _catchBody!(e);
258         } finally {
259             mixin _finally!();
260         }
261     };
262     alias _ = _f();
263 }
264 
265 mixin template _public(alias T=_indentity) 
266 {
267     public {
268         mixin T!();
269     }
270 }
271 
272 mixin template _protected(alias T=_indentity) 
273 {
274     protected {
275         mixin T!();
276     }
277 }
278 
279 mixin template _private(alias T=_indentity) 
280 {
281     private {
282         mixin T!();
283     }
284 }
285 
286 mixin template _package(alias T=_indentity) 
287 {
288     package {
289         mixin T!();
290     }
291 }
292 
293 mixin template _interface(alias T=_indentity) 
294 {
295     interface _ {
296         mixin T!();
297     }
298 }
299 
300 mixin template _interface(alias T=_indentity,interfaces ...) 
301 {
302     interface _ : interfaces {
303         mixin T!();
304     }
305 }
306 
307 mixin template _struct(alias T=_indentity) 
308 {
309     struct _ {
310         mixin T!();
311     }
312 }
313 
314 mixin template _class(alias T=_indentity) 
315 {
316     class _ {
317         mixin T!();
318     }
319 }
320 
321 mixin template _class(alias T=_indentity,superClass) 
322 {
323     class _ : superClass {
324         mixin T!();
325     }
326 }
327 
328 mixin template _class(alias T=_indentity,superClass,interfaces ...) 
329 {
330     class _ : superClass, interfaces {
331         mixin T!();
332     }
333 }
334 
335 mixin template _aliasThis(alias T=identity)
336 {
337     alias T this;
338 }
339 
340 mixin template _fnc(alias T=_identity,U ...)
341 {
342     alias _ = (U u) {
343         mixin T!();
344     };
345 }
346 
347 mixin template template_(alias T=_identity,U ...)
348 {
349     alias _ = T!(U);
350 }
351 
352 
353 mixin template _template(alias T=_identity,U ...)
354 {
355     template _ (U) {
356         mixin T!();
357     }
358 }
359 
360 mixin template _mtemplate(alias T=_identity,U ...)
361 {
362     mixin template _ (U) {
363         mixin T!();
364     }
365 }
366 
367 mixin template _exitScope(alias T=_identity,alias V=_identity)
368 {
369     alias _ = () {
370         scope(exit) {
371             mixin V!();
372         }
373         mixin T!();
374     };
375 }