00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TQUEUE_H
00022 #define TQUEUE_H 1
00023
00024
00025 #include <vector>
00026 #include <list>
00027
00028 #include "exult_types.h"
00029
00030
00031
00032
00033
00034
00035 class Time_sensitive
00036 {
00037 int queue_cnt;
00038 bool always;
00039 public:
00040 friend class Time_queue;
00041 Time_sensitive() : queue_cnt(0), always(false)
00042 { }
00043 virtual ~Time_sensitive();
00044 int in_queue()
00045 { return queue_cnt > 0; }
00046 void set_always(bool tf)
00047
00048 { always = tf; }
00049 virtual void handle_event(unsigned long curtime, long udata) = 0;
00050 };
00051
00052 class Time_queue;
00053
00054
00055
00056
00057 class Queue_entry
00058 {
00059 public:
00060
00061 Time_sensitive *handler;
00062 long udata;
00063 uint32 time;
00064 inline void set(uint32 t, Time_sensitive *h, long ud)
00065 {
00066 time = t;
00067 handler = h;
00068 udata = ud;
00069 }
00070 };
00071
00072 bool operator <(const Queue_entry &q1,const Queue_entry &q2);
00073
00074
00075
00076
00077
00078 class Time_queue
00079 {
00080 typedef std::list<Queue_entry> Temporal_sequence;
00081 Temporal_sequence data;
00082 uint32 pause_time;
00083 int paused;
00084
00085
00086 void activate0(uint32 curtime);
00087 void activate_always(uint32 curtime);
00088 public:
00089 friend class Time_queue_iterator;
00090
00091 Time_queue() : pause_time(0), paused(0)
00092 { }
00093 void clear();
00094
00095 void add(uint32 t, Time_sensitive *obj, long ud);
00096
00097 int remove(Time_sensitive *obj);
00098 int remove(Time_sensitive *obj, long udata);
00099 int find(Time_sensitive *obj);
00100
00101 long find_delay(Time_sensitive *obj, uint32 curtime);
00102
00103 inline void activate(uint32 curtime)
00104 {
00105
00106 if (paused)
00107 activate_always(curtime);
00108 else if (data.size() && !(curtime < data.front().time))
00109 activate0(curtime);
00110 }
00111 void pause(uint32 curtime)
00112 {
00113 if (!paused++)
00114 pause_time = curtime;
00115 }
00116 void resume(uint32 curtime);
00117 };
00118
00119
00120 class Time_queue_iterator
00121 {
00122 Time_queue::Temporal_sequence::iterator iter;
00123 Time_queue *tqueue;
00124 Time_sensitive *this_obj;
00125 public:
00126 Time_queue_iterator(Time_queue *tq, Time_sensitive *obj)
00127 : iter(tq->data.begin()), tqueue(tq), this_obj(obj)
00128 { }
00129 int operator()(Time_sensitive *& obj, long& data);
00130 };
00131
00132 #endif