#pragma once #include #include "extern.h" class singleton; class singleton_initliazer { public: bool has_init(singleton* s); void init_singleton(singleton* s); template T* require() { auto instance = T::get(); if (has_init(instance)) { return instance; } init_singleton(instance); return instance; } std::vector singletons_{}; }; class singleton_release_guard { public: singleton_release_guard(bool begin_release) : begin_release_(begin_release) { } bool has_release(singleton* s); void release_singleton(singleton* s); template void require_release() { auto instance = T::get(); if (has_release(instance)) { return; } release_singleton(instance); } std::vector release_singletons_{}; private: bool begin_release_; }; class CORE_API singleton_manager { public: static singleton_manager* get() { static singleton_manager instance; return &instance; } void add(singleton* s); void init(); void release() const; private: std::vector singletons_; };