IT++ Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
events.h
Go to the documentation of this file.
1 
29 #ifndef EVENTS_H
30 #define EVENTS_H
31 
32 #include <itpp/base/itassert.h>
33 #include <queue>
34 #include <deque>
35 
36 
37 namespace itpp
38 {
39 
41 
42 
43 // typedef long double Ttype; //!< 128-bit floating point time
44 typedef double Ttype;
45 // typedef long unsigned int Ttype; //!< 64-bit unsigned integer time
46 
47 class Event_Queue;
48 class Base_Event;
49 class Base_Signal;
50 
59 {
60 public:
61  friend class Base_Signal;
62 
63  friend class Event_Queue;
64 
65  friend struct Compare_Base_Event_Times;
66 
68  Base_Event(const Ttype delta_time) { // The event will occur in 'delta_time' time units from now!
69  it_assert(delta_time >= 0, "Only causal simulations are possible");
70  active = true;
71  delta_t = delta_time;
72  expire_t = 0; // Will be set correctly upon calling Event_Queue::add().
73  id = global_id++;
74  }
75 
77  virtual ~Base_Event() {}
78 
80  void cancel() { active = false; }
81 
82 protected:
84  virtual void exec(void) = 0;
90  bool active;
92  unsigned long long int id;
94  static unsigned long long int global_id;
95 };
96 
100  bool operator()(Base_Event *event1, Base_Event *event2) {
101  if (event1->expire_t == event2->expire_t) // Equal expire times.
102  return (event1->id > event2->id); // Base comparison on the event id.
103  else
104  return (event1->expire_t > event2->expire_t); // Different expire times. Regular comparison.
105  }
106 };
107 
117 {
118 public:
119  friend class Base_Signal;
120 
125 
127  static void add(Base_Event *e);
129  static Ttype now() {return t;}
131  static void start();
133  static void stop();
135  static void clear();
136 protected:
137  //static void cancel_all(Base_Signal *s);
138 private:
139  typedef std::deque<Base_Event*, std::allocator< Base_Event* > >::iterator Base_Event_Iterator;
140  static void _run();
141  static bool keep_running;
142  static Ttype t; // Current time.
143  static std::priority_queue < Base_Event*,
144  std::deque<Base_Event*, std::allocator<Base_Event*> >,
145  Compare_Base_Event_Times > event_queue; // Queue for the Events.
146 };
147 
153 template <class ObjectType>
154 class Event : public Base_Event
155 {
156 public:
158  Event(ObjectType *object_pointer, void (ObjectType::*object_function_pointer)(), const Ttype delta_time) : Base_Event(delta_time) {
159  po = object_pointer;
160  pm = object_function_pointer;
161  }
162 
164  virtual ~Event() {}
165 
167  virtual void exec(void) {(*po.*pm)(); }
168 
169 private:
170  void (ObjectType::*pm)(); // Pointer to class member function to be executed on event expire.
171  ObjectType *po; // Pointer to object who's member function is to be executed on event expire.
172 };
173 
179 template <class ObjectType, class DataType> class Data_Event : public Base_Event
180 {
181 public:
183  Data_Event(ObjectType *object_pointer,
184  void (ObjectType::*object_function_pointer)(DataType data),
185  DataType data, const Ttype delta_time) : Base_Event(delta_time) {
186  po = object_pointer;
187  pm = object_function_pointer;
188  u = data;
189  }
190 
192  virtual ~Data_Event() {}
193 
195  virtual void exec(void) {
196  (*po.*pm)(u);
197  }
198 
199 private:
200  void (ObjectType::*pm)(DataType data); // Pointer to class member function to be executed on event expire.
201  ObjectType* po; // Pointer to object who's member function is to be executed on event expire.
202  DataType u; // User data.
203 };
204 
206 
207 } // namespace itpp
208 
209 #endif // #ifndef EVENTS_H
SourceForge Logo

Generated on Fri Mar 21 2014 17:14:13 for IT++ by Doxygen 1.8.1.2