2024-02-27 23:24:40 +08:00

53 lines
1.1 KiB
C++

#pragma once
#include "singleton_manager.h"
class singleton_initliazer;
template<class T>
class CORE_API singleton_impl {
public:
singleton_impl() {
instance_ = static_cast<T*>(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() {}
virtual void release() {}
virtual const char* get_name() = 0;
};
template<class T>
class CORE_API singleton_t : public singleton, public singleton_impl<T> {
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