Artifact bd0c6e24fe1ad6bafcb4620bea3b7e102e093d2f:
0000: ef bb bf 6d 6f 64 75 6c 65 20 70 6f 6c 65 6d 79 ...module polemy
0010: 2e 74 72 69 63 6b 73 3b 0d 0a 2f 2a 0d 0a 20 2a .tricks;../*.. *
0020: 20 41 75 74 68 6f 72 3a 20 20 6b 2e 69 6e 61 62 Author: k.inab
0030: 61 0d 0a 20 2a 20 4c 69 63 65 6e 73 65 3a 20 4e a.. * License: N
0040: 59 53 4c 20 30 2e 39 39 38 32 20 28 68 74 74 70 YSL 0.9982 (http
0050: 3a 2f 2f 77 77 77 2e 6b 6d 6f 6e 6f 73 2e 6e 65 ://www.kmonos.ne
0060: 74 2f 6e 79 73 6c 2f 0d 0a 20 2a 20 20 20 54 72 t/nysl/.. * Tr
0070: 69 63 6b 73 20 61 6e 64 20 75 74 69 6c 69 74 69 icks and utiliti
0080: 65 73 20 66 6f 72 20 44 20 70 72 6f 67 72 61 6d es for D program
0090: 6d 69 6e 67 0d 0a 20 2a 2f 0d 0a 73 74 61 74 69 ming.. */..stati
00a0: 63 20 69 6d 70 6f 72 74 20 73 74 64 2e 61 72 72 c import std.arr
00b0: 61 79 3b 0d 0a 73 74 61 74 69 63 20 69 6d 70 6f ay;..static impo
00c0: 72 74 20 73 74 64 2e 66 6f 72 6d 61 74 3b 0d 0a rt std.format;..
00d0: 0d 0a 2f 2f 2f 20 53 69 6d 70 6c 65 20 57 72 61 ../// Simple Wra
00e0: 70 70 65 72 20 66 6f 72 20 73 74 64 2e 66 6f 72 pper for std.for
00f0: 6d 61 74 2e 64 6f 46 6f 72 6d 61 74 0d 0a 0d 0a mat.doFormat....
0100: 73 74 72 69 6e 67 20 73 70 72 69 6e 74 66 28 73 string sprintf(s
0110: 74 72 69 6e 67 20 66 6d 74 2c 20 54 2e 2e 2e 29 tring fmt, T...)
0120: 28 54 20 70 61 72 61 6d 73 29 0d 0a 7b 0d 0a 09 (T params)..{...
0130: 61 75 74 6f 20 77 72 69 74 65 72 20 3d 20 73 74 auto writer = st
0140: 64 2e 61 72 72 61 79 2e 61 70 70 65 6e 64 65 72 d.array.appender
0150: 21 73 74 72 69 6e 67 28 29 3b 0d 0a 09 73 74 64 !string();...std
0160: 2e 66 6f 72 6d 61 74 2e 66 6f 72 6d 61 74 74 65 .format.formatte
0170: 64 57 72 69 74 65 28 77 72 69 74 65 72 2c 20 66 dWrite(writer, f
0180: 6d 74 2c 20 70 61 72 61 6d 73 29 3b 0d 0a 09 72 mt, params);...r
0190: 65 74 75 72 6e 20 77 72 69 74 65 72 2e 64 61 74 eturn writer.dat
01a0: 61 3b 0d 0a 7d 0d 0a 0d 0a 75 6e 69 74 74 65 73 a;..}....unittes
01b0: 74 0d 0a 7b 0d 0a 09 61 73 73 65 72 74 28 20 73 t..{...assert( s
01c0: 70 72 69 6e 74 66 21 22 25 73 20 3d 3d 20 25 64 printf!"%s == %d
01d0: 22 28 22 31 2b 32 22 2c 20 33 29 20 3d 3d 20 22 "("1+2", 3) == "
01e0: 31 2b 32 20 3d 3d 20 33 22 20 29 3b 0d 0a 09 61 1+2 == 3" );...a
01f0: 73 73 65 72 74 28 20 73 70 72 69 6e 74 66 21 22 ssert( sprintf!"
0200: 25 73 20 3d 3d 20 25 30 34 64 22 28 22 31 2b 32 %s == %04d"("1+2
0210: 22 2c 20 33 29 20 3d 3d 20 22 31 2b 32 20 3d 3d ", 3) == "1+2 ==
0220: 20 30 30 30 33 22 20 29 3b 0d 0a 7d 0d 0a 0d 0a 0003" );..}....
0230: 2f 2f 2f 20 4d 69 78 69 6e 67 2d 69 6e 20 74 68 /// Mixing-in th
0240: 65 20 62 65 61 6e 20 63 6f 6e 73 74 72 75 63 74 e bean construct
0250: 6f 72 20 66 6f 72 20 61 20 63 6c 61 73 73 0d 0a or for a class..
0260: 0d 0a 2f 2a 6d 69 78 69 6e 2a 2f 20 74 65 6d 70 ../*mixin*/ temp
0270: 6c 61 74 65 20 53 69 6d 70 6c 65 43 6f 6e 73 74 late SimpleConst
0280: 72 75 63 74 6f 72 28 29 0d 0a 7b 0d 0a 09 73 74 ructor()..{...st
0290: 61 74 69 63 20 69 66 28 20 69 73 28 74 79 70 65 atic if( is(type
02a0: 6f 66 28 73 75 70 65 72 29 20 3d 3d 20 4f 62 6a of(super) == Obj
02b0: 65 63 74 29 20 7c 7c 20 73 75 70 65 72 2e 74 75 ect) || super.tu
02c0: 70 6c 65 6f 66 2e 6c 65 6e 67 74 68 3d 3d 30 20 pleof.length==0
02d0: 29 0d 0a 09 09 74 68 69 73 28 20 74 79 70 65 6f )....this( typeo
02e0: 66 28 74 68 69 73 2e 74 75 70 6c 65 6f 66 29 20 f(this.tupleof)
02f0: 70 61 72 61 6d 73 20 29 0d 0a 09 09 7b 0d 0a 09 params )....{...
0300: 09 09 74 68 69 73 2e 74 75 70 6c 65 6f 66 20 3d ..this.tupleof =
0310: 20 70 61 72 61 6d 73 3b 0d 0a 09 09 7d 0d 0a 09 params;....}...
0320: 65 6c 73 65 0d 0a 09 09 2f 2f 20 74 68 69 73 20 else....// this
0330: 70 61 72 61 6d 65 74 65 72 20 6c 69 73 74 20 69 parameter list i
0340: 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 64 65 73 s not always des
0350: 69 72 61 62 6c 65 20 62 75 74 20 73 68 6f 75 6c irable but shoul
0360: 64 20 77 6f 72 6b 20 66 6f 72 20 6d 61 6e 79 20 d work for many
0370: 63 61 73 65 73 0d 0a 09 09 74 68 69 73 28 20 74 cases....this( t
0380: 79 70 65 6f 66 28 73 75 70 65 72 2e 74 75 70 6c ypeof(super.tupl
0390: 65 6f 66 29 20 70 73 2c 20 74 79 70 65 6f 66 28 eof) ps, typeof(
03a0: 74 68 69 73 2e 74 75 70 6c 65 6f 66 29 20 70 61 this.tupleof) pa
03b0: 72 61 6d 73 20 29 0d 0a 09 09 7b 0d 0a 09 09 09 rams )....{.....
03c0: 73 75 70 65 72 28 70 73 29 3b 0d 0a 09 09 09 74 super(ps);.....t
03d0: 68 69 73 2e 74 75 70 6c 65 6f 66 20 3d 20 70 61 his.tupleof = pa
03e0: 72 61 6d 73 3b 0d 0a 09 09 7d 0d 0a 7d 0d 0a 0d rams;....}..}...
03f0: 0a 2f 2f 2f 20 4d 69 78 69 6e 67 2d 69 6e 20 74 ./// Mixing-in t
0400: 68 65 20 28 4d 4f 53 54 2d 44 45 52 49 56 45 44 he (MOST-DERIVED
0410: 29 20 6d 65 6d 62 65 72 2d 77 69 73 65 20 63 6f ) member-wise co
0420: 6d 70 61 72 61 74 6f 72 20 66 6f 72 20 61 20 63 mparator for a c
0430: 6c 61 73 73 0d 0a 0d 0a 2f 2a 6d 69 78 69 6e 2a lass..../*mixin*
0440: 2f 20 74 65 6d 70 6c 61 74 65 20 53 69 6d 70 6c / template Simpl
0450: 65 43 6f 6d 70 61 72 65 28 29 0d 0a 7b 0d 0a 09 eCompare()..{...
0460: 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 6f 70 override bool op
0470: 45 71 75 61 6c 73 28 4f 62 6a 65 63 74 20 72 68 Equals(Object rh
0480: 73 5f 29 20 63 6f 6e 73 74 0d 0a 09 7b 0d 0a 09 s_) const...{...
0490: 09 69 66 28 20 61 75 74 6f 20 72 68 73 20 3d 20 .if( auto rhs =
04a0: 63 61 73 74 28 74 79 70 65 6f 66 28 74 68 69 73 cast(typeof(this
04b0: 29 29 72 68 73 5f 20 29 0d 0a 09 09 7b 0d 0a 09 ))rhs_ )....{...
04c0: 09 09 66 6f 72 65 61 63 68 28 69 2c 5f 3b 20 74 ..foreach(i,_; t
04d0: 68 69 73 2e 74 75 70 6c 65 6f 66 29 0d 0a 09 09 his.tupleof)....
04e0: 09 09 69 66 28 20 74 68 69 73 2e 74 75 70 6c 65 ..if( this.tuple
04f0: 6f 66 5b 69 5d 20 21 3d 20 72 68 73 2e 74 75 70 of[i] != rhs.tup
0500: 6c 65 6f 66 5b 69 5d 20 29 0d 0a 09 09 09 09 09 leof[i] ).......
0510: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 return false;...
0520: 09 09 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a ..return true;..
0530: 09 09 7d 0d 0a 09 09 61 73 73 65 72 74 28 66 61 ..}....assert(fa
0540: 6c 73 65 2c 20 73 70 72 69 6e 74 66 21 22 43 61 lse, sprintf!"Ca
0550: 6e 6e 6f 74 20 63 6f 6d 70 61 72 65 20 25 73 20 nnot compare %s
0560: 77 69 74 68 20 25 73 22 28 74 79 70 65 69 64 28 with %s"(typeid(
0570: 74 68 69 73 29 2c 20 74 79 70 65 69 64 28 72 68 this), typeid(rh
0580: 73 5f 29 29 29 3b 0d 0a 09 7d 0d 0a 0d 0a 09 6f s_)));...}.....o
0590: 76 65 72 72 69 64 65 20 68 61 73 68 5f 74 20 74 verride hash_t t
05a0: 6f 48 61 73 68 28 29 20 63 6f 6e 73 74 0d 0a 09 oHash() const...
05b0: 7b 0d 0a 09 09 68 61 73 68 5f 74 20 68 20 3d 20 {....hash_t h =
05c0: 30 3b 0d 0a 09 09 66 6f 72 65 61 63 68 28 6d 65 0;....foreach(me
05d0: 6d 3b 20 74 68 69 73 2e 74 75 70 6c 65 6f 66 29 m; this.tupleof)
05e0: 0d 0a 09 09 09 68 20 2b 3d 20 74 79 70 65 69 64 .....h += typeid
05f0: 28 6d 65 6d 29 2e 67 65 74 48 61 73 68 28 26 6d (mem).getHash(&m
0600: 65 6d 29 3b 0d 0a 09 09 72 65 74 75 72 6e 20 68 em);....return h
0610: 3b 0d 0a 09 7d 0d 0a 0d 0a 09 6f 76 65 72 72 69 ;...}.....overri
0620: 64 65 20 69 6e 74 20 6f 70 43 6d 70 28 4f 62 6a de int opCmp(Obj
0630: 65 63 74 20 72 68 73 5f 29 20 63 6f 6e 73 74 0d ect rhs_) const.
0640: 0a 09 7b 0d 0a 09 09 69 66 28 20 61 75 74 6f 20 ..{....if( auto
0650: 72 68 73 20 3d 20 63 61 73 74 28 74 79 70 65 6f rhs = cast(typeo
0660: 66 28 74 68 69 73 29 29 72 68 73 5f 20 29 0d 0a f(this))rhs_ )..
0670: 09 09 7b 0d 0a 09 09 09 66 6f 72 65 61 63 68 28 ..{.....foreach(
0680: 69 2c 5f 3b 20 74 68 69 73 2e 74 75 70 6c 65 6f i,_; this.tupleo
0690: 66 29 0d 0a 09 09 09 09 69 66 28 61 75 74 6f 20 f)......if(auto
06a0: 63 20 3d 20 74 79 70 65 69 64 28 5f 29 2e 63 6f c = typeid(_).co
06b0: 6d 70 61 72 65 28 26 74 68 69 73 2e 74 75 70 6c mpare(&this.tupl
06c0: 65 6f 66 5b 69 5d 2c 26 72 68 73 2e 74 75 70 6c eof[i],&rhs.tupl
06d0: 65 6f 66 5b 69 5d 29 29 0d 0a 09 09 09 09 09 72 eof[i])).......r
06e0: 65 74 75 72 6e 20 63 3b 0d 0a 09 09 09 72 65 74 eturn c;.....ret
06f0: 75 72 6e 20 30 3b 0d 0a 09 09 7d 0d 0a 09 09 61 urn 0;....}....a
0700: 73 73 65 72 74 28 66 61 6c 73 65 2c 20 73 70 72 ssert(false, spr
0710: 69 6e 74 66 21 22 43 61 6e 6e 6f 74 20 63 6f 6d intf!"Cannot com
0720: 70 61 72 65 20 25 73 20 77 69 74 68 20 25 73 22 pare %s with %s"
0730: 28 74 79 70 65 69 64 28 74 68 69 73 29 2c 20 74 (typeid(this), t
0740: 79 70 65 69 64 28 72 68 73 5f 29 29 29 3b 0d 0a ypeid(rhs_)));..
0750: 09 7d 0d 0a 7d 0d 0a 0d 0a 75 6e 69 74 74 65 73 .}..}....unittes
0760: 74 0d 0a 7b 0d 0a 09 63 6c 61 73 73 20 54 65 6d t..{...class Tem
0770: 70 0d 0a 09 7b 0d 0a 09 09 69 6e 74 20 78 3b 0d p...{....int x;.
0780: 0a 09 09 73 74 72 69 6e 67 20 79 3b 0d 0a 09 09 ...string y;....
0790: 6d 69 78 69 6e 20 53 69 6d 70 6c 65 43 6f 6e 73 mixin SimpleCons
07a0: 74 72 75 63 74 6f 72 3b 0d 0a 09 09 6d 69 78 69 tructor;....mixi
07b0: 6e 20 53 69 6d 70 6c 65 43 6f 6d 70 61 72 65 3b n SimpleCompare;
07c0: 0d 0a 09 7d 0d 0a 09 61 73 73 65 72 74 28 20 28 ...}...assert( (
07d0: 6e 65 77 20 54 65 6d 70 28 31 2c 22 66 6f 6f 22 new Temp(1,"foo"
07e0: 29 29 2e 78 20 3d 3d 20 31 20 29 3b 0d 0a 09 61 )).x == 1 );...a
07f0: 73 73 65 72 74 28 20 28 6e 65 77 20 54 65 6d 70 ssert( (new Temp
0800: 28 31 2c 22 66 6f 6f 22 29 29 2e 79 20 3d 3d 20 (1,"foo")).y ==
0810: 22 66 6f 6f 22 20 29 3b 0d 0a 09 61 73 73 65 72 "foo" );...asser
0820: 74 28 20 21 5f 5f 74 72 61 69 74 73 28 63 6f 6d t( !__traits(com
0830: 70 69 6c 65 73 2c 20 6e 65 77 20 54 65 6d 70 29 piles, new Temp)
0840: 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 21 5f );...assert( !_
0850: 5f 74 72 61 69 74 73 28 63 6f 6d 70 69 6c 65 73 _traits(compiles
0860: 2c 20 6e 65 77 20 54 65 6d 70 28 31 29 29 20 29 , new Temp(1)) )
0870: 3b 0d 0a 09 61 73 73 65 72 74 28 20 21 5f 5f 74 ;...assert( !__t
0880: 72 61 69 74 73 28 63 6f 6d 70 69 6c 65 73 2c 20 raits(compiles,
0890: 6e 65 77 20 54 65 6d 70 28 22 66 6f 6f 22 2c 31 new Temp("foo",1
08a0: 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 )) );...assert(
08b0: 6e 65 77 20 54 65 6d 70 28 31 2c 22 66 6f 6f 22 new Temp(1,"foo"
08c0: 29 20 3d 3d 20 6e 65 77 20 54 65 6d 70 28 31 2c ) == new Temp(1,
08d0: 22 66 6f 6f 22 29 20 29 3b 0d 0a 09 61 73 73 65 "foo") );...asse
08e0: 72 74 28 20 28 6e 65 77 20 54 65 6d 70 28 31 2c rt( (new Temp(1,
08f0: 22 66 6f 6f 22 29 29 2e 74 6f 48 61 73 68 20 3d "foo")).toHash =
0900: 3d 20 28 6e 65 77 20 54 65 6d 70 28 31 2c 22 66 = (new Temp(1,"f
0910: 6f 6f 22 29 29 2e 74 6f 48 61 73 68 20 29 3b 0d oo")).toHash );.
0920: 0a 09 61 73 73 65 72 74 28 20 6e 65 77 20 54 65 ..assert( new Te
0930: 6d 70 28 31 2c 22 66 6f 6f 22 29 20 21 3d 20 6e mp(1,"foo") != n
0940: 65 77 20 54 65 6d 70 28 32 2c 22 66 6f 6f 22 29 ew Temp(2,"foo")
0950: 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 6e 65 );...assert( ne
0960: 77 20 54 65 6d 70 28 31 2c 22 66 6f 6f 22 29 20 w Temp(1,"foo")
0970: 21 3d 20 6e 65 77 20 54 65 6d 70 28 31 2c 22 62 != new Temp(1,"b
0980: 61 72 22 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 ar") );...assert
0990: 28 20 6e 65 77 20 54 65 6d 70 28 31 2c 22 66 6f ( new Temp(1,"fo
09a0: 6f 22 29 20 3e 20 6e 65 77 20 54 65 6d 70 28 31 o") > new Temp(1
09b0: 2c 22 62 61 72 22 29 20 29 3b 0d 0a 09 61 73 73 ,"bar") );...ass
09c0: 65 72 74 28 20 6e 65 77 20 54 65 6d 70 28 31 2c ert( new Temp(1,
09d0: 22 66 6f 6f 22 29 20 3c 20 6e 65 77 20 54 65 6d "foo") < new Tem
09e0: 70 28 32 2c 22 62 61 72 22 29 20 29 3b 0d 0a 7d p(2,"bar") );..}
09f0: 0d 0a ..