Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 09:20:36

0001 // Copyright (C) 2022 The Qt Company Ltd.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
0003 // Qt-Security score:significant reason:default
0004 
0005 #ifndef QOVERLOAD_H
0006 #define QOVERLOAD_H
0007 
0008 #include <QtCore/qtconfigmacros.h>
0009 
0010 #if 0
0011 #pragma qt_class(QOverload)
0012 #endif
0013 
0014 QT_BEGIN_NAMESPACE
0015 
0016 #ifdef Q_QDOC
0017 // Just for documentation generation
0018 template<typename T>
0019 auto qOverload(T functionPointer);
0020 template<typename T>
0021 auto qConstOverload(T memberFunctionPointer);
0022 template<typename T>
0023 auto qNonConstOverload(T memberFunctionPointer);
0024 #else
0025 template <typename... Args>
0026 struct QNonConstOverload
0027 {
0028     template <typename R, typename T>
0029     constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr)
0030     { return ptr; }
0031 
0032     template <typename R, typename T>
0033     static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr)
0034     { return ptr; }
0035 };
0036 
0037 template <typename... Args>
0038 struct QConstOverload
0039 {
0040     template <typename R, typename T>
0041     constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
0042     { return ptr; }
0043 
0044     template <typename R, typename T>
0045     static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr)
0046     { return ptr; }
0047 };
0048 
0049 template <typename... Args>
0050 struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
0051 {
0052     using QConstOverload<Args...>::of;
0053     using QConstOverload<Args...>::operator();
0054     using QNonConstOverload<Args...>::of;
0055     using QNonConstOverload<Args...>::operator();
0056 
0057     template <typename R>
0058     constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
0059     { return ptr; }
0060 
0061     template <typename R>
0062     static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
0063     { return ptr; }
0064 };
0065 
0066 template <typename... Args> constexpr inline QOverload<Args...> qOverload = {};
0067 template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {};
0068 template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {};
0069 
0070 #endif // Q_QDOC
0071 
0072 #define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
0073 #define QT_VA_ARGS_EXPAND(...) __VA_ARGS__ // Needed for MSVC
0074 #define QT_VA_ARGS_COUNT(...) QT_VA_ARGS_EXPAND(QT_VA_ARGS_CHOOSE(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
0075 #define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC
0076 #define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
0077 #define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__))
0078 
0079 QT_END_NAMESPACE
0080 
0081 #endif /* QOVERLOAD_H */