Changeset 385

Show
Ignore:
Timestamp:
07/12/08 19:00:01 (3 months ago)
Author:
FeepingCreature
Message:
  • Newstuf
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/tools/tools/base.d

    r384 r385  
    332332T concat(T)(T a, T b) { return a~b; } 
    333333T add(T)(T a, T b) { return a+b; } 
    334 T sub(T)(T a, T b) { return a-b; } 
     334T subtract(T)(T a, T b) { return a-b; } 
    335335struct _op(string O) { 
    336336  typeof(mixin("Init!(T) "~O~" Init!(U)")) opCall(T, U)(T a, U b) { 
     
    11861186} 
    11871187 
     1188int ctFind(string text, string match) { 
     1189  if (text.length < match.length) return -1; 
     1190  for (int i = 0; i <= text.length - match.length; ++i) { 
     1191    if (text[i .. i+match.length] == match) return i; 
     1192  } 
     1193  return -1; 
     1194} 
     1195 
     1196string SwitchCaseFn(string code) { 
     1197  int arrowpos = ctFind(code, "->"); 
     1198  assert(arrowpos != -1); 
     1199  auto value = code[0 .. arrowpos]; 
     1200  string Case; 
     1201  if (ctFind(value, "default") == -1) Case = "case "; 
     1202  return Case~value~": "~code[arrowpos+2 .. $]~"; break; "; 
     1203} 
     1204 
     1205string Switch(string var, string code) { 
     1206  string res = "switch("~var~") { "; 
     1207  string buffer; 
     1208  foreach (ch; code) { 
     1209    if (ch == '|') { 
     1210      res ~= SwitchCaseFn(buffer); 
     1211      buffer = ""; 
     1212    } else buffer ~= ch; 
     1213  } 
     1214  res ~= SwitchCaseFn(buffer); 
     1215  return res ~ "}"; 
     1216} 
     1217 
     1218// pragma(msg, Switch("1->a|2->b")); 
     1219 
    11881220T Cast(S, T)(S orig) { return cast(T) orig; } 
    11891221 
  • trunk/tools/tools/stackthreads.d

    r376 r385  
    6464} 
    6565 
    66 class Generator(T) { 
     66class Source(T) { 
    6767  Coroutine routine; 
    6868  T res; void delegate(void delegate(T)) dg; 
     
    7272} 
    7373 
    74 T delegate() generator(T)(void delegate(void delegate(T)) dg) { 
    75   auto gen = new Generator!(T)(dg); 
    76   return &gen.opCall; 
     74class Sink(T) { 
     75  Coroutine routine; 
     76  T v; void delegate(T delegate()) dg; 
     77  void run(proc yield) { dg({ yield(); return v; }); } 
     78  void opCall(T t) { v = t; routine(); } 
     79  mixin This!("dg; #New(routine, &run); #routine(); "); 
     80
     81 
     82T delegate() source(T)(void delegate(void delegate(T)) dg) { 
     83  auto src = new Source!(T)(dg); 
     84  return &src.opCall; 
     85
     86 
     87void delegate(T) sink(T)(void delegate(T delegate()) dg) { 
     88  auto snk = new Sink!(T)(dg); 
     89  return &snk.opCall; 
    7790} 
    7891 
    7992T delegate() iterate(T)(T[] array) { 
    80   return generator(array /apply/ (T[] array, void delegate(T) yield) { foreach (entry; array) yield(entry); }); 
     93  return source(array /apply/ (T[] array, void delegate(T) yield) { foreach (entry; array) yield(entry); }); 
    8194} 
    8295 
     
    93106  logln("> done"); 
    94107  mustFail("ReinvokeTest", test()); 
    95   /*auto dg = (int i, proc yield) { while (true) { logln(i, ": active"); yield(); } }; 
    96   auto tri = Range[3] /map/ fix(dg) /map/ (void delegate(proc) dg) { return new Coroutine(dg); }; 
    97   tri[0].other = tri[1]; tri[1].other = tri[2]; tri[2].other = tri[0]; 
    98   tri[0]();*/ 
    99   auto dg = iterate([2, 3, 4, 5][]); 
     108  auto dg = ([2, 3, 4, 5]).iterate(); 
    100109  mustEqual("IterTest #1", dg(), 2); mustEqual("IterTest #2", dg(), 3); 
    101110  mustEqual("IterTest #3", dg(), 4); mustEqual("IterTest #4", dg(), 5); 
     111  int e; 
     112  auto dg2 = sink((int delegate() get) { while (true) e += get(); }); 
     113  dg2(2); dg2(3); dg2(4); 
     114  mustEqual("SinkTest", e, 9); 
    102115} 
  • trunk/tools/tools/threadpool.d

    r384 r385  
    55import tools.log, tools.functional; 
    66 
     7import std.gc: addRoot; 
    78Lock lock; // perpetually blocking 
    89static this() { New(lock); lock.lock; } 
     
    3536    return; 
    3637  } 
     38  void slow_shutdown(void delegate() idle) { 
     39    shutdown_counter = new Semaphore; 
     40    finish = true; 
     41    int left; 
     42    auto me = Thread.getThis(); 
     43    foreach (thread; threads) if (thread !is me) { 
     44      addTask("ShutdownThreadsWakeUp", &shutdown_me); 
     45      left++; 
     46    } 
     47    while (left) if (!shutdown_counter.try_acquire) idle(); else left--; 
     48    return; 
     49  } 
    3750  class Future(T) { 
    3851    bool done; MessageChannel!(bool) channel; 
     
    4659    bool finished() { if (done) return done; synchronized(this) return done || channel.active; } 
    4760  } 
     61  void mt_foreach(T)(T[] array, void delegate(T) dg) { mt_foreach(array, (int i, T foo) { dg(foo); }); } 
    4862  void mt_foreach(T)(T[] array, void delegate(int, T) dg) { 
    4963    int left = array.length; 
    5064    auto sync = new Object; 
    5165    foreach (i, entry; array) addTask(stuple(i, entry) /apply/ (int i, T foo) { dg(i, foo); synchronized(sync) left--; }); 
    52     while (left) idle(); 
     66    while (left) if (idle()) slowyield(); 
    5367  } 
    5468  Future!(T) future(T)(T delegate() dg) { 
     
    7892    threadnames[thr] = "Freshling PoolThread"; 
    7993    thr.start; 
     94    addRoot(cast(void*) thr); 
    8095    synchronized threads~=thr; 
    8196  }