//========= 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