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 }