64 lines
2.4 KiB
C++
64 lines
2.4 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
|
|
// Initializers are a way to register your object to be initialized at startup
|
|
// time. They're a good way to have global variables without worrying about
|
|
// dependent constructors being called. They also make it so init code doesn't
|
|
// depend on the global objects it's initializing.
|
|
|
|
// To use initializers, just use REGISTER_INITIALIZER to register your global
|
|
// variable like this: class SomeClass {....} SomeClass *g_pSomeClassSingleton =
|
|
// NULL; REGISTER_INITIALIZER(SomeClass, &g_pSomeClassSingleton);
|
|
|
|
#ifndef INITIALIZER_H
|
|
#define INITIALIZER_H
|
|
|
|
typedef void *(*CreateInitializerObjectFn)();
|
|
typedef void (*DeleteInitializerObjectFn)(void *ptr);
|
|
|
|
class Initializer {
|
|
public:
|
|
Initializer(void **pVar, CreateInitializerObjectFn createFn,
|
|
DeleteInitializerObjectFn deleteFn);
|
|
|
|
// Allocates all the global objects.
|
|
static bool InitializeAllObjects();
|
|
|
|
// Free all the global objects.
|
|
static void FreeAllObjects();
|
|
|
|
private:
|
|
static Initializer *s_pInitializers;
|
|
|
|
void **m_pVar;
|
|
CreateInitializerObjectFn m_CreateFn;
|
|
DeleteInitializerObjectFn m_DeleteFn;
|
|
Initializer *m_pNext;
|
|
};
|
|
|
|
#define REGISTER_INITIALIZER(className, varPointer) \
|
|
static void *__Initializer__Create##className##Fn() { \
|
|
return new className; \
|
|
} \
|
|
static void *__Initializer__Delete##className##Fn(void *ptr) { \
|
|
delete (className *)ptr; \
|
|
} \
|
|
static Initializer g_Initializer_##className##( \
|
|
varPointer, __Initializer__Create##className##Fn, \
|
|
__Initializer__Delete##className##Fn);
|
|
|
|
#define REGISTER_FUNCTION_INITIALIZER(functionName) \
|
|
static void *__Initializer__Create##functionName##Fn() { \
|
|
functionName(); \
|
|
return 0; \
|
|
} \
|
|
static Initializer g_Initializer_##functionName##( \
|
|
0, __Initializer__Create##functionName##Fn, 0);
|
|
|
|
#endif
|