1 module yyd.mashup; 2 3 public import yyd.y; 4 5 template __msg (string T) 6 { 7 pragma(msg, T); 8 enum __msg = T; 9 } 10 11 mixin template _msg (string T) 12 { 13 alias _ = __msg!(T); 14 enum toString = "__msg!(\""~ T ~ "\")"; 15 } 16 17 mixin template _compilesD(string T) { 18 enum toString = "__traits(compiles,"~T~")"; 19 enum _ = mixin(toString); 20 } 21 22 /*template __compilesD(string T) { 23 enum __compilesD = mixin("__traits(compiles,"~T~")"); 24 }*/ 25 26 unittest { 27 int x; 28 mixin _compilesD!(q{x=10}) _; 29 static assert(_._); 30 static assert(_y!_); 31 static assert(__toString!_ == "__traits(compiles,x=10)"); 32 } 33 34 unittest { 35 mixin _compilesD!(q{x=10}); 36 static assert(!_); 37 static assert(toString == "__traits(compiles,x=10)"); 38 } 39 40 unittest { 41 int x; 42 mixin _compilesD!(q{x=10}); 43 static assert(_); 44 static assert(toString == "__traits(compiles,x=10)"); 45 } 46 47 unittest { 48 mixin _compilesD!(q{x=10}); 49 static assert(!_); 50 static assert(toString == "__traits(compiles,x=10)"); 51 } 52 53 54 55 unittest { 56 mixin _compilesD!(q{blah,blah}) _; 57 58 static assert(_._ is false); 59 static assert(_y!_ is false); 60 61 mixin _msg!(__toString!_); 62 63 static assert(__toString!_ == "__traits(compiles,blah,blah)"); 64 static assert(mixin(_.toString) is false); 65 } 66 67 unittest { 68 mixin _msg!("Unit test") _; 69 70 static assert(_.toString == "__msg!(\"Unit test\")"); 71 static assert(__toString!_ == "__msg!(\"Unit test\")"); 72 enum x = mixin(_.toString); 73 74 mixin _toString!_ s; 75 static assert(__toString!s == "__toString!(\"__msg!(\"Unit test\")\")"); 76 77 } 78 79 template __toString(alias T) 80 if(is(typeof(T.toString))) 81 { 82 alias __toString = T.toString; 83 } 84 85 template __toString(alias T) 86 if( 87 !is(typeof(T.toString)) 88 /*&& ( 89 is(typeof(T) == bool) 90 )*/ 91 ) 92 { 93 alias __toString = T; 94 } 95 96 97 mixin template _toString(alias T) { 98 enum _ = __toString!T; 99 enum toString = "__toString!(\"" ~ _ ~ "\")"; 100 } 101 102 template __mixinD(string T) { 103 enum __mixinD = mixin(T); 104 } 105 106 mixin template _mixinD (string T) 107 { 108 enum _ = mixin(T); 109 enum toString = "mixin(" ~ T ~ ")"; 110 } 111 112 mixin template _mixin_t (alias T = _identity, U ...) 113 { 114 mixin T!U; 115 } 116 117 unittest { 118 template X() { 119 struct _X { 120 auto ten() { 121 return 10; 122 } 123 } 124 } 125 alias f = { 126 mixin _mixin_t!X; 127 return _X(); 128 }; 129 assert(f().ten == 10); 130 } 131 132 mixin template _mixin_mt (alias T = _identity) 133 { 134 mixin template _(U...) { 135 mixin T!U; 136 } 137 } 138 139 unittest { 140 141 // A mixin that generates a struct called GeneratedStruct. 142 mixin template generateStruct() { 143 struct GeneratedStruct { 144 auto ten() { 145 return 10; 146 } 147 } 148 } 149 150 // Creates a new mixin template that pulls in generateStruct for the 151 // body. 152 // Need to create an alias to the mixin before use. 153 mixin _mixin_mt!generateStruct; 154 alias generate = _; 155 156 // Function that includes the mixin and returns an instance of the 157 // struct defined within. 158 alias f = { 159 mixin generate; 160 return GeneratedStruct(); 161 }; 162 163 // GeneratedStruct isn't visible to the program. 164 static assert(!is(typeof(GeneratedStruct))); 165 166 // Create an instant of GeneratedStruct. 167 static assert(f().ten == 10); 168 } 169 170 template mixin_t (alias T = _identity, U ...) 171 { 172 mixin T!U mixin_t; 173 } 174 175 mixin template mixin_all(T ...) 176 if(T.length == 0) 177 {} 178 179 mixin template mixin_all(T ...) 180 if(T.length == 1) 181 { 182 alias _front = T[0]; 183 mixin _front; 184 } 185 186 mixin template mixin_all(T ...) 187 if(T.length > 1) 188 { 189 alias _front = T[0]; 190 mixin _front; 191 mixin mixin_all!(T[1..$]); 192 } 193 194 195 mixin template _contract (alias Cond, alias Fnc = identity) 196 { 197 template _ () 198 if(Cond) 199 { 200 alias _ = Fnc; 201 } 202 203 template _ (U...) 204 if(Cond) 205 { 206 alias _ = Fnc!U; 207 } 208 209 enum toString = q{ 210 template _ () 211 if(} ~ Cond ~ q{) 212 { 213 alias _ = } ~ Fnc ~ q{; 214 } 215 216 template _ (U...) 217 if(} ~ Cond ~ q{) 218 { 219 alias _ = } ~ Fnc ~ q{!U; 220 } 221 222 }; 223 } 224 225 mixin template _ncontract (alias Cond, alias Fnc = identity) 226 { 227 mixin _contract!(!Cond,Fnc); 228 } 229 230 unittest { 231 mixin _contract!(true,"Test"); 232 static assert(_!() == "Test"); 233 } 234 235 unittest { 236 mixin _ncontract!(false,"Test"); 237 static assert(_!() == "Test"); 238 } 239 240 mixin template _contractm (alias Cond,alias Fnc=identity) 241 { 242 mixin template _ (U...) 243 if(Cond) 244 { 245 alias _ = Fnc!U; 246 } 247 } 248 249 mixin template _mcontractm(alias Cond,alias Fnc=_identity) { 250 mixin template _ (U...) 251 if(Cond) 252 { 253 mixin Fnc!U; 254 } 255 } 256 257 template contract(alias Cond,alias Fnc=identity) 258 if (Cond) 259 { 260 alias contract = Fnc; 261 } 262 263 mixin template _ncontractm(alias Cond,alias Fnc=identity) 264 { 265 mixin template _ (U...) 266 if(!Cond) 267 { 268 alias _ = Fnc!U; 269 } 270 } 271 272 template ncontract(alias Cond,alias Fnc=identity) 273 if (!Cond) 274 { 275 alias ncontract = Fnc; 276 } 277 278 unittest { 279 static assert(!is(typeof(contract!(false,"Test")))); 280 static assert(is(typeof(contract!(true,"Test")) == string)); 281 static assert(contract!(true,"Test")=="Test"); 282 } 283 284 unittest { 285 mixin _contractm!(true,identity) m; 286 //static assert(is(typeof(m._!(true)))); 287 mixin m._!("Test") n; 288 static assert(n._ == "Test"); 289 } 290 291 unittest { 292 mixin _contractm!(false,identity) m; 293 //static assert(!is(typeof(m._!(true)))); 294 //mixin m._!("Test") n; 295 //mixin m._!() n; 296 //assert(n._ == "Test"); 297 } 298 299 unittest { 300 mixin _contract!(false,"Test"); 301 static assert(!is(typeof(_!()))); 302 // static assert(is(typeof(_) == void)); 303 } 304 305 unittest { 306 mixin _contract!(true,"Test"); 307 static assert(_!() == "Test"); 308 } 309 310 unittest { 311 mixin _contract!(true,identity); 312 static assert(_!("Test") == "Test"); 313 } 314 315 unittest { 316 alias c = mixin_t!(_contract,true,identity); 317 //static assert(is(typeof(c._))); 318 mixin c._!("Test") d; 319 static assert(d._ == "Test"); 320 321 mixin _mixin_t!(_contract,true,identity) e; 322 mixin e._!("Test") f; 323 static assert(f._ == "Test"); 324 325 mixin _mixin_t!(_contract,false,identity) g; 326 static assert(is(typeof(g._) == void)); 327 328 } 329 330 mixin template _import(string name,alias T=_identity,V...) { 331 mixin("import " ~ name ~ ";"); 332 //enum toString = "import " ~ name ~ ";"; 333 mixin T!V _; 334 } 335 336 /* 337 mixin template _import(string name,tokens...) { 338 import std.array : join; 339 enum _tokens = tokens.join(","); 340 mixin("import " ~ name ~ ":" ~ _tokens ~ ";"); 341 enum toString = "import " ~ name ~ " : " ~ _tokens ~ ";"; 342 }*/ 343 344 template __importFile(string name) { 345 enum __importFile=import(name); 346 } 347 348 mixin template _importFile(string name) { 349 enum _ = __importFile!(name); 350 enum toString = "importFile! (" ~ name ~ ")"; 351 } 352 353 mixin template _main(alias _body=_identity) { 354 auto main(string[] args) { 355 mixin _body; 356 } 357 } 358 359