Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-02 09:27:02

0001 // Copyright (C) 2021 The Qt Company Ltd.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
0003 // Qt-Security score:significant reason:default
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     // ### Unused, but keep for BC
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 // QBINDINGSTORAGE_H