56 lines
1.3 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(singleton_release_guard& release_guard) {}
virtual void release(singleton_release_guard& release_guard) {}
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 T* get_##T();
#else
#define DEFINE_SINGLETON_INSTANCE(T) \
extern "C" CORE_API T* get_##T();
#endif
#define IMPL_SINGLETON_INSTANCE(T) \
T* get_##T() { return &g_##T; }