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
qmetaobjectbuilder_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QMETAOBJECTBUILDER_P_H
6#define QMETAOBJECTBUILDER_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 for the convenience
13// of moc. This header file may change from version to version without notice,
14// or even be removed.
15//
16// We mean it.
17//
18
19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qobject.h>
21#include <QtCore/qmetaobject.h>
22#include <QtCore/qdatastream.h>
23#include <QtCore/qhash.h>
24#include <QtCore/qmap.h>
25
26#include <private/qmetaobject_p.h>
27
28QT_BEGIN_NAMESPACE
29
30class QMetaObjectBuilderPrivate;
31class QMetaMethodBuilder;
33class QMetaPropertyBuilder;
35class QMetaEnumBuilder;
37
38class Q_CORE_EXPORT QMetaObjectBuilder
39{
40public:
41 enum AddMember
42 {
43 ClassName = 0x00000001,
44 SuperClass = 0x00000002,
45 Methods = 0x00000004,
46 Signals = 0x00000008,
47 Slots = 0x00000010,
48 Constructors = 0x00000020,
49 Properties = 0x00000040,
50 Enumerators = 0x00000080,
51 ClassInfos = 0x00000100,
52 RelatedMetaObjects = 0x00000200,
53 StaticMetacall = 0x00000400,
54 PublicMethods = 0x00000800,
55 ProtectedMethods = 0x00001000,
56 PrivateMethods = 0x00002000,
57 AllMembers = 0x7FFFFFFF,
58 AllPrimaryMembers = 0x7FFFFBFC
59 };
60 Q_DECLARE_FLAGS(AddMembers, AddMember)
61
62 QMetaObjectBuilder();
63 explicit QMetaObjectBuilder(const QMetaObject *prototype, QMetaObjectBuilder::AddMembers members = AllMembers);
64 virtual ~QMetaObjectBuilder();
65
66 QByteArray className() const;
67 void setClassName(const QByteArray& name);
68
69 const QMetaObject *superClass() const;
70 void setSuperClass(const QMetaObject *meta);
71
72 MetaObjectFlags flags() const;
73 void setFlags(MetaObjectFlags);
74
75 int methodCount() const;
76 int constructorCount() const;
77 int propertyCount() const;
78 int enumeratorCount() const;
79 int classInfoCount() const;
80 int relatedMetaObjectCount() const;
81
82 QMetaMethodBuilder addMethod(const QByteArray& signature);
83 QMetaMethodBuilder addMethod(const QByteArray& signature, const QByteArray& returnType);
84 QMetaMethodBuilder addMethod(const QMetaMethod& prototype);
85
86 QMetaMethodBuilder addSlot(const QByteArray& signature);
87 QMetaMethodBuilder addSignal(const QByteArray& signature);
88
89 QMetaMethodBuilder addConstructor(const QByteArray& signature);
90 QMetaMethodBuilder addConstructor(const QMetaMethod& prototype);
91
92 QMetaPropertyBuilder addProperty(const QByteArray& name, const QByteArray& type, int notifierId=-1);
93 QMetaPropertyBuilder addProperty(const QByteArray& name, const QByteArray& type, QMetaType metaType, int notifierId=-1);
94 QMetaPropertyBuilder addProperty(const QMetaProperty& prototype);
95
96 QMetaEnumBuilder addEnumerator(const QByteArray& name);
97 QMetaEnumBuilder addEnumerator(const QMetaEnum& prototype);
98
99 int addClassInfo(const QByteArray& name, const QByteArray& value);
100
101 int addRelatedMetaObject(const QMetaObject *meta);
102
103 void addMetaObject(const QMetaObject *prototype, QMetaObjectBuilder::AddMembers members = AllMembers);
104
105 QMetaMethodBuilder method(int index) const;
106 QMetaMethodBuilder signal(int index) const;
107 QMetaMethodBuilder constructor(int index) const;
108 QMetaPropertyBuilder property(int index) const;
109 QMetaEnumBuilder enumerator(int index) const;
110 const QMetaObject *relatedMetaObject(int index) const;
111
112 QByteArray classInfoName(int index) const;
113 QByteArray classInfoValue(int index) const;
114
115 void removeMethod(int index);
116 void removeSignal(int index);
117 void removeConstructor(int index);
118 void removeProperty(int index);
119 void removeEnumerator(int index);
120 void removeClassInfo(int index);
121 void removeRelatedMetaObject(int index);
122
123 int indexOfMethod(const QByteArray& signature);
124 int indexOfSignal(const QByteArray& signature);
125 int indexOfSlot(const QByteArray& signature);
126 int indexOfConstructor(const QByteArray& signature);
127 int indexOfProperty(const QByteArray& name);
128 int indexOfEnumerator(const QByteArray& name);
129 int indexOfClassInfo(const QByteArray& name);
130
131 typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
132
133 QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction() const;
134 void setStaticMetacallFunction(QMetaObjectBuilder::StaticMetacallFunction value);
135
136 QMetaObject *toMetaObject() const;
137
138private:
139 Q_DISABLE_COPY_MOVE(QMetaObjectBuilder)
140
141 QMetaObjectBuilderPrivate *d;
142
143 friend class QMetaMethodBuilder;
144 friend class QMetaPropertyBuilder;
145 friend class QMetaEnumBuilder;
146};
147
148class Q_CORE_EXPORT QMetaMethodBuilder
149{
150public:
151 QMetaMethodBuilder() = default;
152
153 int index() const;
154
155 QMetaMethod::MethodType methodType() const;
156 QByteArray signature() const;
157
158 QByteArray returnType() const;
159 void setReturnType(const QByteArray& value);
160
161 QList<QByteArrayView> parameterTypes() const;
162 QList<QByteArray> parameterNames() const;
163 void setParameterNames(const QList<QByteArray>& value);
164
165 QByteArray tag() const;
166 void setTag(const QByteArray& value);
167
168 QMetaMethod::Access access() const;
169 void setAccess(QMetaMethod::Access value);
170
171 int attributes() const;
172 void setAttributes(int value);
173
174 bool isConst() const;
175 void setConst(bool methodIsConst=true);
176
177 int revision() const;
178 void setRevision(int revision);
179
180private:
181 const QMetaObjectBuilder *_mobj = nullptr;
182 int _index = 0;
183 QMetaMethod::MethodType _type = QMetaMethod::MethodType::Method;
184
185 friend class QMetaObjectBuilder;
186 friend class QMetaPropertyBuilder;
187
188 QMetaMethodBuilder(const QMetaObjectBuilder *mobj, int index, QMetaMethod::MethodType type)
189 : _mobj(mobj), _index(index), _type(type) {}
190
191 QMetaMethodBuilderPrivate *d_func() const;
192};
193
194class Q_CORE_EXPORT QMetaPropertyBuilder
195{
196public:
197 QMetaPropertyBuilder() : _mobj(nullptr), _index(0) {}
198
199 int index() const { return _index; }
200
201 QByteArray name() const;
202 QByteArray type() const;
203
204 bool hasNotifySignal() const;
205 QMetaMethodBuilder notifySignal() const;
206 void setNotifySignal(const QMetaMethodBuilder& value);
207 void removeNotifySignal();
208
209 bool isReadable() const;
210 bool isWritable() const;
211 bool isResettable() const;
212 bool isDesignable() const;
213 bool isScriptable() const;
214 bool isStored() const;
215 bool isEditable() const;
216 bool isUser() const;
217 bool hasStdCppSet() const;
218 bool isEnumOrFlag() const;
219 bool isConstant() const;
220 bool isFinal() const;
221 bool isVirtual() const;
222 bool isOverride() const;
223 bool isAlias() const;
224 bool isBindable() const;
225 bool isRequired() const;
226
227 void setReadable(bool value);
228 void setWritable(bool value);
229 void setResettable(bool value);
230 void setDesignable(bool value);
231 void setScriptable(bool value);
232 void setStored(bool value);
233 void setUser(bool value);
234 void setStdCppSet(bool value);
235 void setEnumOrFlag(bool value);
236 void setConstant(bool value);
237 void setFinal(bool value);
238 void setVirtual(bool value);
239 void setOverride(bool value);
240 void setAlias(bool value);
241 void setBindable(bool value);
242 void setRequired(bool value);
243
244 int revision() const;
245 void setRevision(int revision);
246
247private:
248 const QMetaObjectBuilder *_mobj;
249 int _index;
250
251 friend class QMetaObjectBuilder;
252
253 QMetaPropertyBuilder(const QMetaObjectBuilder *mobj, int index)
254 : _mobj(mobj), _index(index) {}
255
256 QMetaPropertyBuilderPrivate *d_func() const;
257};
258
259class Q_CORE_EXPORT QMetaEnumBuilder
260{
261public:
262 QMetaEnumBuilder() : _mobj(nullptr), _index(0) {}
263
264 int index() const { return _index; }
265
266 QByteArray name() const;
267
268 QByteArray enumName() const;
269 void setEnumName(const QByteArray &alias);
270
271 QMetaType metaType() const;
272 void setMetaType(QMetaType metaType);
273
274 bool isFlag() const;
275 void setIsFlag(bool value);
276
277 bool isScoped() const;
278 void setIsScoped(bool value);
279
280 bool is64Bit() const;
281 void setIs64Bit(bool value);
282
283 int keyCount() const;
284 QByteArray key(int index) const;
285 int value(int index) const;
286 std::optional<quint64> value64(int index) const;
287
288 int addKey(const QByteArray &name, int value);
289 int addKey(const QByteArray &name, quint64 value);
290 void removeKey(int index);
291
292private:
293 const QMetaObjectBuilder *_mobj;
294 int _index;
295
296 friend class QMetaObjectBuilder;
297
298 QMetaEnumBuilder(const QMetaObjectBuilder *mobj, int index)
299 : _mobj(mobj), _index(index) {}
300
301 QMetaEnumBuilderPrivate *d_func() const;
302};
303
304class Q_CORE_EXPORT QMetaStringTable
305{
306 Q_DISABLE_COPY_MOVE(QMetaStringTable)
307public:
308 explicit QMetaStringTable(const QByteArray &className);
309
310 int enter(const QByteArray &value);
311
312 static int preferredAlignment();
313 int blobSize() const;
314 void writeBlob(char *out) const;
315
316private:
317 typedef QHash<QByteArray, int> Entries; // string --> index mapping
318 Entries m_entries;
319 int m_index;
320 QByteArray m_className;
321};
322
323Q_DECLARE_OPERATORS_FOR_FLAGS(QMetaObjectBuilder::AddMembers)
324
325QT_END_NAMESPACE
326
327#endif
QMetaEnumBuilderPrivate(const QByteArray &_name)
int addKey(const QByteArray &name, quint64 value)
QList< QByteArray > parameterNames
void setAccess(QMetaMethod::Access value)
QMetaMethod::Access access() const
QMetaMethod::MethodType methodType() const
QMetaMethodBuilderPrivate(QMetaMethod::MethodType _methodType, const QByteArray &_signature, const QByteArray &_returnType=QByteArray("void"), QMetaMethod::Access _access=QMetaMethod::Public, int _revision=0)
QList< QByteArrayView > parameterTypes() const
QList< const QMetaObject * > relatedMetaObjects
std::vector< QMetaMethodBuilderPrivate > methods
QList< QByteArray > classInfoValues
std::vector< QMetaMethodBuilderPrivate > signalVec
std::vector< QMetaPropertyBuilderPrivate > properties
std::vector< QMetaMethodBuilderPrivate > constructors
std::vector< QMetaEnumBuilderPrivate > enumerators
QList< QByteArray > classInfoNames
void setFlag(int f, bool value)
QMetaPropertyBuilderPrivate(const QByteArray &_name, const QByteArray &_type, QMetaType _metaType, int notifierIdx=-1, int _revision=0)
int enter(const QByteArray &value)
void writeBlob(char *out) const
static int preferredAlignment()
@ MetaObjectPrivateFieldCount
#define ALIGN(size, type)
static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, int expectedSize)
static const QMetaObjectPrivate * qmobPriv(const uint *data)
static void writeString(char *out, int i, const QByteArray &str, const int offsetOfStringdataMember, int &stringdataOffset)
static bool isBuiltinType(QByteArrayView type)
static int aggregateParameterCount(const std::vector< QMetaMethodBuilderPrivate > &methods)
Q_DECLARE_TYPEINFO(QMetaEnumBuilderPrivate, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(QMetaPropertyBuilderPrivate, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(QMetaMethodBuilderPrivate, Q_RELOCATABLE_TYPE)