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
qnativeinterface.h
Go to the documentation of this file.
1// Copyright (C) 2021 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 QNATIVEINTERFACE_H
6#define QNATIVEINTERFACE_H
7
8#include <QtCore/qglobal.h>
9
11
12// We declare a virtual non-inline function in the form
13// of the destructor, making it the key function. This
14// ensures that the typeinfo of the class is exported.
15// By being protected, we also ensure that pointers to
16// the interface can't be deleted.
17#define QT_DECLARE_NATIVE_INTERFACE_3(NativeInterface, Revision, BaseType)
18 protected:
19 virtual ~NativeInterface();
20
21 struct TypeInfo {
22 using baseType = BaseType;
23 static constexpr char const *name = QT_STRINGIFY(NativeInterface);
24 static constexpr int revision = Revision;
25 };
26
27 template <typename, typename>
28 friend struct QNativeInterface::Private::has_type_info;
29
30 template <typename>
31 friend bool constexpr QNativeInterface::Private::hasTypeInfo();
32
33 template <typename>
34 friend struct QNativeInterface::Private::TypeInfo;
35 public:
36 NativeInterface() = default;
37 Q_DISABLE_COPY_MOVE(NativeInterface)
38
39// Revisioned interfaces only make sense when exposed through a base
40// type via QT_DECLARE_NATIVE_INTERFACE_ACCESSOR, as the revision
41// checks happen at that level (and not for normal dynamic_casts).
42#define QT_DECLARE_NATIVE_INTERFACE_2(NativeInterface, Revision)
43 static_assert(false, "Must provide a base type when specifying revision");
44
45#define QT_DECLARE_NATIVE_INTERFACE_1(NativeInterface)
46 QT_DECLARE_NATIVE_INTERFACE_3(NativeInterface, 0, void)
47
48#define QT_DECLARE_NATIVE_INTERFACE(...)
49 QT_OVERLOADED_MACRO(QT_DECLARE_NATIVE_INTERFACE, __VA_ARGS__)
50
51namespace QNativeInterface::Private {
52
53 // Basic type-trait to verify that a given native interface has
54 // all the required type information for us to evaluate it.
55 template <typename NativeInterface, typename = void>
57
58 // The type-trait is friended by TypeInfo, so that we can
59 // evaluate TypeInfo in the template arguments.
60 template <typename NativeInterface>
67
68 // We need to wrap the instantiation of has_type_info in a
69 // function friended by TypeInfo, otherwise MSVC will not
70 // let us evaluate TypeInfo in the template arguments.
71 template <typename NativeInterface>
72 bool constexpr hasTypeInfo()
73 {
74 return has_type_info<NativeInterface>::value;
75 }
76
77 template <typename NativeInterface>
78 struct TypeInfo
79 {
80 // To ensure SFINAE works for hasTypeInfo we can't use it in a constexpr
81 // variable that also includes an expression that relies on the type
82 // info. This helper variable is okey, as it it self contained.
83 static constexpr bool haveTypeInfo = hasTypeInfo<NativeInterface>();
84
85 // We can then use the helper variable in a constexpr condition in a
86 // function, which does not break SFINAE if haveTypeInfo is false.
87 template <typename BaseType>
88 static constexpr bool isCompatibleHelper()
89 {
90 if constexpr (haveTypeInfo)
91 return std::is_base_of<typename NativeInterface::TypeInfo::baseType, BaseType>::value;
92 else
93 return false;
94 }
95
96 // MSVC however doesn't like constexpr functions in enable_if_t conditions,
97 // so we need to wrap it yet again in a constexpr variable. This is fine,
98 // as all the SFINAE magic has been resolved at this point.
99 template <typename BaseType>
100 static constexpr bool isCompatibleWith = isCompatibleHelper<BaseType>();
101
102 // The revision and name accessors are not used in enable_if_t conditions,
103 // so we can leave them as constexpr functions. As this class template is
104 // friended by TypeInfo we can access the protected members of TypeInfo.
105 static constexpr int revision()
106 {
107 if constexpr (haveTypeInfo)
108 return NativeInterface::TypeInfo::revision;
109 else
110 return 0;
111 }
112
113 static constexpr char const *name()
114 {
115 if constexpr (haveTypeInfo)
116 return NativeInterface::TypeInfo::name;
117 else
118 return nullptr;
119 }
120 };
121
122 // Wrapper type to make the error message in case
123 // of incompatible interface types read better.
124 template <typename I>
125 struct NativeInterface : TypeInfo<I> {};
126} // QNativeInterface::Private
127
128// Declares an accessor for the native interface
129#ifdef Q_QDOC
130#define QT_DECLARE_NATIVE_INTERFACE_ACCESSOR(T)
131 template <typename QNativeInterface>
132 QNativeInterface *nativeInterface() const;
133#else
134#define QT_DECLARE_NATIVE_INTERFACE_ACCESSOR(T)
135 template <typename NativeInterface, typename TypeInfo = QNativeInterface::Private::NativeInterface<NativeInterface>,
136 typename BaseType = T, std::enable_if_t<TypeInfo::template isCompatibleWith<T>, bool> = true>
137 NativeInterface *nativeInterface() const
138 {
139 return static_cast<NativeInterface*>(resolveInterface(
140 TypeInfo::name(), TypeInfo::revision()));
141 }
142 protected:
143 void *resolveInterface(const char *name, int revision) const;
144 public:
145#endif
146
147QT_END_NAMESPACE
148
149#endif // QNATIVEINTERFACE_H
\inmodule QtCore\reentrant
Definition qdatastream.h:50
\inmodule QtCore\reentrant
Definition qdatetime.h:319
\inmodule QtCore \reentrant
Definition qdatetime.h:30
\inmodule QtCore
Definition qdir.h:22
constexpr bool operator==(iterator o) const
Definition qlist.h:260
constexpr bool operator<(iterator other) const
Definition qlist.h:262
constexpr bool operator<(const_iterator other) const
Definition qlist.h:256
const_iterator operator-(qsizetype j) const
Definition qlist.h:294
constexpr bool operator==(pointer p) const
Definition qlist.h:267
const T & reference
Definition qlist.h:236
constexpr bool operator>(const_iterator other) const
Definition qlist.h:258
std::random_access_iterator_tag iterator_category
Definition qlist.h:234
const T & operator[](qsizetype j) const
Definition qlist.h:245
const_iterator & operator-=(qsizetype j)
Definition qlist.h:292
constexpr const_iterator(iterator o)
Definition qlist.h:242
constexpr const_iterator()=default
const T & operator*() const
Definition qlist.h:243
constexpr bool operator!=(const_iterator o) const
Definition qlist.h:255
const_iterator operator+(qsizetype j) const
Definition qlist.h:293
const T * pointer
Definition qlist.h:235
constexpr bool operator<=(iterator other) const
Definition qlist.h:263
const value_type element_type
Definition qlist.h:233
const_iterator & operator++()
Definition qlist.h:269
constexpr bool operator!=(pointer p) const
Definition qlist.h:268
constexpr bool operator>(iterator other) const
Definition qlist.h:264
qsizetype operator-(const_iterator j) const
Definition qlist.h:273
constexpr bool operator==(const_iterator o) const
Definition qlist.h:254
constexpr bool operator>=(iterator other) const
Definition qlist.h:265
const_iterator operator--(int)
Definition qlist.h:272
const_iterator & operator--()
Definition qlist.h:271
const_iterator operator++(int)
Definition qlist.h:270
constexpr bool operator!=(iterator o) const
Definition qlist.h:261
const_iterator & operator+=(qsizetype j)
Definition qlist.h:291
friend const_iterator operator+(qsizetype j, const_iterator k)
Definition qlist.h:295
constexpr bool operator<=(const_iterator other) const
Definition qlist.h:257
const T * operator->() const
Definition qlist.h:244
constexpr bool operator>=(const_iterator other) const
Definition qlist.h:259
constexpr bool operator>(iterator other) const
Definition qlist.h:178
iterator operator+(qsizetype j) const
Definition qlist.h:213
iterator & operator-=(qsizetype j)
Definition qlist.h:212
T & operator[](qsizetype j) const
Definition qlist.h:169
iterator & operator++()
Definition qlist.h:189
constexpr bool operator<(const_iterator other) const
Definition qlist.h:182
constexpr bool operator!=(pointer p) const
Definition qlist.h:188
constexpr bool operator<=(iterator other) const
Definition qlist.h:177
constexpr bool operator!=(iterator o) const
Definition qlist.h:175
constexpr bool operator<=(const_iterator other) const
Definition qlist.h:183
T & operator*() const
Definition qlist.h:167
iterator operator++(int)
Definition qlist.h:190
constexpr bool operator>(const_iterator other) const
Definition qlist.h:184
constexpr bool operator>=(iterator other) const
Definition qlist.h:179
constexpr bool operator<(iterator other) const
Definition qlist.h:176
friend iterator operator+(qsizetype j, iterator k)
Definition qlist.h:215
std::random_access_iterator_tag iterator_category
Definition qlist.h:159
constexpr bool operator!=(const_iterator o) const
Definition qlist.h:181
constexpr bool operator==(const_iterator o) const
Definition qlist.h:180
constexpr bool operator>=(const_iterator other) const
Definition qlist.h:185
qsizetype operator-(iterator j) const
Definition qlist.h:193
iterator & operator--()
Definition qlist.h:191
constexpr iterator()=default
T * operator->() const
Definition qlist.h:168
iterator operator-(qsizetype j) const
Definition qlist.h:214
value_type element_type
Definition qlist.h:158
constexpr bool operator==(iterator o) const
Definition qlist.h:174
iterator & operator+=(qsizetype j)
Definition qlist.h:211
constexpr bool operator==(pointer p) const
Definition qlist.h:187
iterator operator--(int)
Definition qlist.h:192
Definition qlist.h:82
void append(const_iterator i1, const_iterator i2)
Definition qlist.h:928
void pop_back() noexcept
Definition qlist.h:773
iterator insert(const_iterator before, parameter_type t)
Definition qlist.h:564
void removeFirst() noexcept
Definition qlist.h:905
QList< T > & fill(parameter_type t, qsizetype size=-1)
Definition qlist.h:1001
const_pointer constData() const noexcept
Definition qlist.h:506
void push_front(rvalue_ref t)
Definition qlist.h:771
T & first()
Definition qlist.h:739
T & last()
Definition qlist.h:742
QList(const String &str)
Definition qlist.h:365
const_iterator begin() const noexcept
Definition qlist.h:722
bool isDetached() const noexcept
Definition qlist.h:500
void removeAt(qsizetype i)
Definition qlist.h:678
reference back()
Definition qlist.h:783
QList< T > last(qsizetype n) const
Definition qlist.h:751
bool isSharedWith(const QList< T > &other) const
Definition qlist.h:502
QList< T > & operator+=(const QList< T > &l)
Definition qlist.h:792
QList< T > operator+(const QList< T > &l) &&
Definition qlist.h:796
reference emplaceFront(Args &&... args)
Definition qlist.h:950
reference emplace_back(Args &&... args)
Definition qlist.h:777
const T & constLast() const noexcept
Definition qlist.h:744
iterator erase(const_iterator begin, const_iterator end)
Definition qlist.h:987
iterator Iterator
Definition qlist.h:298
void resizeForOverwrite(qsizetype size)
Definition qlist.h:488
QList< T > sliced(qsizetype pos, qsizetype n) const
Definition qlist.h:755
QList(std::initializer_list< T > args)
Definition qlist.h:343
constexpr qsizetype max_size() const noexcept
Definition qlist.h:786
QTypeTraits::compare_eq_result_container< QList, U > operator==(const QList &other) const
Definition qlist.h:404
iterator insert(qsizetype i, parameter_type t)
Definition qlist.h:561
bool empty() const noexcept
Definition qlist.h:779
bool removeOne(const AT &t)
Definition qlist.h:686
QList< T > toList() const noexcept
Definition qlist.h:817
QList(InputIterator i1, InputIterator i2)
Definition qlist.h:358
static QList< T > fromReadOnlyData(const T(&t)[N]) noexcept
Definition qlist.h:823
static QList< T > fromList(const QList< T > &list) noexcept
Definition qlist.h:816
QList(qsizetype size, parameter_type t)
Definition qlist.h:334
const_reference back() const noexcept
Definition qlist.h:784
qsizetype capacity() const
Definition qlist.h:495
void swapItemsAt(qsizetype i, qsizetype j)
Definition qlist.h:761
void push_back(parameter_type t)
Definition qlist.h:769
void shrink_to_fit()
Definition qlist.h:785
QList< T > operator+(const QList< T > &l) const &
Definition qlist.h:794
void detach()
Definition qlist.h:499
const_iterator end() const noexcept
Definition qlist.h:723
iterator erase(const_iterator pos)
Definition qlist.h:736
bool endsWith(parameter_type t) const
Definition qlist.h:746
qsizetype count(const AT &t) const noexcept
Definition qlist.h:673
bool startsWith(parameter_type t) const
Definition qlist.h:745
const T * const_pointer
Definition qlist.h:125
friend qsizetype QtPrivate::lastIndexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
iterator end()
Definition qlist.h:720
QList< T > operator+(QList< T > &&l) &&
Definition qlist.h:800
T takeAt(qsizetype i)
Definition qlist.h:697
std::reverse_iterator< iterator > reverse_iterator
Definition qlist.h:300
const_reference at(qsizetype i) const noexcept
Definition qlist.h:519
value_type takeFirst()
Definition qlist.h:644
constexpr qsizetype size() const noexcept
Definition qlist.h:465
QList< T > sliced(qsizetype pos) const
Definition qlist.h:753
QList< T > toVector() const noexcept
Definition qlist.h:820
T value(qsizetype i) const
Definition qlist.h:758
void swap(QList &other) noexcept
Definition qlist.h:379
iterator insert(const_iterator before, qsizetype n, parameter_type t)
Definition qlist.h:569
QList< T > & operator=(std::initializer_list< T > args)
Definition qlist.h:352
void move(qsizetype from, qsizetype to)
Definition qlist.h:704
QList(DataPointer dd) noexcept
Definition qlist.h:319
const_reverse_iterator crbegin() const noexcept
Definition qlist.h:732
T * pointer
Definition qlist.h:124
reference operator[](qsizetype i)
Definition qlist.h:524
const_iterator constBegin() const noexcept
Definition qlist.h:726
const_reference operator[](qsizetype i) const noexcept
Definition qlist.h:530
const_reverse_iterator rbegin() const noexcept
Definition qlist.h:730
constexpr QList() noexcept=default
void remove(qsizetype i, qsizetype n=1)
Definition qlist.h:892
value_type takeLast()
Definition qlist.h:650
const DataPointer & data_ptr() const &
Definition qlist.h:139
qsizetype removeIf(Predicate pred)
Definition qlist.h:692
reference front()
Definition qlist.h:781
DataPointer & data_ptr() &
Definition qlist.h:138
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition qlist.h:301
qsizetype removeAll(const AT &t)
Definition qlist.h:680
iterator emplace(qsizetype i, Args &&... args)
Definition qlist.h:971
const T & first() const noexcept
Definition qlist.h:740
iterator insert(qsizetype i, qsizetype n, parameter_type t)
Definition qlist.h:959
void append(QList< T > &&l)
Definition qlist.h:934
T & reference
Definition qlist.h:126
void squeeze()
Definition qlist.h:871
reference emplaceBack(Args &&... args)
Definition qlist.h:980
QList< T > mid(qsizetype pos, qsizetype len=-1) const
Definition qlist.h:1073
reverse_iterator rend()
Definition qlist.h:729
QTypeTraits::compare_lt_result_container< QList, U > operator>(const QList &other) const noexcept(noexcept(other< std::declval< QList< U > >()))
Definition qlist.h:434
T value_type
Definition qlist.h:123
void prepend(rvalue_ref t)
Definition qlist.h:546
QList< T > operator+(QList< T > &&l) const &
Definition qlist.h:798
QList & assign(std::initializer_list< T > l)
Definition qlist.h:599
iterator begin()
Definition qlist.h:719
void resize(qsizetype size, parameter_type c)
Definition qlist.h:482
QList< T > first(qsizetype n) const
Definition qlist.h:749
const T & constFirst() const noexcept
Definition qlist.h:741
static constexpr qsizetype maxSize()
Definition qlist.h:464
iterator emplace(const_iterator before, Args &&... args)
Definition qlist.h:608
void reserve(qsizetype size)
Definition qlist.h:847
QList & assign(InputIterator first, InputIterator last)
Definition qlist.h:596
static QList< T > fromVector(const QList< T > &vector) noexcept
Definition qlist.h:819
void replace(qsizetype i, parameter_type t)
Definition qlist.h:621
reverse_iterator rbegin()
Definition qlist.h:728
void pop_front() noexcept
Definition qlist.h:774
constexpr bool isEmpty() const noexcept
Definition qlist.h:474
pointer data()
Definition qlist.h:504
const T & const_reference
Definition qlist.h:127
const T & last() const noexcept
Definition qlist.h:743
constexpr qsizetype count() const noexcept
Definition qlist.h:471
void removeLast() noexcept
Definition qlist.h:913
void resize(qsizetype size)
Definition qlist.h:476
friend auto compareThreeWay(const QList &lhs, const QList &rhs)
Definition qlist.h:385
T Type
Definition qlist.h:122
const_iterator cend() const noexcept
Definition qlist.h:725
void append(parameter_type t)
Definition qlist.h:531
QList< T > & operator+=(parameter_type t)
Definition qlist.h:802
QTypeTraits::compare_eq_result_container< QList, U > operator!=(const QList &other) const
Definition qlist.h:416
const_iterator constEnd() const noexcept
Definition qlist.h:727
const_reverse_iterator rend() const noexcept
Definition qlist.h:731
T value(qsizetype i, parameter_type defaultValue) const
Definition qlist.h:922
const_iterator cbegin() const noexcept
Definition qlist.h:724
QList & assign(qsizetype n, parameter_type t)
Definition qlist.h:589
QTypeTraits::compare_lt_result_container< QList, U > operator>=(const QList &other) const noexcept(noexcept(std::declval< QList< U > >()< other))
Definition qlist.h:448
const_pointer data() const noexcept
Definition qlist.h:505
constexpr qsizetype length() const noexcept
Definition qlist.h:472
void clear()
Definition qlist.h:507
const_reference front() const noexcept
Definition qlist.h:782
QList< T > & operator+=(QList< T > &&l)
Definition qlist.h:793
friend qsizetype QtPrivate::indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
DataPointer && data_ptr() &&
Definition qlist.h:140
void append(const QList< T > &l)
Definition qlist.h:541
const_iterator ConstIterator
Definition qlist.h:299
const_reverse_iterator crend() const noexcept
Definition qlist.h:733
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:177
\inmodule QtCore \reentrant
Definition qdatetime.h:251
Combined button and popup list for selecting options.
QString && asString(QString &&s)
Definition qstring.h:1714
constexpr QAnyStringArg qStringLikeToArg(QAnyStringView s) noexcept
Definition qstring.h:1776
qsizetype indexOf(const QList< T > &vector, const U &u, qsizetype from) noexcept
Definition qlist.h:1025
const QString & asString(const QString &s)
Definition qstring.h:1713
qsizetype lastIndexOf(const QList< T > &vector, const U &u, qsizetype from) noexcept
Definition qlist.h:1040
qsizetype lastIndexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
constexpr qsizetype lengthHelperPointer(const Char *data) noexcept
qsizetype indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
std::is_same< Char, char32_t > IsCompatibleChar32TypeHelper
Definition qstring.h:57
constexpr bool isLatin1(QLatin1StringView s) noexcept
Definition qstring.h:77
Definition qcompare.h:111
QByteArrayView qToByteArrayViewIgnoringNull(const QByteArrayLike &b) noexcept
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
#define __has_builtin(x)
Q_DECLARE_TYPEINFO(QDateTime::Data, Q_RELOCATABLE_TYPE)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2620
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
\inmodule QtCore \title Global Qt Declarations
Definition qglobal.cpp:100
qsizetype erase(QList< T > &list, const AT &t)
Definition qlist.h:1105
QList(InputIterator, InputIterator) -> QList< ValueType >
qsizetype erase_if(QList< T > &list, Predicate pred)
Definition qlist.h:1111
#define QT_DECLARE_NATIVE_INTERFACE(...)
#define QT_DECLARE_NATIVE_INTERFACE_3(NativeInterface, Revision, BaseType)
QString operator+(const QString &s1, QChar s2)
Definition qstring.h:1577
QString operator+(QString &&lhs, const QString &rhs)
Definition qstring.h:1575
qsizetype erase_if(QString &s, Predicate pred)
Definition qstring.h:1814
#define QT_UNICODE_LITERAL(str)
Definition qstring.h:1848
QString operator+(QString &&lhs, QChar rhs)
Definition qstring.h:1579
QString operator+(QChar s1, const QString &s2)
Definition qstring.h:1581
QString operator+(const QString &s1, const QString &s2)
Definition qstring.h:1573
qsizetype erase(QString &s, const T &t)
Definition qstring.h:1808
QList< QList< qInternalCallback > > callbacks
Definition qglobal.cpp:129
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
Definition qlist.h:1060
const Self * self() const
Definition qlist.h:41
bool contains(const AT &t) const noexcept
Definition qlist.h:50
QListSpecialMethodsBase()=default
qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const noexcept
Definition qlist.h:1067
QListSpecialMethods()=default
static constexpr char const * name()
static constexpr bool isCompatibleHelper()
constexpr QAnyStringArg(QAnyStringView v) noexcept
Definition qstring.h:1760
QAnyStringView string
Definition qstring.h:1758
QLatin1StringView string
Definition qstring.h:1752
constexpr QLatin1StringArg(QLatin1StringView v) noexcept
Definition qstring.h:1754
constexpr QStringViewArg(QStringView v) noexcept
Definition qstring.h:1748