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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifdef free
#undef free
#endif
#include "GLContext.h"
#include <list>
#include <cstddef> // for NULL
using std::list;
struct HookSet {
HookSet()
: init(NULL), free(NULL), data(NULL) {}
HookSet(GLContext::Func i, GLContext::Func f, void* d)
: init(i), free(f), data(d) {}
bool operator==(const HookSet& hs) const
{
return ((init == hs.init) && (free == hs.free) && (data == hs.data));
}
GLContext::Func init;
GLContext::Func free;
void* data;
};
static list<HookSet>& getHooks()
{
static list<HookSet> hooks; // local flow for proper initialization
return hooks;
}
void GLContext::Init()
{
list<HookSet>::iterator it;
for (it = getHooks().begin(); it != getHooks().end(); ++it) {
it->init(it->data);
}
}
void GLContext::Free()
{
list<HookSet>::iterator it;
for (it = getHooks().begin(); it != getHooks().end(); ++it) {
it->free(it->data);
}
}
void GLContext::InsertHookSet(Func init, Func free, void* data)
{
if ((init == NULL) || (free == NULL)) {
return;
}
HookSet hs(init, free, data);
getHooks().push_back(hs);
}
void GLContext::RemoveHookSet(Func init, Func free, void* data)
{
HookSet hs(init, free, data);
list<HookSet>::iterator it;
for (it = getHooks().begin(); it != getHooks().end(); ++it) {
if (hs == *it) {
list<HookSet>::iterator it_next = it;
++it_next;
getHooks().erase(it);
it = it_next;
}
}
}
|