Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qsymbolsresolveutils_p.h
Go to the documentation of this file.
1
// Copyright (C) 2024 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:critical reason:execute-external-code
4
5
#
ifndef
Q_SYMBOLSRESOLVEUTILS
6
#
define
Q_SYMBOLSRESOLVEUTILS
7
8
#
include
<
QtCore
/
qlibrary
.
h
>
9
#
include
<
QtMultimedia
/
qtmultimediaexports
.
h
>
10
#
include
<
tuple
>
11
#
include
<
memory
>
12
#
include
<
string_view
>
13
14
//
15
// W A R N I N G
16
// -------------
17
//
18
// This file is not part of the Qt API. It exists purely as an
19
// implementation detail. This header file may change from version to
20
// version without notice, or even be removed.
21
//
22
// We mean it.
23
//
24
25
QT_BEGIN_NAMESPACE
26
27
constexpr
bool
areVersionsEqual
(
const
char
lhs[],
const
char
rhs[])
28
{
29
return
std::string_view(lhs) == std::string_view(rhs);
30
}
31
32
constexpr
bool
areVersionsEqual
(
const
char
lhs[],
int
rhsInt)
33
{
34
int
lhsInt = 0;
35
for
(
int
i = 0; lhs[i]; ++i) {
36
if
(lhs[i] <
'0'
|| lhs[i] >
'9'
)
37
return
false
;
38
39
lhsInt *= 10;
40
lhsInt += lhs[i] -
'0'
;
41
}
42
43
return
lhsInt == rhsInt;
44
}
45
46
47
template
<
typename
T>
48
struct
DefaultReturn
49
{
50
template
<
typename
... Arg>
51
T
operator
()(Arg &&...) {
return
val
; }
52
T
val
;
53
};
54
55
template
<>
56
struct
DefaultReturn
<
void
>
57
{
58
template
<
typename
... Arg>
59
void
operator
()(Arg &&...) { }
60
};
61
62
template
<
typename
...>
63
struct
FuncInfo
;
64
65
template
<
typename
R,
typename
... A>
66
struct
FuncInfo
<R(A...)>
67
{
68
using
Return
= R;
69
using
Args
=
std
::tuple<A...>;
70
};
71
72
class
Q_MULTIMEDIA_EXPORT
SymbolsResolver
73
{
74
public
:
75
using
LibraryLoader = std::unique_ptr<QLibrary> (*)();
76
static
bool
isLazyLoadEnabled();
77
bool
isLoaded()
const
{
return
m_library !=
nullptr
; }
78
79
~SymbolsResolver();
80
protected
:
81
SymbolsResolver(
const
char
*libLoggingName, LibraryLoader loader);
82
83
SymbolsResolver(
const
char
*libName,
const
char
*version =
""
,
84
const
char
*libLoggingName =
nullptr
);
85
86
QFunctionPointer initOptionalFunction(
const
char
*name);
87
QFunctionPointer initFunction(
const
char
*name);
88
89
struct
SymbolsMarker {};
90
void
checkLibrariesLoaded(SymbolsMarker *begin, SymbolsMarker *end);
91
92
private
:
93
const
char
*m_libLoggingName;
94
std::unique_ptr<QLibrary> m_library;
95
};
96
97
98
QT_END_NAMESPACE
99
100
// clang-format off
101
102
#
define
CHECK_VERSIONS
(
Name
,
NeededSoversion
,
DetectedVersion
)
103
static_assert
(
areVersionsEqual
(
NeededSoversion
,
DetectedVersion
)
,
104
"Configuartion error: misleading "
Name
" versions!"
)
105
106
#
define
BEGIN_INIT_FUNCS
(
...
)
107
namespace
{
108
class
SymbolsResolverImpl
:
public
SymbolsResolver
{
109
public
:
110
SymbolsResolverImpl
(
)
:
SymbolsResolver
(
__VA_ARGS__
)
111
{
checkLibrariesLoaded
(
&
symbolsBegin
,
&
symbolsEnd
)
;
}
112
static
const
SymbolsResolverImpl
&
instance
(
)
113
{
static
const
SymbolsResolverImpl
instance
;
return
instance
;
}
114
SymbolsMarker
symbolsBegin
;
115
116
#
define
INIT_FUNC
(
F
)
QFunctionPointer
F
=
initFunction
(
#
F
)
;
117
#
define
INIT_OPT_FUNC
(
F
)
QFunctionPointer
F
=
initOptionalFunction
(
#
F
)
;
118
119
#
define
END_INIT_FUNCS
(
)
120
SymbolsMarker
symbolsEnd
;
121
}
;
122
[
[
maybe_unused
]
]
static
const
auto
*
instantResolver
=
123
SymbolsResolver
::
isLazyLoadEnabled
(
)
?
&
SymbolsResolverImpl
::
instance
(
)
:
nullptr
;
124
}
125
126
127
#
ifdef
Q_EXPORT_STUB_SYMBOLS
128
#
define
EXPORT_FUNC
Q_MULTIMEDIA_EXPORT
129
#
else
130
#
define
EXPORT_FUNC
131
#
endif
132
133
#
define
DEFINE_FUNC_IMPL
(
F
,
Vars
,
TypesWithVars
,
ReturnFunc
)
134
using
F
##
_ReturnType
=
FuncInfo
<
decltype
(
F
)
>
::
Return
;
135
extern
"C"
EXPORT_FUNC
[
[
maybe_unused
]
]
F
##
_ReturnType
F
(
TypesWithVars
(
F
)
)
{
136
using
F
##
_Type
=
F
##
_ReturnType
(
*
)
(
TypesWithVars
(
F
)
)
;
137
const
auto
f
=
SymbolsResolverImpl
::
instance
(
)
.
F
;
138
return
f
?
(
reinterpret_cast
<
F
##
_Type
>
(
f
)
)
(
Vars
(
)
)
:
ReturnFunc
(
)
;
139
}
140
141
142
#
define
VAR
(
I
)
a
##
I
143
#
define
VARS0
(
)
144
#
define
VARS1
(
)
VAR
(
0
)
145
#
define
VARS2
(
)
VARS1
(
)
,
VAR
(
1
)
146
#
define
VARS3
(
)
VARS2
(
)
,
VAR
(
2
)
147
#
define
VARS4
(
)
VARS3
(
)
,
VAR
(
3
)
148
#
define
VARS5
(
)
VARS4
(
)
,
VAR
(
4
)
149
#
define
VARS6
(
)
VARS5
(
)
,
VAR
(
5
)
150
#
define
VARS7
(
)
VARS6
(
)
,
VAR
(
6
)
151
#
define
VARS8
(
)
VARS7
(
)
,
VAR
(
7
)
152
#
define
VARS9
(
)
VARS8
(
)
,
VAR
(
8
)
153
#
define
VARS10
(
)
VARS9
(
)
,
VAR
(
9
)
154
#
define
VARS11
(
)
VARS10
(
)
,
VAR
(
10
)
155
156
#
define
TYPE_WITH_VAR
(
F
,
I
)
std
::
tuple_element_t
<
I
,
FuncInfo
<
decltype
(
F
)
>
::
Args
>
VAR
(
I
)
157
#
define
TYPES_WITH_VARS0
(
F
)
158
#
define
TYPES_WITH_VARS1
(
F
)
TYPE_WITH_VAR
(
F
,
0
)
159
#
define
TYPES_WITH_VARS2
(
F
)
TYPES_WITH_VARS1
(
F
)
,
TYPE_WITH_VAR
(
F
,
1
)
160
#
define
TYPES_WITH_VARS3
(
F
)
TYPES_WITH_VARS2
(
F
)
,
TYPE_WITH_VAR
(
F
,
2
)
161
#
define
TYPES_WITH_VARS4
(
F
)
TYPES_WITH_VARS3
(
F
)
,
TYPE_WITH_VAR
(
F
,
3
)
162
#
define
TYPES_WITH_VARS5
(
F
)
TYPES_WITH_VARS4
(
F
)
,
TYPE_WITH_VAR
(
F
,
4
)
163
#
define
TYPES_WITH_VARS6
(
F
)
TYPES_WITH_VARS5
(
F
)
,
TYPE_WITH_VAR
(
F
,
5
)
164
#
define
TYPES_WITH_VARS7
(
F
)
TYPES_WITH_VARS6
(
F
)
,
TYPE_WITH_VAR
(
F
,
6
)
165
#
define
TYPES_WITH_VARS8
(
F
)
TYPES_WITH_VARS7
(
F
)
,
TYPE_WITH_VAR
(
F
,
7
)
166
#
define
TYPES_WITH_VARS9
(
F
)
TYPES_WITH_VARS8
(
F
)
,
TYPE_WITH_VAR
(
F
,
8
)
167
#
define
TYPES_WITH_VARS10
(
F
)
TYPES_WITH_VARS9
(
F
)
,
TYPE_WITH_VAR
(
F
,
9
)
168
#
define
TYPES_WITH_VARS11
(
F
)
TYPES_WITH_VARS10
(
F
)
,
TYPE_WITH_VAR
(
F
,
10
)
169
170
171
#
define
RET
(
F
,
...
)
DefaultReturn
<
FuncInfo
<
decltype
(
F
)
>
::
Return
>
{
__VA_ARGS__
}
172
173
#
define
DEFINE_FUNC
(
F
,
ArgsCount
,
/*Return value*/
...
)
174
DEFINE_FUNC_IMPL
(
F
,
VARS
##
ArgsCount
,
TYPES_WITH_VARS
##
ArgsCount
,
RET
(
F
,
__VA_ARGS__
)
)
;
175
176
#
define
DEFINE_IS_LOADED_CHECKER
(
FuncName
)
QT_BEGIN_NAMESPACE
177
bool
178
FuncName
(
)
{
return
SymbolsResolverImpl
::
instance
(
)
.
isLoaded
(
)
;
}
QT_END_NAMESPACE
179
180
181
#
define
DECLARE_IS_LOADED_CHECKER
(
FuncName
)
QT_BEGIN_NAMESPACE
182
bool
183
FuncName
(
)
;
QT_END_NAMESPACE
184
185
186
// clang-format on
187
188
#
endif
// Q_SYMBOLSRESOLVEUTILS
SymbolsResolver
Definition
qsymbolsresolveutils_p.h:73
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qCWarning
#define qCWarning(category,...)
Definition
qloggingcategory.h:164
qCDebug
#define qCDebug(category,...)
Definition
qloggingcategory.h:162
Q_STATIC_LOGGING_CATEGORY
#define Q_STATIC_LOGGING_CATEGORY(name,...)
Definition
qloggingcategory.h:154
VARS8
#define VARS8()
Definition
qsymbolsresolveutils_p.h:151
RET
#define RET(F,...)
Definition
qsymbolsresolveutils_p.h:171
TYPES_WITH_VARS1
#define TYPES_WITH_VARS1(F)
Definition
qsymbolsresolveutils_p.h:158
TYPES_WITH_VARS9
#define TYPES_WITH_VARS9(F)
Definition
qsymbolsresolveutils_p.h:166
VARS5
#define VARS5()
Definition
qsymbolsresolveutils_p.h:148
areVersionsEqual
QT_BEGIN_NAMESPACE constexpr bool areVersionsEqual(const char lhs[], const char rhs[])
Definition
qsymbolsresolveutils_p.h:27
VARS2
#define VARS2()
Definition
qsymbolsresolveutils_p.h:145
VARS7
#define VARS7()
Definition
qsymbolsresolveutils_p.h:150
TYPES_WITH_VARS3
#define TYPES_WITH_VARS3(F)
Definition
qsymbolsresolveutils_p.h:160
TYPES_WITH_VARS10
#define TYPES_WITH_VARS10(F)
Definition
qsymbolsresolveutils_p.h:167
VARS4
#define VARS4()
Definition
qsymbolsresolveutils_p.h:147
EXPORT_FUNC
#define EXPORT_FUNC
Definition
qsymbolsresolveutils_p.h:130
TYPES_WITH_VARS4
#define TYPES_WITH_VARS4(F)
Definition
qsymbolsresolveutils_p.h:161
TYPES_WITH_VARS6
#define TYPES_WITH_VARS6(F)
Definition
qsymbolsresolveutils_p.h:163
VARS6
#define VARS6()
Definition
qsymbolsresolveutils_p.h:149
VARS1
#define VARS1()
Definition
qsymbolsresolveutils_p.h:144
TYPE_WITH_VAR
#define TYPE_WITH_VAR(F, I)
Definition
qsymbolsresolveutils_p.h:156
VARS9
#define VARS9()
Definition
qsymbolsresolveutils_p.h:152
DEFINE_FUNC_IMPL
#define DEFINE_FUNC_IMPL(F, Vars, TypesWithVars, ReturnFunc)
Definition
qsymbolsresolveutils_p.h:133
VARS3
#define VARS3()
Definition
qsymbolsresolveutils_p.h:146
VARS10
#define VARS10()
Definition
qsymbolsresolveutils_p.h:153
TYPES_WITH_VARS7
#define TYPES_WITH_VARS7(F)
Definition
qsymbolsresolveutils_p.h:164
TYPES_WITH_VARS2
#define TYPES_WITH_VARS2(F)
Definition
qsymbolsresolveutils_p.h:159
TYPES_WITH_VARS8
#define TYPES_WITH_VARS8(F)
Definition
qsymbolsresolveutils_p.h:165
TYPES_WITH_VARS5
#define TYPES_WITH_VARS5(F)
Definition
qsymbolsresolveutils_p.h:162
areVersionsEqual
constexpr bool areVersionsEqual(const char lhs[], int rhsInt)
Definition
qsymbolsresolveutils_p.h:32
VAR
#define VAR(I)
Definition
qsymbolsresolveutils_p.h:142
DefaultReturn< void >
Definition
qsymbolsresolveutils_p.h:57
DefaultReturn< void >::operator()
void operator()(Arg &&...)
Definition
qsymbolsresolveutils_p.h:59
DefaultReturn
Definition
qsymbolsresolveutils_p.h:49
DefaultReturn::val
T val
Definition
qsymbolsresolveutils_p.h:52
DefaultReturn::operator()
T operator()(Arg &&...)
Definition
qsymbolsresolveutils_p.h:51
FuncInfo< R(A...)>
Definition
qsymbolsresolveutils_p.h:67
FuncInfo< R(A...)>::Args
std::tuple< A... > Args
Definition
qsymbolsresolveutils_p.h:69
FuncInfo< R(A...)>::Return
R Return
Definition
qsymbolsresolveutils_p.h:68
FuncInfo
Definition
qsymbolsresolveutils_p.h:63
qtmultimedia
src
multimedia
qsymbolsresolveutils_p.h
Generated on
for Qt by
1.18.0