/usr/include/simgear/structure/event_mgr.hxx is in libsimgear-dev 3.0.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | #ifndef _SG_EVENT_MGR_HXX
#define _SG_EVENT_MGR_HXX
#include <simgear/props/props.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
#include "callback.hxx"
class SGEventMgr;
class SGTimer {
public:
~SGTimer();
void run();
std::string name;
double interval;
SGCallback* callback;
bool repeat;
bool running;
};
class SGTimerQueue {
public:
SGTimerQueue(int preSize=1);
~SGTimerQueue();
void clear();
void update(double deltaSecs);
double now() { return _now; }
void insert(SGTimer* timer, double time);
SGTimer* remove(SGTimer* timer);
SGTimer* remove();
SGTimer* nextTimer() { return _numEntries ? _table[0].timer : 0; }
double nextTime() { return -_table[0].pri; }
SGTimer* findByName(const std::string& name) const;
private:
// The "priority" is stored as a negative time. This allows the
// implementation to treat the "top" of the heap as the largest
// value and avoids developer mindbugs. ;)
struct HeapEntry { double pri; SGTimer* timer; };
int parent(int n) { return ((n+1)/2) - 1; }
int lchild(int n) { return ((n+1)*2) - 1; }
int rchild(int n) { return ((n+1)*2 + 1) - 1; }
double pri(int n) { return _table[n].pri; }
void swap(int a, int b) {
HeapEntry tmp = _table[a];
_table[a] = _table[b];
_table[b] = tmp;
}
void siftDown(int n);
void siftUp(int n);
void growArray();
// gcc complains there is no function specification anywhere.
// void check();
double _now;
HeapEntry *_table;
int _numEntries;
int _tableSize;
};
class SGEventMgr : public SGSubsystem
{
public:
SGEventMgr();
~SGEventMgr();
virtual void init() {}
virtual void update(double delta_time_sec);
virtual void unbind();
virtual void shutdown();
void setRealtimeProperty(SGPropertyNode* node) { _rtProp = node; }
/**
* Add a single function callback event as a repeating task.
* ex: addTask("foo", &Function ... )
*/
template<typename FUNC>
inline void addTask(const std::string& name, const FUNC& f,
double interval, double delay=0, bool sim=false)
{ add(name, make_callback(f), interval, delay, true, sim); }
/**
* Add a single function callback event as a one-shot event.
* ex: addEvent("foo", &Function ... )
*/
template<typename FUNC>
inline void addEvent(const std::string& name, const FUNC& f,
double delay, bool sim=false)
{ add(name, make_callback(f), 0, delay, false, sim); }
/**
* Add a object/method pair as a repeating task.
* ex: addTask("foo", &object, &ClassName::Method, ...)
*/
template<class OBJ, typename METHOD>
inline void addTask(const std::string& name,
const OBJ& o, METHOD m,
double interval, double delay=0, bool sim=false)
{ add(name, make_callback(o,m), interval, delay, true, sim); }
/**
* Add a object/method pair as a repeating task.
* ex: addEvent("foo", &object, &ClassName::Method, ...)
*/
template<class OBJ, typename METHOD>
inline void addEvent(const std::string& name,
const OBJ& o, METHOD m,
double delay, bool sim=false)
{ add(name, make_callback(o,m), 0, delay, false, sim); }
void removeTask(const std::string& name);
private:
friend class SGTimer;
void add(const std::string& name, SGCallback* cb,
double interval, double delay,
bool repeat, bool simtime);
SGPropertyNode_ptr _freezeProp;
SGPropertyNode_ptr _rtProp;
SGTimerQueue _rtQueue;
SGTimerQueue _simQueue;
};
#endif // _SG_EVENT_MGR_HXX
|