File indexing completed on 2026-08-02 09:27:02
0001
0002
0003
0004
0005 #ifndef QBINDINGSTORAGE_H
0006 #define QBINDINGSTORAGE_H
0007
0008 #include <QtCore/qglobal.h>
0009 #include <QtCore/qnamespace.h>
0010
0011 QT_BEGIN_NAMESPACE
0012
0013 template <typename Class, typename T, auto Offset, auto Setter, auto Signal, auto Getter>
0014 class QObjectCompatProperty;
0015 struct QPropertyDelayedNotifications;
0016 class QUntypedPropertyData;
0017
0018 namespace QtPrivate {
0019
0020 class QPropertyBindingData;
0021 struct BindingEvaluationState;
0022 struct CompatPropertySafePoint;
0023 }
0024
0025 struct QBindingStatus
0026 {
0027 QtPrivate::BindingEvaluationState *currentlyEvaluatingBinding = nullptr;
0028 QtPrivate::CompatPropertySafePoint *currentCompatProperty = nullptr;
0029 Qt::HANDLE threadId = nullptr;
0030 QPropertyDelayedNotifications *groupUpdateData = nullptr;
0031 };
0032
0033 namespace QtPrivate {
0034 struct QBindingStatusAccessToken;
0035 Q_AUTOTEST_EXPORT QBindingStatus *getBindingStatus(QBindingStatusAccessToken);
0036 Q_AUTOTEST_EXPORT void setBindingStatus(QBindingStatus *, QBindingStatusAccessToken);
0037 }
0038
0039
0040 struct QBindingStorageData;
0041 class Q_CORE_EXPORT QBindingStorage
0042 {
0043 mutable QBindingStorageData *d = nullptr;
0044 QBindingStatus *bindingStatus = nullptr;
0045
0046 template<typename Class, typename T, auto Offset, auto Setter, auto Signal, auto Getter>
0047 friend class QObjectCompatProperty;
0048 friend class QObjectPrivate;
0049 friend class QtPrivate::QPropertyBindingData;
0050 public:
0051 QBindingStorage();
0052 ~QBindingStorage();
0053
0054 bool isEmpty() { return !d; }
0055 bool isValid() const noexcept { return bindingStatus; }
0056
0057 const QBindingStatus *status(QtPrivate::QBindingStatusAccessToken) const;
0058
0059 void registerDependency(const QUntypedPropertyData *data) const
0060 {
0061 if (!bindingStatus || !bindingStatus->currentlyEvaluatingBinding)
0062 return;
0063 registerDependency_helper(data);
0064 }
0065 QtPrivate::QPropertyBindingData *bindingData(const QUntypedPropertyData *data) const
0066 {
0067 if (!d)
0068 return nullptr;
0069 return bindingData_helper(data);
0070 }
0071
0072 #if QT_CORE_REMOVED_SINCE(6, 2)
0073 void maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const { registerDependency(data); }
0074 #endif
0075
0076 QtPrivate::QPropertyBindingData *bindingData(QUntypedPropertyData *data, bool create)
0077 {
0078 if (!d && !create)
0079 return nullptr;
0080 return bindingData_helper(data, create);
0081 }
0082 private:
0083 void reinitAfterThreadMove();
0084 void clear();
0085 void registerDependency_helper(const QUntypedPropertyData *data) const;
0086 #if QT_CORE_REMOVED_SINCE(6, 2)
0087
0088 void maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const;
0089 #endif
0090 QtPrivate::QPropertyBindingData *bindingData_helper(const QUntypedPropertyData *data) const;
0091 QtPrivate::QPropertyBindingData *bindingData_helper(QUntypedPropertyData *data, bool create);
0092 };
0093
0094 QT_END_NAMESPACE
0095
0096 #endif