diff options
Diffstat (limited to 'src/corelib/kernel/qbindingstorage.h')
-rw-r--r-- | src/corelib/kernel/qbindingstorage.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/corelib/kernel/qbindingstorage.h b/src/corelib/kernel/qbindingstorage.h new file mode 100644 index 0000000000..1c03b23bfa --- /dev/null +++ b/src/corelib/kernel/qbindingstorage.h @@ -0,0 +1,94 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QBINDINGSTORAGE_H +#define QBINDINGSTORAGE_H + +#include <QtCore/qglobal.h> +#include <QtCore/qnamespace.h> + +QT_BEGIN_NAMESPACE + +template <typename Class, typename T, auto Offset, auto Setter, auto Signal, auto Getter> +class QObjectCompatProperty; +struct QPropertyDelayedNotifications; +class QUntypedPropertyData; + +namespace QtPrivate { + +class QPropertyBindingData; +struct BindingEvaluationState; +struct CompatPropertySafePoint; +} + +struct QBindingStatus +{ + QtPrivate::BindingEvaluationState *currentlyEvaluatingBinding = nullptr; + QtPrivate::CompatPropertySafePoint *currentCompatProperty = nullptr; + Qt::HANDLE threadId = nullptr; + QPropertyDelayedNotifications *groupUpdateData = nullptr; +}; + +namespace QtPrivate { +struct QBindingStatusAccessToken; +Q_AUTOTEST_EXPORT QBindingStatus *getBindingStatus(QBindingStatusAccessToken); +} + + +struct QBindingStorageData; +class Q_CORE_EXPORT QBindingStorage +{ + mutable QBindingStorageData *d = nullptr; + QBindingStatus *bindingStatus = nullptr; + + template<typename Class, typename T, auto Offset, auto Setter, auto Signal, auto Getter> + friend class QObjectCompatProperty; + friend class QObjectPrivate; + friend class QtPrivate::QPropertyBindingData; +public: + QBindingStorage(); + ~QBindingStorage(); + + bool isEmpty() { return !d; } + bool isValid() const noexcept { return bindingStatus; } + + const QBindingStatus *status(QtPrivate::QBindingStatusAccessToken) const; + + void registerDependency(const QUntypedPropertyData *data) const + { + if (!bindingStatus || !bindingStatus->currentlyEvaluatingBinding) + return; + registerDependency_helper(data); + } + QtPrivate::QPropertyBindingData *bindingData(const QUntypedPropertyData *data) const + { + if (!d) + return nullptr; + return bindingData_helper(data); + } + +#if QT_CORE_REMOVED_SINCE(6, 2) + void maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const { registerDependency(data); } +#endif + + QtPrivate::QPropertyBindingData *bindingData(QUntypedPropertyData *data, bool create) + { + if (!d && !create) + return nullptr; + return bindingData_helper(data, create); + } +private: + void reinitAfterThreadMove(); + void clear(); + void registerDependency_helper(const QUntypedPropertyData *data) const; +#if QT_CORE_REMOVED_SINCE(6, 2) + // ### Unused, but keep for BC + void maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const; +#endif + QtPrivate::QPropertyBindingData *bindingData_helper(const QUntypedPropertyData *data) const; + QtPrivate::QPropertyBindingData *bindingData_helper(QUntypedPropertyData *data, bool create); +}; + +QT_END_NAMESPACE + +#endif // QBINDINGSTORAGE_H |