#pragma once #include "Platform.h" // Utility class mostly for when certain inputs need singleton callback handlers template class Static { public: static T* instance() { return s_instance; } private: static T* s_instance; }; template struct StaticTaskRegistration : public Platform::TaskRegistration { StaticTaskRegistration() : Platform::TaskRegistration(Static::instance()) { Platform::registerTask(this); } }; struct AutoTaskRegistration : public Platform::TaskRegistration { explicit AutoTaskRegistration(Task* task) : Platform::TaskRegistration(task) { Platform::registerTask(this); } }; #define NAMED_STATIC_ALLOC(Cls, StaticName) static Cls _staticAlloc__ ## StaticName;\ template<> Cls* Static::s_instance=&_staticAlloc__ ## StaticName; #define STATIC_ALLOC(Cls) NAMED_STATIC_ALLOC(Cls, Cls) #define NAMED_STATIC_TASK(Cls, StaticName) static StaticTaskRegistration _staticTask_ ## StaticName; #define STATIC_TASK(Cls) NAMED_STATIC_TASK(Cls, Cls) #define REGISTER_TASK(TaskName) static AutoTaskRegistration _autoTask__ ## TaskName(&TaskName);