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
|