00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_eventqueue.hpp"
00012
00013 #include "xrb_event.hpp"
00014 #include "xrb_eventhandler.hpp"
00015
00016 namespace Xrb
00017 {
00018
00019
00020
00021
00022
00023 EventQueue::EventQueue ()
00024 :
00025 FrameHandler()
00026 {
00027 m_current_event_id = 0;
00028 }
00029
00030 EventQueue::~EventQueue ()
00031 {
00032
00033 EnqueueBufferedEvents();
00034
00035
00036 for (TimeOrderedEventBindingSet::iterator it = m_time_ordered_event_queue.begin(),
00037 it_end = m_time_ordered_event_queue.end();
00038 it != it_end;
00039 ++it)
00040 {
00041 Event const *event = it->GetEvent();
00042 ASSERT1(event != NULL);
00043 Delete(event);
00044 }
00045
00046
00047 m_time_ordered_event_queue.clear();
00048 }
00049
00050 void EventQueue::EnqueueEvent (
00051 EventHandler *const event_handler,
00052 Event const *const event)
00053 {
00054 ASSERT1(event_handler != NULL);
00055 ASSERT1(event != NULL);
00056 ASSERT1(event_handler->MostRecentEventTime() <= event->Time());
00057
00058
00059
00060 CompactEventIDs();
00061
00062
00063 event->SetID(m_current_event_id++);
00064
00065
00066
00067 EventBinding event_binding(event_handler, event);
00068 m_buffered_time_ordered_event_queue.insert(event_binding);
00069 }
00070
00071 void EventQueue::DeleteEventsBelongingToHandler (
00072 EventHandler *const event_handler)
00073 {
00074 ASSERT1(event_handler != NULL);
00075
00076 for (TimeOrderedEventBindingSet::iterator it = m_time_ordered_event_queue.begin(),
00077 it_end = m_time_ordered_event_queue.end();
00078 it != it_end;
00079 ++it)
00080 {
00081 if (!it->GetEvent()->IsScheduledForDeletion())
00082 if (it->GetEventHandler() == event_handler)
00083 it->GetEvent()->ScheduleForDeletion();
00084 }
00085 }
00086
00087 void EventQueue::ScheduleMatchingEventsForDeletion (
00088 bool (*EventMatchingFunction)(Event const *))
00089 {
00090
00091 for (TimeOrderedEventBindingSet::iterator it = m_time_ordered_event_queue.begin(),
00092 it_end = m_time_ordered_event_queue.end();
00093 it != it_end;
00094 ++it)
00095 {
00096 Event const *event = it->GetEvent();
00097 ASSERT1(event != NULL);
00098
00099 if (!event->IsScheduledForDeletion())
00100
00101 if (EventMatchingFunction(event))
00102 event->ScheduleForDeletion();
00103 }
00104 }
00105
00106 void EventQueue::HandleFrame ()
00107 {
00108
00109 EnqueueBufferedEvents();
00110
00111
00112 EventDummy event_limit(FrameTime());
00113 event_limit.SetID(MaxEventID());
00114 EventBinding binding_limit(NULL, &event_limit);
00115
00116
00117
00118 {
00119 TimeOrderedEventBindingSet::iterator it_begin =
00120 m_time_ordered_event_queue.begin();
00121 TimeOrderedEventBindingSet::iterator it_end =
00122 m_time_ordered_event_queue.upper_bound(binding_limit);
00123
00124
00125 for (TimeOrderedEventBindingSet::iterator it = it_begin;
00126 it != it_end;
00127 ++it)
00128 {
00129 ASSERT1(it->GetEventHandler() != NULL);
00130 ASSERT1(it->GetEvent() != NULL);
00131
00132 if (!it->GetEvent()->IsScheduledForDeletion())
00133 {
00134
00135
00136
00137 it->GetEventHandler()->ProcessEvent(it->GetEvent());
00138 it->GetEvent()->ScheduleForDeletion();
00139 }
00140 }
00141
00142
00143
00144
00145
00146 for (TimeOrderedEventBindingSet::iterator it = it_begin;
00147 it != it_end;
00148 ++it)
00149 {
00150 ASSERT1(it->GetEvent()->IsScheduledForDeletion());
00151 delete it->GetEvent();
00152 }
00153
00154
00155 m_time_ordered_event_queue.erase(it_begin, it_end);
00156 }
00157 }
00158
00159 void EventQueue::EnqueueBufferedEvents ()
00160 {
00161
00162
00163 m_time_ordered_event_queue.insert(
00164 m_buffered_time_ordered_event_queue.begin(),
00165 m_buffered_time_ordered_event_queue.end());
00166
00167 m_buffered_time_ordered_event_queue.clear();
00168 }
00169
00170 void EventQueue::CompactEventIDs ()
00171 {
00172
00173
00174 if (m_current_event_id == MaxEventID())
00175 {
00176
00177 EnqueueBufferedEvents();
00178
00179
00180
00181
00182 m_current_event_id = 0;
00183 for (TimeOrderedEventBindingSet::iterator
00184 it = m_time_ordered_event_queue.begin(),
00185 it_end = m_time_ordered_event_queue.end();
00186 it != it_end;
00187 ++it)
00188 {
00189
00190 it->GetEvent()->SetID(m_current_event_id++);
00191
00192 ASSERT1(m_current_event_id != MaxEventID());
00193 }
00194 }
00195 }
00196
00197
00198
00199
00200
00201 bool EventQueue::OrderEventBindingsByEventTime::operator () (
00202 EventBinding const &left_operand,
00203 EventBinding const &right_operand) const
00204 {
00205 if (left_operand.GetEvent()->Time() < right_operand.GetEvent()->Time())
00206 return true;
00207 else if (left_operand.GetEvent()->Time() == right_operand.GetEvent()->Time())
00208 return left_operand.GetEvent()->ID() < right_operand.GetEvent()->ID();
00209 else
00210 return false;
00211 }
00212
00213 }