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
qtypeinfo.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2016 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5#ifndef QTYPEINFO_H
6#define QTYPEINFO_H
7
8#include <QtCore/qcompilerdetection.h>
9#include <QtCore/qcontainerfwd.h>
10
11#include <type_traits>
12
14
15class QDebug;
16
17/*
18 QTypeInfo - type trait functionality
19*/
20
21namespace QtPrivate {
22
23// A trivially copyable class must also have a trivial, non-deleted
24// destructor [class.prop/1.3], CWG1734. Some implementations don't
25// check for a trivial destructor, because of backwards compatibility
26// with C++98's definition of trivial copyability.
27// Since trivial copiability has implications for the ABI, implementations
28// can't "just fix" their traits. So, although formally redundant, we
29// explicitly check for trivial destruction here.
30template <typename T>
32
33// Denotes types that are trivially default constructible, and for which
34// value-initialization can be achieved by filling their storage with 0 bits.
35// There is no type trait we can use for this, so we hardcode a list of
36// possibilities that we know are OK on the architectures that we support.
37// The most notable exception are pointers to data members, which for instance
38// on the Itanium ABI are initialized to -1.
39template <typename T>
40inline constexpr bool qIsValueInitializationBitwiseZero =
42
43}
44
45/*
46 The catch-all template.
47*/
48
49template <typename T>
51{
52public:
53 enum {
54 isPointer [[deprecated("Use std::is_pointer instead")]] = std::is_pointer_v<T>,
55 isIntegral [[deprecated("Use std::is_integral instead")]] = std::is_integral_v<T>,
56 isComplex = !std::is_trivial_v<T>,
57 isRelocatable = QtPrivate::qIsRelocatable<T>,
58 isValueInitializationBitwiseZero = QtPrivate::qIsValueInitializationBitwiseZero<T>,
59 };
60};
61
62template<>
63class QTypeInfo<void>
64{
65public:
66 enum {
67 isPointer [[deprecated("Use std::is_pointer instead")]] = false,
68 isIntegral [[deprecated("Use std::is_integral instead")]] = false,
69 isComplex = false,
72 };
73};
74
75/*!
76 \class QTypeInfoMerger
77 \inmodule QtCore
78 \internal
79
80 \brief QTypeInfoMerger merges the QTypeInfo flags of T1, T2... and presents them
81 as a QTypeInfo<T> would do.
82
83 Let's assume that we have a simple set of structs:
84
85 \snippet code/src_corelib_global_qglobal.cpp 50
86
87 To create a proper QTypeInfo specialization for A struct, we have to check
88 all sub-components; B, C and D, then take the lowest common denominator and call
89 Q_DECLARE_TYPEINFO with the resulting flags. An easier and less fragile approach is to
90 use QTypeInfoMerger, which does that automatically. So struct A would have
91 the following QTypeInfo definition:
92
93 \snippet code/src_corelib_global_qglobal.cpp 51
94*/
95template <class T, class...Ts>
97{
98 static_assert(sizeof...(Ts) > 0);
99public:
100 static constexpr bool isComplex = ((QTypeInfo<Ts>::isComplex) || ...);
101 static constexpr bool isRelocatable = ((QTypeInfo<Ts>::isRelocatable) && ...);
102 [[deprecated("Use std::is_pointer instead")]] static constexpr bool isPointer = false;
103 [[deprecated("Use std::is_integral instead")]] static constexpr bool isIntegral = false;
104 static constexpr bool isValueInitializationBitwiseZero = false;
105 static_assert(!isRelocatable ||
106 std::is_copy_constructible_v<T> ||
107 std::is_move_constructible_v<T>,
108 "All Ts... are Q_RELOCATABLE_TYPE, but T is neither copy- nor move-constructible, "
109 "so cannot be Q_RELOCATABLE_TYPE. Please mark T as Q_COMPLEX_TYPE manually.");
110};
111
112// QTypeInfo for std::pair:
113// std::pair is spec'ed to be struct { T1 first; T2 second; }, so, unlike tuple<>,
114// we _can_ specialize QTypeInfo for pair<>:
115template <class T1, class T2>
116class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
117
118#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) template
119 <typename ...T> class
120 QTypeInfo<CONTAINER<T...>> \
121{public
122 :
123 enum {
124 isPointer [[deprecated("Use std::is_pointer instead")]] = false,
125 isIntegral [[deprecated("Use std::is_integral instead")]] = false,
126 isComplex = true,
127 isRelocatable = true,
128 isValueInitializationBitwiseZero = false,
129 }; \
130}
131
141
142#undef Q_DECLARE_MOVABLE_CONTAINER
143
144/*
145 Specialize a specific type with:
146
147 Q_DECLARE_TYPEINFO(type, flags);
148
149 where 'type' is the name of the type to specialize and 'flags' is
150 logically-OR'ed combination of the flags below.
151*/
152enum { /* TYPEINFO flags */
158};
159
160#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) class
161 QTypeInfo<TYPE > \
162{public
163 :
164 enum {
165 isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0) && !std::is_trivial_v<TYPE>,
166 isRelocatable = !isComplex || ((FLAGS) & Q_RELOCATABLE_TYPE) || QtPrivate::qIsRelocatable<TYPE>,
167 isPointer [[deprecated("Use std::is_pointer instead")]] = std::is_pointer_v< TYPE >,
168 isIntegral [[deprecated("Use std::is_integral instead")]] = std::is_integral< TYPE >::value,
169 isValueInitializationBitwiseZero = QtPrivate::qIsValueInitializationBitwiseZero<TYPE>,
170 };
171 static_assert(!QTypeInfo<TYPE>::isRelocatable ||
172 std::is_copy_constructible_v<TYPE > ||
173 std::is_move_constructible_v<TYPE >,
174 #TYPE " is neither copy- nor move-constructible, so cannot be Q_RELOCATABLE_TYPE"); \
175}
176
177#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) template
178 <> Q_DECLARE_TYPEINFO_BODY
179 (TYPE, FLAGS)
180
181/* Specialize QTypeInfo for QFlags<T> */
182template<typename T> class QFlags;
183template<typename T>
185
186QT_END_NAMESPACE
187#endif // QTYPEINFO_H
constexpr Q_IMPLICIT QFlags(Enum flags) noexcept
Definition qflags.h:117
Definition qlist.h:80
\inmodule QtCore
Definition qtypeinfo.h:97
static constexpr bool isValueInitializationBitwiseZero
Definition qtypeinfo.h:104
static constexpr bool isIntegral
Definition qtypeinfo.h:103
static constexpr bool isPointer
Definition qtypeinfo.h:102
static constexpr bool isComplex
Definition qtypeinfo.h:100
static constexpr bool isRelocatable
Definition qtypeinfo.h:101
@ isValueInitializationBitwiseZero
Definition qtypeinfo.h:71
@ isValueInitializationBitwiseZero
Definition qtypeinfo.h:58
@ isRelocatable
Definition qtypeinfo.h:57
static void writeMetadataGenerators(QTextStream &stream)
Definition ctf.cpp:93
static void writeEpilogue(QTextStream &stream, const QString &fileName)
Definition ctf.cpp:49
static void writeWrapper(QTextStream &stream, const Tracepoint &tracepoint, const Provider &provider)
Definition ctf.cpp:56
static void writePrologue(QTextStream &stream, const QString &fileName, const Provider &provider)
Definition ctf.cpp:16
void writeCtf(QFile &device, const Provider &p)
Definition ctf.cpp:292
QT_FORWARD_DECLARE_CLASS(QTextStream)
Combined button and popup list for selecting options.
constexpr bool qIsRelocatable
Definition qtypeinfo.h:31
constexpr bool qIsValueInitializationBitwiseZero
Definition qtypeinfo.h:40
Provider parseProvider(const QString &filename)
Definition provider.cpp:292
#define qPrintable(string)
Definition qstring.h:1666
#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER)
Definition qtypeinfo.h:118
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:177
#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
Definition qtypeinfo.h:160
@ Q_PRIMITIVE_TYPE
Definition qtypeinfo.h:154
@ Q_DUMMY_TYPE
Definition qtypeinfo.h:157
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:155
@ Q_COMPLEX_TYPE
Definition qtypeinfo.h:153
@ Q_MOVABLE_TYPE
Definition qtypeinfo.h:156
QStringList prefixText
Definition provider.h:85
QList< TraceEnum > enumerations
Definition provider.h:86
QList< TraceFlags > flags
Definition provider.h:87
QString name
Definition provider.h:83
QList< Tracepoint > tracepoints
Definition provider.h:84
int valueSize
Definition provider.h:63
QString name
Definition provider.h:56
QList< EnumValue > values
Definition provider.h:62
QString name
Definition provider.h:67
QList< FlagValue > values
Definition provider.h:72