diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index 43bb92258e..440c0ac68d 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -10,11 +10,3 @@ // #include "DependencyManager.h" - -DependencyManager& DependencyManager::getInstance() { - static DependencyManager instance; - return instance; -} - -DependencyManager::~DependencyManager() { -} \ No newline at end of file diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index fdf8030199..8ed55edf68 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -16,10 +16,12 @@ #include -#define SINGLETON_DEPENDENCY(T)\ +#define SINGLETON_DEPENDENCY(T, NEED_SET)\ public:\ typedef QSharedPointer SharedPointer;\ + typedef QWeakPointer WeakPointer;\ private:\ + static constexpr bool REQUIRE_SET = NEED_SET;\ void customDeleter() {\ QObject* thisObject = dynamic_cast(this);\ if (thisObject) {\ @@ -34,20 +36,50 @@ class QObject; class DependencyManager { public: - // Only accessible method. - // usage: T* instance = DependencyManager::get(); + // usage: + // T* instance = DependencyManager::get(); + // T* instance = DependencyManager::set(Args... args); + // T* instance = DependencyManager::destroy(); template static QSharedPointer get(); + template + static QSharedPointer set(Args&&... args); + + template + static void destroy(); + private: - static DependencyManager& getInstance(); - DependencyManager() {} - ~DependencyManager(); + template + static QSharedPointer& storage(); }; template QSharedPointer DependencyManager::get() { - static QSharedPointer sharedPointer = QSharedPointer(new T(), &T::customDeleter); + static bool requireSet = !T::REQUIRE_SET; + if (requireSet) { + set(); + requireSet = false; + } + + return storage(); +} + +template +QSharedPointer DependencyManager::set(Args&&... args) { + QSharedPointer instance(new T(args...), &T::customDeleter); + storage().swap(instance); + return storage(); +} + +template +void DependencyManager::destroy() { + storage().clear(); +} + +template +QSharedPointer& DependencyManager::storage() { + static QSharedPointer sharedPointer; return sharedPointer; }