mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 22:16:58 +02:00
Use variadic templates to create instance with arguments
This commit is contained in:
parent
7483e800c2
commit
d9d0166bc9
2 changed files with 39 additions and 15 deletions
|
@ -10,11 +10,3 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "DependencyManager.h"
|
#include "DependencyManager.h"
|
||||||
|
|
||||||
DependencyManager& DependencyManager::getInstance() {
|
|
||||||
static DependencyManager instance;
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
DependencyManager::~DependencyManager() {
|
|
||||||
}
|
|
|
@ -16,10 +16,12 @@
|
||||||
|
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
#define SINGLETON_DEPENDENCY(T)\
|
#define SINGLETON_DEPENDENCY(T, NEED_SET)\
|
||||||
public:\
|
public:\
|
||||||
typedef QSharedPointer<T> SharedPointer;\
|
typedef QSharedPointer<T> SharedPointer;\
|
||||||
|
typedef QWeakPointer<T> WeakPointer;\
|
||||||
private:\
|
private:\
|
||||||
|
static constexpr bool REQUIRE_SET = NEED_SET;\
|
||||||
void customDeleter() {\
|
void customDeleter() {\
|
||||||
QObject* thisObject = dynamic_cast<QObject*>(this);\
|
QObject* thisObject = dynamic_cast<QObject*>(this);\
|
||||||
if (thisObject) {\
|
if (thisObject) {\
|
||||||
|
@ -34,20 +36,50 @@ class QObject;
|
||||||
|
|
||||||
class DependencyManager {
|
class DependencyManager {
|
||||||
public:
|
public:
|
||||||
// Only accessible method.
|
// usage:
|
||||||
// usage: T* instance = DependencyManager::get<T>();
|
// T* instance = DependencyManager::get<T>();
|
||||||
|
// T* instance = DependencyManager::set<T>(Args... args);
|
||||||
|
// T* instance = DependencyManager::destroy<T>();
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static QSharedPointer<T> get();
|
static QSharedPointer<T> get();
|
||||||
|
|
||||||
|
template<typename T, typename ...Args>
|
||||||
|
static QSharedPointer<T> set(Args&&... args);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void destroy();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static DependencyManager& getInstance();
|
template<typename T>
|
||||||
DependencyManager() {}
|
static QSharedPointer<T>& storage();
|
||||||
~DependencyManager();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
QSharedPointer<T> DependencyManager::get() {
|
QSharedPointer<T> DependencyManager::get() {
|
||||||
static QSharedPointer<T> sharedPointer = QSharedPointer<T>(new T(), &T::customDeleter);
|
static bool requireSet = !T::REQUIRE_SET;
|
||||||
|
if (requireSet) {
|
||||||
|
set<T>();
|
||||||
|
requireSet = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return storage<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename ...Args>
|
||||||
|
QSharedPointer<T> DependencyManager::set(Args&&... args) {
|
||||||
|
QSharedPointer<T> instance(new T(args...), &T::customDeleter);
|
||||||
|
storage<T>().swap(instance);
|
||||||
|
return storage<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void DependencyManager::destroy() {
|
||||||
|
storage<T>().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QSharedPointer<T>& DependencyManager::storage() {
|
||||||
|
static QSharedPointer<T> sharedPointer;
|
||||||
return sharedPointer;
|
return sharedPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue