Code review feedback

In DependencyManager::set<>() destroy the clear the previous before allocating the new instance.
This commit is contained in:
Anthony Thibault 2019-05-10 15:41:52 -07:00
parent 442a679108
commit fe17550a80
2 changed files with 18 additions and 8 deletions

View file

@ -26,8 +26,3 @@ QSharedPointer<Dependency> DependencyManager::safeGet(size_t hashCode) const {
return _instanceHash.value(hashCode);
}
void DependencyManager::safeSet(size_t hashCode, const QSharedPointer<Dependency>& value) {
QMutexLocker lock(&_instanceHashMutex);
_instanceHash.insert(hashCode, value);
}

View file

@ -85,7 +85,6 @@ private:
size_t getHashCode() const;
QSharedPointer<Dependency> safeGet(size_t hashCode) const;
void safeSet(size_t hashCode, const QSharedPointer<Dependency>& value);
QHash<size_t, QSharedPointer<Dependency>> _instanceHash;
QHash<size_t, size_t> _inheritanceHash;
@ -133,8 +132,16 @@ bool DependencyManager::isSet() {
template <typename T, typename ...Args>
QSharedPointer<T> DependencyManager::set(Args&&... args) {
static size_t hashCode = manager().getHashCode<T>();
QMutexLocker lock(&manager()._instanceHashMutex);
// clear the previous instance before constructing the new instance
auto iter = manager()._instanceHash.find(hashCode);
if (iter != manager()._instanceHash.end()) {
iter.value().clear();
}
QSharedPointer<T> newInstance(new T(args...), &T::customDeleter);
manager().safeSet(hashCode, newInstance);
manager()._instanceHash.insert(hashCode, newInstance);
return newInstance;
}
@ -142,8 +149,16 @@ QSharedPointer<T> DependencyManager::set(Args&&... args) {
template <typename T, typename I, typename ...Args>
QSharedPointer<T> DependencyManager::set(Args&&... args) {
static size_t hashCode = manager().getHashCode<T>();
QMutexLocker lock(&manager()._instanceHashMutex);
// clear the previous instance before constructing the new instance
auto iter = manager()._instanceHash.find(hashCode);
if (iter != manager()._instanceHash.end()) {
iter.value().clear();
}
QSharedPointer<T> newInstance(new I(args...), &I::customDeleter);
manager().safeSet(hashCode, newInstance);
_instanceHash.insert(hashCode, newInstance);
return newInstance;
}