summaryrefslogtreecommitdiff
path: root/Runtime/Utilities/InitializeAndCleanup.cpp
blob: 77280f5d595e7342ee14d73074869918fcaf87bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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 ();
	}
}