summaryrefslogtreecommitdiff
path: root/src/ai/api/ai_event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ai/api/ai_event.cpp')
-rw-r--r--src/ai/api/ai_event.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/ai/api/ai_event.cpp b/src/ai/api/ai_event.cpp
new file mode 100644
index 000000000..b18fa4777
--- /dev/null
+++ b/src/ai/api/ai_event.cpp
@@ -0,0 +1,65 @@
+/* $Id$ */
+
+/** @file ai_event.cpp Implementation of AIEvent. */
+
+#include "ai_event.hpp"
+#include "ai_event_types.hpp"
+
+#include <queue>
+#include <set>
+
+struct AIEventData {
+ std::queue<AIEvent *> stack;
+};
+
+/* static */ void AIEventController::CreateEventPointer()
+{
+ assert(AIObject::GetEventPointer() == NULL);
+
+ AIObject::GetEventPointer() = new AIEventData();
+}
+
+/* static */ void AIEventController::FreeEventPointer()
+{
+ AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
+
+ /* Free all waiting events (if any) */
+ while (!data->stack.empty()) {
+ AIEvent *e = data->stack.front();
+ data->stack.pop();
+ e->Release();
+ }
+
+ /* Now kill our data pointer */
+ delete data;
+}
+
+/* static */ bool AIEventController::IsEventWaiting()
+{
+ if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
+ AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
+
+ return !data->stack.empty();
+}
+
+/* static */ AIEvent *AIEventController::GetNextEvent()
+{
+ if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
+ AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
+
+ if (data->stack.empty()) return NULL;
+
+ AIEvent *e = data->stack.front();
+ data->stack.pop();
+ return e;
+}
+
+/* static */ void AIEventController::InsertEvent(AIEvent *event)
+{
+ if (AIObject::GetEventPointer() == NULL) AIEventController::CreateEventPointer();
+ AIEventData *data = (AIEventData *)AIObject::GetEventPointer();
+
+ event->AddRef();
+ data->stack.push(event);
+}
+