1 module mutils.timeline.executor; 2 3 import std.stdio; 4 5 import mutils.container.sorted_vector; 6 import mutils.container.vector; 7 import mutils.linalg.algorithm; 8 import mutils.timeline.utils; 9 10 alias ExecuteDelegate=void delegate(); 11 12 struct ExecuteUnit{ 13 ExecuteDelegate del; 14 float time; 15 } 16 17 struct Executor 18 { 19 SortedVector!(ExecuteUnit, "a.time < b.time") toExecute; 20 TimeIndexGetter indexGetter; 21 22 23 24 void executeTo(float time){ 25 ExecuteUnit[] exe=indexGetter.passedFromLast(toExecute[], time); 26 //writeln(exe); 27 foreach(e; exe){ 28 e.del(); 29 } 30 } 31 32 void executeFromTo(float start, float end){ 33 indexGetter.set(toExecute[], start); 34 executeTo(end); 35 } 36 } 37 38 39 unittest{ 40 static struct Tmp{ 41 int value; 42 43 void something(){ 44 value+=1; 45 } 46 } 47 Tmp tmp; 48 49 Executor exe; 50 exe.toExecute~=ExecuteUnit(&tmp.something, 0); 51 exe.toExecute~=ExecuteUnit(&tmp.something, 0); 52 exe.toExecute~=ExecuteUnit(&tmp.something, 0); 53 exe.toExecute~=ExecuteUnit(&tmp.something, 1); 54 exe.toExecute~=ExecuteUnit(&tmp.something, 2); 55 exe.toExecute~=ExecuteUnit(&tmp.something, 3); 56 exe.toExecute~=ExecuteUnit(&tmp.something, 4); 57 //Check executeTo 58 exe.executeTo(0.1); 59 exe.executeTo(0.1); 60 assert(tmp.value==3); 61 exe.executeTo(1.1); 62 assert(tmp.value==4); 63 exe.executeTo(2.1); 64 assert(tmp.value==5); 65 exe.executeTo(5); 66 assert(tmp.value==7); 67 //Check executeFromTo 68 tmp.value=0; 69 exe.executeFromTo(2, 10); 70 assert(tmp.value==3); 71 tmp.value=0; 72 exe.executeFromTo(0, 10); 73 assert(tmp.value==7); 74 }