summaryrefslogtreecommitdiff
path: root/Runtime/Utilities/InitializeAndCleanup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Utilities/InitializeAndCleanup.cpp')
-rw-r--r--Runtime/Utilities/InitializeAndCleanup.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/Runtime/Utilities/InitializeAndCleanup.cpp b/Runtime/Utilities/InitializeAndCleanup.cpp
new file mode 100644
index 0000000..77280f5
--- /dev/null
+++ b/Runtime/Utilities/InitializeAndCleanup.cpp
@@ -0,0 +1,51 @@
+#include "UnityPrefix.h"
+#include "InitializeAndCleanup.h"
+
+enum { kMaxCount = 40 };
+
+struct OrderedCallback
+{
+ int order;
+ RegisterRuntimeInitializeAndCleanup::CallbackFunction* init;
+ RegisterRuntimeInitializeAndCleanup::CallbackFunction* cleanup;
+};
+
+static int gNumRegisteredCallbacks = 0;
+static OrderedCallback gCallbacks[kMaxCount];
+
+
+bool operator < (const OrderedCallback& lhs, const OrderedCallback& rhs)
+{
+ return lhs.order < rhs.order;
+}
+
+RegisterRuntimeInitializeAndCleanup::RegisterRuntimeInitializeAndCleanup(CallbackFunction* Initialize, CallbackFunction* Cleanup, int order)
+{
+ gCallbacks[gNumRegisteredCallbacks].init = Initialize;
+ gCallbacks[gNumRegisteredCallbacks].cleanup = Cleanup;
+ gCallbacks[gNumRegisteredCallbacks].order = order;
+
+ gNumRegisteredCallbacks++;
+ Assert(gNumRegisteredCallbacks <= kMaxCount);
+}
+
+void RegisterRuntimeInitializeAndCleanup::ExecuteInitializations()
+{
+ std::sort (gCallbacks, gCallbacks + gNumRegisteredCallbacks);
+
+ for (int i = 0; i < gNumRegisteredCallbacks; i++)
+ {
+ if (gCallbacks[i].init)
+ gCallbacks[i].init ();
+ }
+}
+
+void RegisterRuntimeInitializeAndCleanup::ExecuteCleanup()
+{
+ for (int i = gNumRegisteredCallbacks-1; i >=0 ; i--)
+ {
+ if (gCallbacks[i].cleanup)
+ gCallbacks[i].cleanup ();
+ }
+}
+