diff options
| author | Sona Kurazyan <sona.kurazyan@qt.io> | 2022-07-28 11:41:28 +0200 |
|---|---|---|
| committer | Sona Kurazyan <sona.kurazyan@qt.io> | 2022-07-29 23:04:21 +0200 |
| commit | ff8de321e22b1e91f7fc04ffe54609b045f23835 (patch) | |
| tree | 7c03a50bfb0f5e10221784efa413fe650b0b099f /src | |
| parent | 19454b05c2857d8d332ff9e70dcd1d07875dce68 (diff) | |
Extract header qoverload.h from qglobal.h
Task-number: QTBUG-99313
Change-Id: Id827f95b5aa5d4e0d57dcc1060a0746bcaa34db3
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/corelib/global/qglobal.cpp | 51 | ||||
| -rw-r--r-- | src/corelib/global/qglobal.h | 64 | ||||
| -rw-r--r-- | src/corelib/global/qoverload.h | 75 | ||||
| -rw-r--r-- | src/corelib/global/qoverload.qdoc | 53 |
5 files changed, 130 insertions, 114 deletions
diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 9aa0d0b2eec..2fcc5b5b982 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -62,6 +62,7 @@ qt_internal_add_module(Core global/qnativeinterface.h global/qnativeinterface_p.h global/qnumeric.cpp global/qnumeric.h global/qnumeric_p.h global/qoperatingsystemversion.cpp global/qoperatingsystemversion.h global/qoperatingsystemversion_p.h + global/qoverload.h global/qprocessordetection.h global/qrandom.cpp global/qrandom.h global/qrandom_p.h global/qsysinfo.h diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 3c9d9475779..796749c1463 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -1217,57 +1217,6 @@ static_assert(sizeof(qint64) == 8, "Internal error, qint64 is misdefined"); \sa qMin(), qMax() */ -/*! \fn template <typename T> auto qOverload(T functionPointer) - \relates <QtGlobal> - \since 5.7 - - Returns a pointer to an overloaded function. The template - parameter is the list of the argument types of the function. - \a functionPointer is the pointer to the (member) function: - - \snippet code/src_corelib_global_qglobal.cpp 52 - - If a member function is also const-overloaded \l qConstOverload and - \l qNonConstOverload need to be used. - - qOverload() requires C++14 enabled. In C++11-only code, the helper - classes QOverload, QConstOverload, and QNonConstOverload can be used directly: - - \snippet code/src_corelib_global_qglobal.cpp 53 - - \note Qt detects the necessary C++14 compiler support by way of the feature - test recommendations from - \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations} - {C++ Committee's Standing Document 6}. - - \sa qConstOverload(), qNonConstOverload(), {Differences between String-Based - and Functor-Based Connections} -*/ - -/*! \fn template <typename T> auto qConstOverload(T memberFunctionPointer) - \relates <QtGlobal> - \since 5.7 - - Returns the \a memberFunctionPointer pointer to a constant member function: - - \snippet code/src_corelib_global_qglobal.cpp 54 - - \sa qOverload, qNonConstOverload, {Differences between String-Based - and Functor-Based Connections} -*/ - -/*! \fn template <typename T> auto qNonConstOverload(T memberFunctionPointer) - \relates <QtGlobal> - \since 5.7 - - Returns the \a memberFunctionPointer pointer to a non-constant member function: - - \snippet code/src_corelib_global_qglobal.cpp 54 - - \sa qOverload, qNonConstOverload, {Differences between String-Based - and Functor-Based Connections} -*/ - /*! \macro QT_VERSION_CHECK(major, minor, patch) \relates <QtGlobal> diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 21762c39e25..f6a60135185 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1213,62 +1213,6 @@ template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) noexcept -> decltype #define Q_D(Class) Class##Private * const d = d_func() #define Q_Q(Class) Class * const q = q_func() -#ifdef Q_QDOC -// Just for documentation generation -template<typename T> -auto qOverload(T functionPointer); -template<typename T> -auto qConstOverload(T memberFunctionPointer); -template<typename T> -auto qNonConstOverload(T memberFunctionPointer); -#else -template <typename... Args> -struct QNonConstOverload -{ - template <typename R, typename T> - constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr) - { return ptr; } - - template <typename R, typename T> - static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr) - { return ptr; } -}; - -template <typename... Args> -struct QConstOverload -{ - template <typename R, typename T> - constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr) - { return ptr; } - - template <typename R, typename T> - static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr) - { return ptr; } -}; - -template <typename... Args> -struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...> -{ - using QConstOverload<Args...>::of; - using QConstOverload<Args...>::operator(); - using QNonConstOverload<Args...>::of; - using QNonConstOverload<Args...>::operator(); - - template <typename R> - constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) - { return ptr; } - - template <typename R> - static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) - { return ptr; } -}; - -template <typename... Args> constexpr inline QOverload<Args...> qOverload = {}; -template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {}; -template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {}; -#endif - - class QByteArray; Q_CORE_EXPORT QByteArray qgetenv(const char *varName); // need it as two functions because QString is only forward-declared here @@ -1290,13 +1234,6 @@ Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nu "Compile your code with -fPIC (and not with -fPIE)." #endif -#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__)) - // This macro can be used to calculate member offsets for types with a non standard layout. // It uses the fact that offsetof() is allowed to support those types since C++17 as an optional // feature. All our compilers do support this, but some issue a warning, so we wrap the offsetof() @@ -1322,6 +1259,7 @@ QT_END_NAMESPACE #include <QtCore/qforeach.h> #include <QtCore/qglobalstatic.h> #include <QtCore/qnumeric.h> +#include <QtCore/qoverload.h> #include <QtCore/qtranslation.h> #include <QtCore/qversiontagging.h> diff --git a/src/corelib/global/qoverload.h b/src/corelib/global/qoverload.h new file mode 100644 index 00000000000..f28b502c4f3 --- /dev/null +++ b/src/corelib/global/qoverload.h @@ -0,0 +1,75 @@ +// 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 + +#if 0 +#pragma qt_class(QOverload) +#pragma qt_sync_stop_processing +#endif + +#ifdef Q_QDOC +// Just for documentation generation +template<typename T> +auto qOverload(T functionPointer); +template<typename T> +auto qConstOverload(T memberFunctionPointer); +template<typename T> +auto qNonConstOverload(T memberFunctionPointer); +#else +template <typename... Args> +struct QNonConstOverload +{ + template <typename R, typename T> + constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr) + { return ptr; } + + template <typename R, typename T> + static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr) + { return ptr; } +}; + +template <typename... Args> +struct QConstOverload +{ + template <typename R, typename T> + constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr) + { return ptr; } + + template <typename R, typename T> + static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr) + { return ptr; } +}; + +template <typename... Args> +struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...> +{ + using QConstOverload<Args...>::of; + using QConstOverload<Args...>::operator(); + using QNonConstOverload<Args...>::of; + using QNonConstOverload<Args...>::operator(); + + template <typename R> + constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) + { return ptr; } + + template <typename R> + static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) + { return ptr; } +}; + +template <typename... Args> constexpr inline QOverload<Args...> qOverload = {}; +template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {}; +template <typename... Args> constexpr inline QNonConstOverload<Args...> 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__)) + +#endif /* QOVERLOAD_H */ diff --git a/src/corelib/global/qoverload.qdoc b/src/corelib/global/qoverload.qdoc new file mode 100644 index 00000000000..3e1744ea070 --- /dev/null +++ b/src/corelib/global/qoverload.qdoc @@ -0,0 +1,53 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! \fn template <typename T> auto qOverload(T functionPointer) + \relates <QOverload> + \since 5.7 + + Returns a pointer to an overloaded function. The template + parameter is the list of the argument types of the function. + \a functionPointer is the pointer to the (member) function: + + \snippet code/src_corelib_global_qglobal.cpp 52 + + If a member function is also const-overloaded \l qConstOverload and + \l qNonConstOverload need to be used. + + qOverload() requires C++14 enabled. In C++11-only code, the helper + classes QOverload, QConstOverload, and QNonConstOverload can be used directly: + + \snippet code/src_corelib_global_qglobal.cpp 53 + + \note Qt detects the necessary C++14 compiler support by way of the feature + test recommendations from + \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations} + {C++ Committee's Standing Document 6}. + + \sa qConstOverload(), qNonConstOverload(), {Differences between String-Based + and Functor-Based Connections} +*/ + +/*! \fn template <typename T> auto qConstOverload(T memberFunctionPointer) + \relates <QOverload> + \since 5.7 + + Returns the \a memberFunctionPointer pointer to a constant member function: + + \snippet code/src_corelib_global_qglobal.cpp 54 + + \sa qOverload, qNonConstOverload, {Differences between String-Based + and Functor-Based Connections} +*/ + +/*! \fn template <typename T> auto qNonConstOverload(T memberFunctionPointer) + \relates <QOverload> + \since 5.7 + + Returns the \a memberFunctionPointer pointer to a non-constant member function: + + \snippet code/src_corelib_global_qglobal.cpp 54 + + \sa qOverload, qNonConstOverload, {Differences between String-Based + and Functor-Based Connections} +*/ |
