// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QOVERLOAD_H #define QOVERLOAD_H #include #if 0 #pragma qt_class(QOverload) #endif QT_BEGIN_NAMESPACE #ifdef Q_QDOC // Just for documentation generation template auto qOverload(T functionPointer); template auto qConstOverload(T memberFunctionPointer); template auto qNonConstOverload(T memberFunctionPointer); #else template struct QNonConstOverload { template constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; } }; template struct QConstOverload { template constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr) { return ptr; } }; template struct QOverload : QConstOverload, QNonConstOverload { using QConstOverload::of; using QConstOverload::operator(); using QNonConstOverload::of; using QNonConstOverload::operator(); template constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; } }; template constexpr inline QOverload qOverload = {}; template constexpr inline QConstOverload qConstOverload = {}; template constexpr inline QNonConstOverload qNonConstOverload = {}; #endif // Q_QDOC #define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N #define QT_VA_ARGS_EXPAND(...) __VA_ARGS__ // Needed for MSVC #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)) #define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC #define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) #define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__)) QT_END_NAMESPACE #endif /* QOVERLOAD_H */