Hex Artifact Content
Not logged in

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                                            ..