56 lines
1.3 KiB
C++
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; }
|