Remove the special handling of QProperty<bool>

Since we will be storing property data differently in most cases,
having this special case would create too many additional complications.

Change-Id: I27042b0730559bb375d8e3c07324398403a9885d
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Lars Knoll 2020-08-12 11:33:13 +02:00
parent 733d890430
commit 331c106bdb
4 changed files with 5 additions and 54 deletions

View File

@ -86,15 +86,8 @@ void QPropertyBindingPrivate::markDirtyAndNotifyObservers()
dirty = true;
if (firstObserver)
firstObserver.notify(this, propertyDataPtr);
if (hasStaticObserver) {
if (isBool) {
auto propertyPtr = reinterpret_cast<QPropertyBase *>(propertyDataPtr);
bool oldValue = propertyPtr->extraBit();
staticObserverCallback(staticObserver, &oldValue);
} else {
if (hasStaticObserver)
staticObserverCallback(staticObserver, propertyDataPtr);
}
}
}
bool QPropertyBindingPrivate::evaluateIfDirtyAndReturnTrueIfValueChanged()
@ -123,26 +116,10 @@ bool QPropertyBindingPrivate::evaluateIfDirtyAndReturnTrueIfValueChanged()
bool changed = false;
if (hasStaticObserver && staticGuardCallback) {
if (isBool) {
auto propertyPtr = reinterpret_cast<QPropertyBase *>(propertyDataPtr);
bool newValue = propertyPtr->extraBit();
changed = staticGuardCallback(metaType, &newValue, evaluationFunction, staticObserver);
if (changed && !error.hasError())
propertyPtr->setExtraBit(newValue);
} else {
changed = staticGuardCallback(metaType, propertyDataPtr, evaluationFunction, staticObserver);
}
} else {
if (isBool) {
auto propertyPtr = reinterpret_cast<QPropertyBase *>(propertyDataPtr);
bool newValue = propertyPtr->extraBit();
changed = evaluationFunction(metaType, &newValue);
if (changed && !error.hasError())
propertyPtr->setExtraBit(newValue);
} else {
changed = evaluationFunction(metaType, propertyDataPtr);
}
}
dirty = false;
return changed;

View File

@ -140,7 +140,6 @@ private:
bool dirty = false;
bool updating = false;
bool hasStaticObserver = false;
bool isBool = false;
QUntypedPropertyBinding::BindingEvaluationFunction evaluationFunction;
@ -168,8 +167,7 @@ public:
QPropertyBindingPrivate(QMetaType metaType, QUntypedPropertyBinding::BindingEvaluationFunction evaluationFunction,
const QPropertyBindingSourceLocation &location)
: isBool(metaType.id() == QMetaType::Bool)
, evaluationFunction(std::move(evaluationFunction))
: evaluationFunction(std::move(evaluationFunction))
, inlineDependencyObservers() // Explicit initialization required because of union
, location(location)
, metaType(metaType)

View File

@ -157,28 +157,6 @@ public:
}
};
template<>
struct QPropertyValueStorage<bool>
{
QPropertyBase priv;
QPropertyValueStorage() = default;
Q_DISABLE_COPY(QPropertyValueStorage)
explicit QPropertyValueStorage(bool initialValue) { priv.setExtraBit(initialValue); }
QPropertyValueStorage &operator=(bool newValue) { priv.setExtraBit(newValue); return *this; }
QPropertyValueStorage(QPropertyValueStorage &&other) : priv(std::move(other.priv), this) {}
QPropertyValueStorage &operator=(QPropertyValueStorage &&other) { priv.moveAssign(std::move(other.priv), this); return *this; }
bool getValue() const { return priv.extraBit(); }
bool setValueAndReturnTrueIfChanged(bool v)
{
if (v == priv.extraBit())
return false;
priv.setExtraBit(v);
return true;
}
};
template <typename T, typename Tag>
class QTagPreservingPointerToPointer
{

View File

@ -259,8 +259,6 @@ void tst_QProperty::propertyArrays()
void tst_QProperty::boolProperty()
{
static_assert(sizeof(QProperty<bool>) == sizeof(void*), "Size of QProperty<bool> specialization must not exceed size of pointer");
QProperty<bool> first(true);
QProperty<bool> second(false);
QProperty<bool> all;