Changeset 386

Show
Ignore:
Timestamp:
07/12/08 19:29:13 (3 months ago)
Author:
FeepingCreature
Message:
  • Made mt_foreach more generic
Files:

Legend:

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

    r385 r386  
    5959    bool finished() { if (done) return done; synchronized(this) return done || channel.active; } 
    6060  } 
    61   void mt_foreach(T)(T[] array, void delegate(T) dg) { mt_foreach(array, (int i, T foo) { dg(foo); }); } 
    62   void mt_foreach(T)(T[] array, void delegate(int, T) dg) { 
    63     int left = array.length; 
    64     auto sync = new Object; 
    65     foreach (i, entry; array) addTask(stuple(i, entry) /apply/ (int i, T foo) { dg(i, foo); synchronized(sync) left--; }); 
     61  void mt_foreach(T, C)(T iterable, C callable) { 
     62    int left; auto sync = new Object; 
     63    static if (is(typeof({ foreach (i, entry; array) callable(i, entry); }))) { 
     64      foreach (i, entry; array) { 
     65        synchronized(sync) left ++; 
     66        addTask(stuple(i, entry) /apply/ (typeof(i) i, typeof(entry) entry) { 
     67          callable(i, entry); 
     68          synchronized(sync) left --; 
     69        }); 
     70      } 
     71    } else static if (is(typeof({ foreach (entry; array) callable(entry); }))) { 
     72      foreach (entry; array) { 
     73        synchronized(sync) left ++; 
     74        addTask(entry /apply/ (typeof(entry) entry) { 
     75          callable(entry); 
     76          synchronized(sync) left --; 
     77        }); 
     78      } 
     79    } 
    6680    while (left) if (idle()) slowyield(); 
    6781  }