Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdeferredpointer_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
5#ifndef QDEFERREDPOINTER_P_H
6#define QDEFERREDPOINTER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17
18#include <qtqmlcompilerexports.h>
19
20#include <QtCore/private/qglobal_p.h>
21#include <QtCore/qsharedpointer.h>
22
24
25template<typename T>
26class QDeferredSharedPointer;
27
28template<typename T>
30
31template<typename U, typename F>
32void resetFactoryImpl(QDeferredSharedPointer<U>&, F&&);
33
34template<typename T>
36{
37public:
38 bool isValid() const;
39
40private:
41 friend class QDeferredSharedPointer<const T>;
42 friend class QDeferredWeakPointer<const T>;
43 friend class QDeferredSharedPointer<T>;
44 friend class QDeferredWeakPointer<T>;
45 void populate(const QSharedPointer<T> &) const;
46};
47
48template<typename T>
49class QDeferredSharedPointer
50{
51public:
52 using Factory = QDeferredFactory<std::remove_const_t<T>>;
53
54 Q_NODISCARD_CTOR QDeferredSharedPointer() = default;
55
56 Q_NODISCARD_CTOR QDeferredSharedPointer(QSharedPointer<T> data)
57 : m_data(std::move(data))
58 {}
59
60 Q_NODISCARD_CTOR QDeferredSharedPointer(QWeakPointer<T> data)
61 : m_data(std::move(data))
62 {}
63
64 Q_NODISCARD_CTOR QDeferredSharedPointer(QSharedPointer<T> data, QSharedPointer<Factory> factory)
65 : m_data(std::move(data)), m_factory(std::move(factory))
66 {
67 // You have to provide a valid pointer if you provide a factory. We cannot allocate the
68 // pointer for you because then two copies of the same QDeferredSharedPointer will diverge
69 // and lazy-load two separate data objects.
70 Q_ASSERT(!m_data.isNull() || m_factory.isNull());
71 }
72
73 [[nodiscard]] operator QSharedPointer<T>() const
74 {
75 lazyLoad();
76 return m_data;
77 }
78
79 operator QDeferredSharedPointer<const T>() const { return { m_data, m_factory }; }
80
81 [[nodiscard]] T &operator*() const { lazyLoad(); return m_data.operator*(); }
82 [[nodiscard]] T *operator->() const { lazyLoad(); return m_data.operator->(); }
83
84 bool isNull() const
85 {
86 return m_data.isNull();
87 }
88
89 explicit operator bool() const noexcept { return !isNull(); }
90 bool operator !() const noexcept { return isNull(); }
91
92 [[nodiscard]] T *data() const { lazyLoad(); return m_data.data(); }
93 [[nodiscard]] T *get() const { return data(); }
94
95 friend size_t qHash(const QDeferredSharedPointer &ptr, size_t seed = 0)
96 {
97 // This is a hash of the pointer, not the data.
98 return qHash(ptr.m_data, seed);
99 }
100
101 friend bool operator==(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
102 {
103 // This is a comparison of the pointers, not their data. As we require the pointers to
104 // be given in the ctor, we can do this.
105 return a.m_data == b.m_data;
106 }
107
108 friend bool operator!=(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
109 {
110 return !(a == b);
111 }
112
113 friend bool operator<(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
114 {
115 return a.m_data < b.m_data;
116 }
117
118 friend bool operator<=(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
119 {
120 return a.m_data <= b.m_data;
121 }
122
123 friend bool operator>(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
124 {
125 return a.m_data > b.m_data;
126 }
127
128 friend bool operator>=(const QDeferredSharedPointer &a, const QDeferredSharedPointer &b)
129 {
130 return a.m_data >= b.m_data;
131 }
132
133 template <typename U>
134 friend bool operator==(const QDeferredSharedPointer &a, const QSharedPointer<U> &b)
135 {
136 return a.m_data == b;
137 }
138
139 template <typename U>
140 friend bool operator!=(const QDeferredSharedPointer &a, const QSharedPointer<U> &b)
141 {
142 return !(a == b);
143 }
144
145 template <typename U>
146 friend bool operator==(const QSharedPointer<U> &a, const QDeferredSharedPointer &b)
147 {
148 return b == a;
149 }
150
151 template <typename U>
152 friend bool operator!=(const QSharedPointer<U> &a, const QDeferredSharedPointer &b)
153 {
154 return b != a;
155 }
156
157 Factory *factory() const
158 {
159 return (m_factory && m_factory->isValid()) ? m_factory.data() : nullptr;
160 }
161
162private:
163 friend class QDeferredWeakPointer<T>;
164 template<typename U, typename F>
165 friend void resetFactoryImpl(QDeferredSharedPointer<U>&, F&&);
166
167 void lazyLoad() const
168 {
169 if (Factory *f = factory()) {
170 Factory localFactory;
171 std::swap(localFactory, *f); // Swap before executing, to avoid recursion
172 localFactory.populate(m_data.template constCast<std::remove_const_t<T>>());
173 }
174 }
175
176 QSharedPointer<T> m_data;
177 QSharedPointer<Factory> m_factory;
178};
179
180template<typename T>
182{
183public:
185
187
192
196
198 {
199 lazyLoad();
200 return m_data;
201 }
202
204
205 operator QDeferredWeakPointer<const T>() const { return {m_data, m_factory}; }
206
211
212 bool isNull() const { return m_data.isNull(); }
213
214 explicit operator bool() const noexcept { return !isNull(); }
215 bool operator !() const noexcept { return isNull(); }
216
218 {
219 return a.m_data == b.m_data;
220 }
221
223 {
224 return !(a == b);
225 }
226 size_t owner_hash() const noexcept { return m_data.owner_hash(); }
227
228private:
229 void lazyLoad() const
230 {
231 if (m_factory) {
233 if (factory->isValid()) {
235 std::swap(localFactory, *factory); // Swap before executing, to avoid recursion
238 }
239 }
240 }
241
243 QWeakPointer<Factory> m_factory;
244};
245
246
247QT_END_NAMESPACE
248
249#endif // QDEFERREDPOINTER_P_H
bool isValid() const
QString typeName() const
void setIsFlag(bool isFlag)
void setLineNumber(int lineNumber)
friend bool operator!=(const QQmlJSMetaEnum &a, const QQmlJSMetaEnum &b)
void setName(const QString &name)
QQmlJSMetaEnum()=default
int lineNumber() const
friend size_t qHash(const QQmlJSMetaEnum &e, size_t seed=0)
friend bool operator==(const QQmlJSMetaEnum &a, const QQmlJSMetaEnum &b)
void setTypeName(const QString &typeName)
bool hasKey(const QString &key) const
void setIsScoped(bool v)
void setType(const QSharedPointer< const QQmlJSScope > &type)
QSharedPointer< const QQmlJSScope > type() const
int value(const QString &key) const
bool isQml() const
void setIsQml(bool v)
void addValue(int value)
bool isScoped() const
QList< int > values() const
bool isFlag() const
QString alias() const
QStringList keys() const
bool isValid() const
void addKey(const QString &key)
void setAlias(const QString &alias)
QString name() const
QQmlJSMetaEnum(QString name)
bool hasValues() const
QQmlJSMetaReturnType returnValue() const
QQmlJSMetaMethod()=default
void setReturnType(QWeakPointer< const QQmlJSScope > type)
void setSourceLocation(QQmlJS::SourceLocation location)
QQmlJS::SourceLocation sourceLocation() const
QString methodName() const
QQmlJSMetaMethodType MethodType
void setMethodName(const QString &name)
void setReturnTypeName(const QString &typeName)
QString returnTypeName() const
QQmlJSMetaMethod(QString name, QString returnType=QString())
QList< QQmlJSMetaParameter > parameters() const
void setReturnValue(const QQmlJSMetaReturnType returnValue)
QSharedPointer< const QQmlJSScope > returnType() const
void setIsPointer(bool isPointer)
void setType(QWeakPointer< const QQmlJSScope > type)
void setIsList(bool isList)
friend bool operator!=(const QQmlJSMetaParameter &a, const QQmlJSMetaParameter &b)
friend size_t qHash(const QQmlJSMetaParameter &e, size_t seed=0)
void setName(const QString &name)
void setTypeName(const QString &typeName)
void setTypeQualifier(Constness typeQualifier)
Constness typeQualifier() const
QString typeName() const
QQmlJSMetaParameter(QString name=QString(), QString typeName=QString(), Constness typeQualifier=NonConst, QWeakPointer< const QQmlJSScope > type={})
friend bool operator==(const QQmlJSMetaParameter &a, const QQmlJSMetaParameter &b)
QSharedPointer< const QQmlJSScope > type() const
\inmodule QtQmlCompiler
friend bool operator!=(const QQmlJSMetaProperty &a, const QQmlJSMetaProperty &b)
QString notify() const
QSharedPointer< const QQmlJSScope > aliasTargetScope() const
void setType(const QDeferredSharedPointer< const QQmlJSScope > &type)
QString aliasExpression() const
friend bool operator==(const QQmlJSMetaProperty &a, const QQmlJSMetaProperty &b)
void setIsOverride(bool isOverride)
void setPropertyName(const QString &propertyName)
QString aliasTargetName() const
void setAnnotations(const QList< QQmlJSAnnotation > &annotation)
void setIsList(bool isList)
QString bindable() const
void setPrivateClass(const QString &privateClass)
void setRead(const QString &read)
friend size_t qHash(const QQmlJSMetaProperty &prop, size_t seed=0)
void setBindable(const QString &bindable)
void setWrite(const QString &write)
void setIsPropertyConstant(bool isPropertyConstant)
QString reset() const
void setRevision(int revision)
void setIsFinal(bool isFinal)
QDeferredSharedPointer< const QQmlJSScope > type() const
QString typeName() const
void setAliasTargetScope(const QSharedPointer< const QQmlJSScope > &scope)
void setSourceLocation(const QQmlJS::SourceLocation &newSourceLocation)
QString write() const
void setIsTypeConstant(bool isTypeConstant)
const QList< QQmlJSAnnotation > & annotations() const
QQmlJS::SourceLocation sourceLocation() const
void setTypeName(const QString &typeName)
QQmlJSMetaProperty()=default
void setReset(const QString &reset)
QString privateClass() const
void setIsVirtual(bool isVirtual)
void setIsWritable(bool isWritable)
void setAliasExpression(const QString &aliasString)
void setAliasTargetName(const QString &name)
void setIndex(int index)
void setNotify(const QString &notify)
bool isPropertyConstant() const
bool isTypeConstant() const
QString propertyName() const
void setIsPointer(bool isPointer)
\inmodule QtQmlCompiler
MethodType
Definition qqmlsa.h:49
AccessSemantics
Definition qqmlsa.h:50
Combined button and popup list for selecting options.
static QString toNumericString(double value)
static QString messageTypeForMethod(const QString &method)
static QString derefContentPointer(const QString &contentPointer)
static bool canTypeBeAffectedBySideEffects(const QQmlJSTypeResolver *typeResolver, const QQmlJSRegisterContent &baseType)
#define BYTECODE_UNIMPLEMENTED()
#define INJECT_TRACE_INFO(function)
#define REJECT
static QString registerName(int registerIndex, int offset)
static QString minExpression(int argc)
static QString maxExpression(int argc)
static bool isTypeStorable(const QQmlJSTypeResolver *resolver, const QQmlJSScope::ConstPtr &type)
QQmlSA::MethodType QQmlJSMetaMethodType
QQmlJSMetaParameter QQmlJSMetaReturnType
ScriptBindingValueType
@ ScriptValue_Function
@ ScriptValue_Unknown
@ ScriptValue_Undefined
void resetFactoryImpl(QDeferredSharedPointer< T > &pointer, U &&factory)