mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 19:41:20 +02:00
DM returns shared pointer
This commit is contained in:
parent
e5e2eb4e8a
commit
cf6aa563ac
2 changed files with 22 additions and 33 deletions
|
@ -17,8 +17,4 @@ DependencyManager& DependencyManager::getInstance() {
|
||||||
}
|
}
|
||||||
|
|
||||||
DependencyManager::~DependencyManager() {
|
DependencyManager::~DependencyManager() {
|
||||||
foreach (Dependency* instance, _instanceHash) {
|
|
||||||
delete instance;
|
|
||||||
}
|
|
||||||
_instanceHash.clear();
|
|
||||||
}
|
}
|
|
@ -12,55 +12,48 @@
|
||||||
#ifndef hifi_DependencyManager_h
|
#ifndef hifi_DependencyManager_h
|
||||||
#define hifi_DependencyManager_h
|
#define hifi_DependencyManager_h
|
||||||
|
|
||||||
#include <QHash>
|
#include <QSharedPointer>
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
#include <assert.h>
|
|
||||||
|
#define SINGLETON_DEPENDENCY(T)\
|
||||||
|
public:\
|
||||||
|
typedef QSharedPointer<T> SharedPointer;\
|
||||||
|
private:\
|
||||||
|
void customDeleter() { delete this; }\
|
||||||
|
friend class DependencyManager;
|
||||||
|
|
||||||
|
class QObject;
|
||||||
|
|
||||||
class DependencyManager {
|
class DependencyManager {
|
||||||
public:
|
public:
|
||||||
// Only accessible method.
|
// Only accessible method.
|
||||||
// usage: T* instance = DependencyManager::get<T>();
|
// usage: T* instance = DependencyManager::get<T>();
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static T* get();
|
static QSharedPointer<T> get();
|
||||||
|
|
||||||
// Any class T in the DependencyManager needs to subclass Dependency
|
|
||||||
// They also need to have protected constructor(s) and virtual destructor
|
|
||||||
// As well as declare DependencyManager a friend class
|
|
||||||
class Dependency {
|
|
||||||
protected:
|
|
||||||
Dependency() {}
|
|
||||||
virtual ~Dependency() {} // Ensure the proper destruction of the object
|
|
||||||
friend DependencyManager;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static DependencyManager& getInstance();
|
static DependencyManager& getInstance();
|
||||||
DependencyManager() {}
|
DependencyManager() {}
|
||||||
~DependencyManager();
|
~DependencyManager();
|
||||||
|
|
||||||
typedef QHash<QString, Dependency*> InstanceHash;
|
static void noDelete(void*) {}
|
||||||
static InstanceHash& getInstanceHash() { return getInstance()._instanceHash; }
|
|
||||||
InstanceHash _instanceHash;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T* DependencyManager::get() {
|
QSharedPointer<T> DependencyManager::get() {
|
||||||
const QString& typeId = typeid(T).name();
|
static QSharedPointer<T> sharedPointer;
|
||||||
|
static T* instance = new T();
|
||||||
|
|
||||||
// Search the hash for global instance
|
|
||||||
Dependency* instance = getInstanceHash().value(typeId, NULL);
|
|
||||||
if (instance) {
|
if (instance) {
|
||||||
return dynamic_cast<T*>(instance);
|
if (dynamic_cast<QObject*>(instance)) { // If this is a QOject, call deleteLater for destruction
|
||||||
|
sharedPointer = QSharedPointer<T>(instance, &T::deleteLater);
|
||||||
|
} else { // Otherwise use custom deleter to avoid issues between private destructor and QSharedPointer
|
||||||
|
sharedPointer = QSharedPointer<T>(instance, &T::customDeleter);
|
||||||
|
}
|
||||||
|
instance = NULL;
|
||||||
}
|
}
|
||||||
|
return sharedPointer;
|
||||||
// Found no instance in hash so we create one.
|
|
||||||
T* newInstance = new T();
|
|
||||||
instance = dynamic_cast<Dependency*>(newInstance);
|
|
||||||
assert(instance != NULL); // If this triggers, check that T is derived from Dependency
|
|
||||||
getInstanceHash().insert(typeId, instance);
|
|
||||||
return newInstance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // hifi_DependencyManager_h
|
#endif // hifi_DependencyManager_h
|
||||||
|
|
Loading…
Reference in a new issue