DM returns shared pointer

This commit is contained in:
Atlante45 2014-12-16 13:54:24 -08:00
parent e5e2eb4e8a
commit cf6aa563ac
2 changed files with 22 additions and 33 deletions

View file

@ -17,8 +17,4 @@ DependencyManager& DependencyManager::getInstance() {
} }
DependencyManager::~DependencyManager() { DependencyManager::~DependencyManager() {
foreach (Dependency* instance, _instanceHash) {
delete instance;
}
_instanceHash.clear();
} }

View file

@ -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