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 }