You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
//========= 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 |
|
|
|
|