1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtCore module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QMETATYPE_P_H
41#define QMETATYPE_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QtCore/private/qglobal_p.h>
55#include "qmetatype.h"
56
57QT_BEGIN_NAMESPACE
58
59namespace QModulesPrivate {
60enum Names { Core, Gui, Widgets, Unknown, ModulesCount /* ModulesCount has to be at the end */ };
61
62static inline int moduleForType(const uint typeId)
63{
64 if (typeId <= QMetaType::LastCoreType)
65 return Core;
66 if (typeId >= QMetaType::FirstGuiType && typeId <= QMetaType::LastGuiType)
67 return Gui;
68 if (typeId >= QMetaType::FirstWidgetsType && typeId <= QMetaType::LastWidgetsType)
69 return Widgets;
70 return Unknown;
71}
72
73template <typename T>
74class QTypeModuleInfo
75{
76public:
77 enum Module : bool {
78 IsCore = false,
79 IsWidget = false,
80 IsGui = false,
81 IsUnknown = true
82 };
83};
84
85#define QT_ASSIGN_TYPE_TO_MODULE(TYPE, MODULE) \
86template<> \
87class QTypeModuleInfo<TYPE > \
88{ \
89public: \
90 enum Module : bool { \
91 IsCore = (((MODULE) == (QModulesPrivate::Core))), \
92 IsWidget = (((MODULE) == (QModulesPrivate::Widgets))), \
93 IsGui = (((MODULE) == (QModulesPrivate::Gui))), \
94 IsUnknown = !(IsCore || IsWidget || IsGui) \
95 }; \
96 static inline int module() { return MODULE; } \
97 Q_STATIC_ASSERT((IsUnknown && !(IsCore || IsWidget || IsGui)) \
98 || (IsCore && !(IsUnknown || IsWidget || IsGui)) \
99 || (IsWidget && !(IsUnknown || IsCore || IsGui)) \
100 || (IsGui && !(IsUnknown || IsCore || IsWidget))); \
101};
102
103
104#define QT_DECLARE_CORE_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
105 QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Core);
106#define QT_DECLARE_GUI_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
107 QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Gui);
108#define QT_DECLARE_WIDGETS_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
109 QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Widgets);
110
111QT_WARNING_PUSH
112#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 900
113QT_WARNING_DISABLE_CLANG("-Wconstant-logical-operand")
114#endif
115
116QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_DECLARE_CORE_MODULE_TYPES_ITER)
117QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_DECLARE_CORE_MODULE_TYPES_ITER)
118QT_FOR_EACH_STATIC_CORE_CLASS(QT_DECLARE_CORE_MODULE_TYPES_ITER)
119QT_FOR_EACH_STATIC_CORE_POINTER(QT_DECLARE_CORE_MODULE_TYPES_ITER)
120QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_DECLARE_CORE_MODULE_TYPES_ITER)
121QT_FOR_EACH_STATIC_GUI_CLASS(QT_DECLARE_GUI_MODULE_TYPES_ITER)
122QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER)
123
124QT_WARNING_POP
125} // namespace QModulesPrivate
126
127#undef QT_DECLARE_CORE_MODULE_TYPES_ITER
128#undef QT_DECLARE_GUI_MODULE_TYPES_ITER
129#undef QT_DECLARE_WIDGETS_MODULE_TYPES_ITER
130
131class QMetaTypeInterface
132{
133public:
134 QMetaType::SaveOperator saveOp;
135 QMetaType::LoadOperator loadOp;
136 QMetaType::Constructor constructor; // TODO Qt6: remove me
137 QMetaType::Destructor destructor;
138 int size;
139 QMetaType::TypeFlags::Int flags;
140 const QMetaObject *metaObject;
141 QMetaType::TypedConstructor typedConstructor;
142 QMetaType::TypedDestructor typedDestructor;
143};
144
145#ifndef QT_NO_DATASTREAM
146# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
147 /*saveOp*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Save), \
148 /*loadOp*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Load),
149# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
150 /*saveOp*/ nullptr, \
151 /*loadOp*/ nullptr,
152#else
153# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
154 /*saveOp*/ nullptr, \
155 /*loadOp*/ nullptr,
156# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
157 QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type)
158#endif
159
160#ifndef QT_BOOTSTRAPPED
161#define METAOBJECT_DELEGATE(Type) (QtPrivate::MetaObjectForType<Type>::value())
162#else
163#define METAOBJECT_DELEGATE(Type) nullptr
164#endif
165
166#define QT_METATYPE_INTERFACE_INIT_IMPL(Type, DATASTREAM_DELEGATE) \
167{ \
168 DATASTREAM_DELEGATE(Type) \
169 /*constructor*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Construct), \
170 /*destructor*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Destruct), \
171 /*size*/(QTypeInfo<Type>::sizeOf), \
172 /*flags*/QtPrivate::QMetaTypeTypeFlags<Type>::Flags, \
173 /*metaObject*/METAOBJECT_DELEGATE(Type), \
174 /*typedConstructor*/ nullptr, \
175 /*typedDestructor*/ nullptr \
176}
177
178
179/* These QT_METATYPE_INTERFACE_INIT* macros are used to initialize QMetaTypeInterface instance.
180
181 - QT_METATYPE_INTERFACE_INIT(Type) -> It takes Type argument and creates all necessary wrapper functions for the Type,
182 it detects if QT_NO_DATASTREAM was defined. Probably it is the macro that you want to use.
183
184 - QT_METATYPE_INTERFACE_INIT_EMPTY() -> It initializes an empty QMetaTypeInterface instance.
185
186 - QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) -> Temporary workaround for missing auto-detection of data stream
187 operators. It creates same instance as QT_METATYPE_INTERFACE_INIT(Type) but with null stream operators callbacks.
188 */
189#define QT_METATYPE_INTERFACE_INIT(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL)
190#define QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL)
191#define QT_METATYPE_INTERFACE_INIT_EMPTY() \
192{ \
193 QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(void) \
194 /*constructor*/ nullptr, \
195 /*destructor*/ nullptr, \
196 /*size*/ 0, \
197 /*flags*/ 0, \
198 /*metaObject*/ nullptr , \
199 /*typedConstructor*/ nullptr, \
200 /*typedDestructor*/ nullptr \
201}
202
203namespace QtMetaTypePrivate {
204template<typename T>
205struct TypeDefinition {
206 static const bool IsAvailable = true;
207};
208
209// Ignore these types, as incomplete
210#ifdef QT_BOOTSTRAPPED
211template<> struct TypeDefinition<QBitArray> { static const bool IsAvailable = false; };
212template<> struct TypeDefinition<QCborArray> { static const bool IsAvailable = false; };
213template<> struct TypeDefinition<QCborMap> { static const bool IsAvailable = false; };
214template<> struct TypeDefinition<QCborSimpleType> { static const bool IsAvailable = false; };
215template<> struct TypeDefinition<QCborValue> { static const bool IsAvailable = false; };
216#if QT_CONFIG(easingcurve)
217template<> struct TypeDefinition<QEasingCurve> { static const bool IsAvailable = false; };
218#endif
219template<> struct TypeDefinition<QJsonArray> { static const bool IsAvailable = false; };
220template<> struct TypeDefinition<QJsonDocument> { static const bool IsAvailable = false; };
221template<> struct TypeDefinition<QJsonObject> { static const bool IsAvailable = false; };
222template<> struct TypeDefinition<QJsonValue> { static const bool IsAvailable = false; };
223template<> struct TypeDefinition<QUrl> { static const bool IsAvailable = false; };
224template<> struct TypeDefinition<QByteArrayList> { static const bool IsAvailable = false; };
225#endif
226#ifdef QT_NO_GEOM_VARIANT
227template<> struct TypeDefinition<QRect> { static const bool IsAvailable = false; };
228template<> struct TypeDefinition<QRectF> { static const bool IsAvailable = false; };
229template<> struct TypeDefinition<QSize> { static const bool IsAvailable = false; };
230template<> struct TypeDefinition<QSizeF> { static const bool IsAvailable = false; };
231template<> struct TypeDefinition<QLine> { static const bool IsAvailable = false; };
232template<> struct TypeDefinition<QLineF> { static const bool IsAvailable = false; };
233template<> struct TypeDefinition<QPoint> { static const bool IsAvailable = false; };
234template<> struct TypeDefinition<QPointF> { static const bool IsAvailable = false; };
235#endif
236#ifdef QT_NO_REGEXP
237template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = false; };
238#endif
239#if !QT_CONFIG(regularexpression)
240template<> struct TypeDefinition<QRegularExpression> { static const bool IsAvailable = false; };
241#endif
242#ifdef QT_NO_SHORTCUT
243template<> struct TypeDefinition<QKeySequence> { static const bool IsAvailable = false; };
244#endif
245#ifdef QT_NO_CURSOR
246template<> struct TypeDefinition<QCursor> { static const bool IsAvailable = false; };
247#endif
248#ifdef QT_NO_MATRIX4X4
249template<> struct TypeDefinition<QMatrix4x4> { static const bool IsAvailable = false; };
250#endif
251#ifdef QT_NO_VECTOR2D
252template<> struct TypeDefinition<QVector2D> { static const bool IsAvailable = false; };
253#endif
254#ifdef QT_NO_VECTOR3D
255template<> struct TypeDefinition<QVector3D> { static const bool IsAvailable = false; };
256#endif
257#ifdef QT_NO_VECTOR4D
258template<> struct TypeDefinition<QVector4D> { static const bool IsAvailable = false; };
259#endif
260#ifdef QT_NO_QUATERNION
261template<> struct TypeDefinition<QQuaternion> { static const bool IsAvailable = false; };
262#endif
263#ifdef QT_NO_ICON
264template<> struct TypeDefinition<QIcon> { static const bool IsAvailable = false; };
265#endif
266} //namespace QtMetaTypePrivate
267
268QT_END_NAMESPACE
269
270#endif // QMETATYPE_P_H
271

source code of qtbase/src/corelib/kernel/qmetatype_p.h