PGE Engine
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Macros Pages
event_queue.h
1 #ifndef EVENTQUEUE_H
2 #define EVENTQUEUE_H
3 
4 #include <QQueue>
5 #include <functional>
6 
7 
14 template<class T>
16 {
17  enum __Types
18  {
19  dummy=-1, //do nothing, skip this event
20  caller=0,
21  caller_t,//caller, call a function via pointer. Also possible with delay
22  caller_func,
23  timer, //timer, wait a time
24  wait_flag_var, //do nothing while flag is true
25  wait_flag_func,
26  wait_flag_func_t, //do nothing while flag is true
27  wait_condition //do nothing while flag is true
28  };
29 
31  {
32  obj=NULL;
33  call=NULL;
34  call_t=NULL;
35  delay=0;
36  flag_var=NULL;
37  flag_func=NULL;
38  flag_func_t=NULL;
39  type=dummy;
40  flag_target=false;
41  }
42 
50  void makeCaller( void(*_caller)(void), int _delay=0)
51  {
52  type=caller;
53  call = _caller;
54  delay = _delay;
55  }
56 
64  void makeCallerT(T*_obj, void(T::*_caller)(void), int _delay=0)
65  {
66  obj=_obj;
67  type=caller_t;
68  call_t = _caller;
69  delay = _delay;
70  }
71 
79  void makeCaller( std::function<void()> _call_func, int _delay=0)
80  {
81  type=caller_func;
82  call_func=_call_func;
83  delay = _delay;
84  }
85 
92  void makeTimer(int _delay)
93  {
94  delay=_delay;
95  type=timer;
96  }
97 
105  void makeWaiterFlag(bool *_flag, bool target=true, int _delay=0)
106  {
107  flag_var=_flag;
108  delay=_delay;
109  type=wait_flag_var;
110  flag_target=target;
111  }
119  void makeWaiterFlag(bool(*_flag)(), bool target=true, int _delay=0)
120  {
121  flag_func=_flag;
122  delay=_delay;
123  type=wait_flag_func;
124  flag_target=target;
125  }
126 
134  void makeWaiterFlagT(T*_obj, bool(T::*_flag)(), bool target=true, int _delay=0)
135  {
136  obj=_obj;
137  flag_func_t=_flag;
138  delay=_delay;
139  type=wait_flag_func_t;
140  flag_target=target;
141  }
142 
150  void makeWaiterCond(std::function<bool()> _condition, bool target=true, int _delay=0)
151  {
152  condition = _condition;
153  delay=_delay;
154  type=wait_condition;
155  flag_target=target;
156  }
157 
158 /*
159  Private zone!
160 */
161 
170  float trigger(float step=1)
171  {
172  delay-=step;
173  switch(type)
174  {
175  case caller:
176  if((delay<=0)&&(call))
177  call();
178  break;
179  case caller_t:
180  if((delay<=0)&&(obj)&&(call_t))
181  (obj->*call_t)();
182  break;
183  case caller_func:
184  if(delay<=0)
185  call_func();
186  break;
187  case wait_flag_var:
188  if((delay<=0)&&(flag_var))
189  {
190  if( (*flag_var)==flag_target )
191  delay=1;
192  }
193  break;
194  case wait_flag_func:
195  if((delay<=0)&&(flag_func))
196  {
197  if(flag_func()==flag_target)
198  delay=1;
199  }
200  break;
201  case wait_flag_func_t:
202  if((delay<=0)&&(obj)&&(flag_func_t))
203  {
204  if((obj->*flag_func_t)() == flag_target)
205  delay=1;
206  }
207  break;
208  case wait_condition:
209  if(delay<=0)
210  {
211  if( flag_target? ((condition())==true) : ((condition())==false) )
212  delay=1;
213  }
214  break;
215  case timer: break; case dummy: break;
216  }
217  return delay; //return leaved time
218  }
219 
220  T* obj;
221  //for caller
222  void (*call)(void);
223  void (T::*call_t)(void);
224  //for function
225  std::function<void()> call_func;
226  //for caller, function and for waiting timer
227  float delay;
228  //for a flag waiter
229  bool *flag_var;
230  bool (*flag_func)();
231  bool (T::*flag_func_t)();
232  //for a condition waiter
233  std::function<bool()> condition;
234  bool flag_target;
235 
236  //type of event
237  __Types type;
238 };
239 
273 template<class T>
275 {
276 public:
277  EventQueue()
278  {
279  left_time=0;
280  }
281 
282  EventQueue(const EventQueue& eq)
283  {
284  left_time=eq.left_time;
285  events=eq.events;
286  }
287 
288  ~EventQueue()
289  {}
290 
291  void processEvents(float timeStep=1.0f)
292  {
293  left_time = 0;
294  process_event:
295  if(events.isEmpty()) { left_time=0; return; }
296  left_time = events.first().trigger(timeStep);
297  if(left_time<=0)
298  {
299  events.pop_front();
300  timeStep = fabs(left_time);
301  goto process_event;
302  }
303  }
304 
305  void abort()
306  {
307  events.clear();
308  left_time=0;
309  }
310 
311  float left_time;
312  QQueue<EventQueueEntry<T > > events;
313 };
314 
315 #endif // EVENTQUEUE_H
Event queue entry.
Definition: event_queue.h:15
void makeCaller(void(*_caller)(void), int _delay=0)
makeCaller
Definition: event_queue.h:50
void makeWaiterFlag(bool(*_flag)(), bool target=true, int _delay=0)
makeWaiterFlag Waits while static or non-member function returns equal to target state ...
Definition: event_queue.h:119
void makeWaiterCond(std::function< bool()> _condition, bool target=true, int _delay=0)
makeWaiterCond Waits while lamda-function returns equal to target state
Definition: event_queue.h:150
Event queue.
Definition: event_queue.h:274
float trigger(float step=1)
trigger
Definition: event_queue.h:170
void makeWaiterFlagT(T *_obj, bool(T::*_flag)(), bool target=true, int _delay=0)
makeWaiterFlagT Waits while member function returns equal to target state
Definition: event_queue.h:134
void makeTimer(int _delay)
makeTimer
Definition: event_queue.h:92
void makeWaiterFlag(bool *_flag, bool target=true, int _delay=0)
makeWaiterFlag Waits while flag is equal to target state
Definition: event_queue.h:105
void makeCaller(std::function< void()> _call_func, int _delay=0)
makeCaller
Definition: event_queue.h:79
void makeCallerT(T *_obj, void(T::*_caller)(void), int _delay=0)
makeCallerT
Definition: event_queue.h:64