diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-08-21 17:52:22 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-09-02 22:44:28 +0200 |
commit | b788c64dc3a5e40ac410b9bd2c79f6f2d0963737 (patch) | |
tree | e1c0996448bfbd38242d3a53ff133e0fdd93a81c /src/corelib/kernel/qproperty_p.h | |
parent | 6778b247a8c20adfb3f4e3094077baae43f3e65c (diff) |
Cleanup QBindingPrivate
Simplify the data structure. We only need one pointer for either
the static callback or a bindingWrapper, so don't share it
with the dependency observer array.
Also ensure we reset the propertyDataPtr and clear the observers
when the binding gets removed from a property.
Change-Id: I4c1e7ec7823c3ef12c63d6f758b757e7bac60cae
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/kernel/qproperty_p.h')
-rw-r--r-- | src/corelib/kernel/qproperty_p.h | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h index 1085c037e6..fbc9a072c3 100644 --- a/src/corelib/kernel/qproperty_p.h +++ b/src/corelib/kernel/qproperty_p.h @@ -140,17 +140,16 @@ private: bool dirty = false; bool updating = false; bool hasStaticObserver = false; + bool hasBindingWrapper = false; QUntypedPropertyBinding::BindingEvaluationFunction evaluationFunction; QPropertyObserverPointer firstObserver; union { - ObserverArray inlineDependencyObservers; - struct { - QtPrivate::QPropertyObserverCallback staticObserverCallback; - QtPrivate::QPropertyGuardFunction staticGuardCallback; - }; + QtPrivate::QPropertyObserverCallback staticObserverCallback = nullptr; + QtPrivate::QPropertyBindingWrapper staticBindingWrapper; }; + ObserverArray inlineDependencyObservers; QScopedPointer<std::vector<QPropertyObserver>> heapObservers; QUntypedPropertyData *propertyDataPtr = nullptr; @@ -175,29 +174,21 @@ public: void setDirty(bool d) { dirty = d; } void setProperty(QUntypedPropertyData *propertyPtr) { propertyDataPtr = propertyPtr; } - void setStaticObserver(QtPrivate::QPropertyObserverCallback callback, QtPrivate::QPropertyGuardFunction guardCallback) + void setStaticObserver(QtPrivate::QPropertyObserverCallback callback, QtPrivate::QPropertyBindingWrapper guardCallback) { + Q_ASSERT(!(callback && guardCallback)); if (callback) { - if (!hasStaticObserver) { - if (dependencyObserverCount > 0) { - if (!heapObservers) - heapObservers.reset(new std::vector<QPropertyObserver>()); - for (size_t i = 0, end = qMin(dependencyObserverCount, inlineDependencyObservers.size()); i < end; ++i) - heapObservers->push_back(std::move(inlineDependencyObservers[i])); - } - inlineDependencyObservers.~ObserverArray(); - } - hasStaticObserver = true; + hasBindingWrapper = false; staticObserverCallback = callback; - staticGuardCallback = guardCallback; - } else if (hasStaticObserver) { + } else if (guardCallback) { + hasStaticObserver = false; + hasBindingWrapper = true; + staticBindingWrapper = guardCallback; + } else { hasStaticObserver = false; - new (&inlineDependencyObservers) ObserverArray(); - for (size_t i = 0, end = qMin(dependencyObserverCount, inlineDependencyObservers.size()); i < end; ++i) { - inlineDependencyObservers[i] = std::move(heapObservers->back()); - heapObservers->pop_back(); - } + hasBindingWrapper = false; + staticObserverCallback = nullptr; } } void prependObserver(QPropertyObserverPointer observer) { @@ -213,18 +204,16 @@ public: } void clearDependencyObservers() { - if (!hasStaticObserver) { - for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) { - QPropertyObserverPointer p{&inlineDependencyObservers[i]}; - p.unlink(); - } + for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) { + QPropertyObserverPointer p{&inlineDependencyObservers[i]}; + p.unlink(); } if (heapObservers) heapObservers->clear(); dependencyObserverCount = 0; } QPropertyObserverPointer allocateDependencyObserver() { - if (!hasStaticObserver && dependencyObserverCount < inlineDependencyObservers.size()) { + if (dependencyObserverCount < inlineDependencyObservers.size()) { ++dependencyObserverCount; return {&inlineDependencyObservers[dependencyObserverCount - 1]}; } @@ -249,6 +238,13 @@ public: void setError(QPropertyBindingError &&e) { error = std::move(e); } + void detachFromProperty() { + hasStaticObserver = false; + hasBindingWrapper = false; + propertyDataPtr = nullptr; + clearDependencyObservers(); + } + static QPropertyBindingPrivate *currentlyEvaluatingBinding(); }; |