File: GameJobDispatcher.h

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (74 lines) | stat: -rw-r--r-- 1,304 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _GAME_JOB_DISPATCHER_H
#define _GAME_JOB_DISPATCHER_H

#include <functional>
#include <map>

#include "System/Misc/SpringTime.h"

class JobDispatcher {
public:
	struct Job {
		Job()
		: freq(0)
		//, inSim(false)
		//, inDraw(false)
		, startDirect(true)
		, catchUp(false)
		, name("")
		{}

		std::function<bool()> f; // allows us to use lambdas

		float freq;
		//bool inSim;
		//bool inDraw;
		bool startDirect;
		bool catchUp;

		const char* name;
	};

public:
	JobDispatcher() { jobs.clear(); }
	~JobDispatcher() { jobs.clear(); }

	void AddTimedJob(Job j, const spring_time t) {
		spring_time jobTime = t;

		// never overwrite one job by another (!)
		while (jobs.find(jobTime) != jobs.end())
			jobTime += spring_time(1);

		jobs[jobTime] = j;
	}

	void Update() {
		const spring_time now = spring_gettime();

		auto it = jobs.begin();

		while (it != jobs.end()) {
			if (it->first > now) {
				++it; continue;
			}

			Job* j = &it->second;

			if (j->f()) {
				AddTimedJob(*j, (j->catchUp ? it->first : spring_gettime()) + spring_time(1000.0f / j->freq));
			}

			jobs.erase(it); //FIXME remove by range? (faster!)
			it = jobs.begin();
		}
	}

private:
	std::map<spring_time, Job> jobs;
};

#endif