5#ifndef Q_SYMBOLSRESOLVEUTILS
6#define Q_SYMBOLSRESOLVEUTILS
8#include <QtCore/qlibrary.h>
9#include <QtMultimedia/qtmultimediaexports.h>
29 return std::string_view(lhs) == std::string_view(rhs);
35 for (
int i = 0; lhs[i]; ++i) {
36 if (lhs[i] <
'0' || lhs[i] >
'9')
40 lhsInt += lhs[i] -
'0';
43 return lhsInt == rhsInt;
50 template <
typename... Arg>
58 template <
typename... Arg>
65template <
typename R,
typename... A>
75 using LibraryLoader = std::unique_ptr<QLibrary> (*)();
76 static bool isLazyLoadEnabled();
77 bool isLoaded()
const {
return m_library !=
nullptr; }
81 SymbolsResolver(
const char *libLoggingName, LibraryLoader loader);
83 SymbolsResolver(
const char *libName,
const char *version =
"",
84 const char *libLoggingName =
nullptr);
86 QFunctionPointer initOptionalFunction(
const char *name);
87 QFunctionPointer initFunction(
const char *name);
89 struct SymbolsMarker {};
90 void checkLibrariesLoaded(SymbolsMarker *begin, SymbolsMarker *end);
93 const char *m_libLoggingName;
94 std::unique_ptr<QLibrary> m_library;
102#define CHECK_VERSIONS(Name, NeededSoversion, DetectedVersion)
103 static_assert(areVersionsEqual(NeededSoversion, DetectedVersion),
104 "Configuartion error: misleading " Name " versions!")
106#define BEGIN_INIT_FUNCS(...)
109 class SymbolsResolverImpl : public SymbolsResolver {
111 SymbolsResolverImpl() : SymbolsResolver(__VA_ARGS__)
112 { checkLibrariesLoaded(&symbolsBegin, &symbolsEnd); }
113 static const SymbolsResolverImpl& instance()
114 { static const SymbolsResolverImpl instance; return instance; }
115 SymbolsMarker symbolsBegin;
117#define INIT_FUNC(F) QFunctionPointer F = initFunction(#F);
118#define INIT_OPT_FUNC(F) QFunctionPointer F = initOptionalFunction(#F);
120#define END_INIT_FUNCS()
121 SymbolsMarker symbolsEnd;
123 [[maybe_unused]] static const auto *instantResolver =
124 SymbolsResolver::isLazyLoadEnabled() ? &SymbolsResolverImpl::instance() : nullptr;
128#ifdef Q_EXPORT_STUB_SYMBOLS
129#define EXPORT_FUNC Q_MULTIMEDIA_EXPORT
134#define DEFINE_FUNC_IMPL(F, Vars, TypesWithVars, ReturnFunc)
135 using F##_ReturnType = FuncInfo<decltype(F)>::Return;
136 extern "C" EXPORT_FUNC [[maybe_unused]] F##_ReturnType F(TypesWithVars(F)) {
137 using F##_Type = F##_ReturnType (*)(TypesWithVars(F));
138 const auto f = SymbolsResolverImpl::instance().F;
139 return f ? (reinterpret_cast<F##_Type>(f))(Vars()) : ReturnFunc();
157#define TYPE_WITH_VAR(F, I) std::tuple_element_t<I, FuncInfo<decltype(F)>::Args> VAR(I)
158#define TYPES_WITH_VARS0(F)
172#define RET(F, ...) DefaultReturn<FuncInfo<decltype(F)>::Return>{__VA_ARGS__}
174#define DEFINE_FUNC(F, ArgsCount, ...)
177#define DEFINE_IS_LOADED_CHECKER(FuncName) QT_BEGIN_NAMESPACE
179 FuncName() { return SymbolsResolverImpl::instance().isLoaded(); } QT_END_NAMESPACE
182#define DECLARE_IS_LOADED_CHECKER(FuncName) QT_BEGIN_NAMESPACE
184 FuncName(); QT_END_NAMESPACE
Combined button and popup list for selecting options.
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
#define TYPES_WITH_VARS1(F)
#define TYPES_WITH_VARS9(F)
QT_BEGIN_NAMESPACE constexpr bool areVersionsEqual(const char lhs[], const char rhs[])
#define TYPES_WITH_VARS3(F)
#define TYPES_WITH_VARS10(F)
#define TYPES_WITH_VARS4(F)
#define TYPES_WITH_VARS6(F)
#define TYPE_WITH_VAR(F, I)
#define DEFINE_FUNC_IMPL(F, Vars, TypesWithVars, ReturnFunc)
#define TYPES_WITH_VARS7(F)
#define TYPES_WITH_VARS2(F)
#define TYPES_WITH_VARS8(F)
#define TYPES_WITH_VARS5(F)
constexpr bool areVersionsEqual(const char lhs[], int rhsInt)
void operator()(Arg &&...)