#pragma once #include "singleton_manager.h" class singleton_initliazer; template class CORE_API singleton_impl { public: singleton_impl() { instance_ = static_cast(this); } static void set(T* instance) { instance_ = instance; } static T* get() { return instance_; } static bool exists() { return instance_ != nullptr; } protected: static inline T* instance_ = nullptr; }; class CORE_API singleton { public: virtual ~singleton() = default; virtual void init(singleton_initliazer& initliazer) {} virtual void post_init() {} virtual void begin_release(singleton_release_guard& release_guard) {} virtual void release(singleton_release_guard& release_guard) {} virtual const char* get_name() = 0; }; template class CORE_API singleton_t : public singleton, public singleton_impl { public: singleton_t() { singleton_manager::get()->add(this); } }; #if defined(core_EXPORTS) #define DEFINE_SINGLETON_INSTANCE(T) \ inline T g_##T; \ extern "C" CORE_API inline T& get_##T() { return g_##T; } #else #define DEFINE_SINGLETON_INSTANCE(T) \ extern "C" CORE_API inline T& get_##T(); #endif