diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2019-07-10 19:46:45 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2019-07-12 20:28:22 +0000 |
commit | e89b2f72c7147e46dcf606c3dcc507e2ae2841ce (patch) | |
tree | 609077394463907aa708420b7d019d2c979af85d /src/corelib/global | |
parent | 4c61544aa84f08a28829abe8db28dd23a178c0cb (diff) |
Centralize the MSVC work-around for std::is_permutation
There's currently only one user, but another one is coming up, so apply DRY
and centralize the work-around for the MSVC warning C4996 on use of 3-arg STL
algorithms in one place.
The code is prepared to handle other algorithms with ease, should any more
crop up.
Change-Id: Ia881888d6a2b5286c6d8d823bc2b76788efad624
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/global')
-rw-r--r-- | src/corelib/global/qglobal.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 15f4621cc0..80f59d92d0 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1001,6 +1001,29 @@ QT_WARNING_DISABLE_MSVC(4530) /* C++ exception handler used, but unwind semantic # endif #endif +// Work around MSVC warning about use of 3-arg algorithms +// until we can depend on the C++14 4-arg ones. +// +// These algortithms do NOT check for equal length. +// They need to be treated as if they called the 3-arg version (which they do)! +#ifdef Q_CC_MSVC +# define QT_3ARG_ALG(alg, f1, l1, f2, l2) \ + std::alg(f1, l1, f2, l2) +#else +# define QT_3ARG_ALG(alg, f1, l1, f2, l2) \ + [&f1, &l1, &f2, &l2]() { \ + Q_UNUSED(l2); \ + return std::alg(f1, l1, f2); \ + }() +#endif +template <typename ForwardIterator1, typename ForwardIterator2> +inline bool qt_is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2) +{ + return QT_3ARG_ALG(is_permutation, first1, last1, first2, last2); +} +#undef QT_3ARG_ALG + // this adds const to non-const objects (like std::as_const) template <typename T> Q_DECL_CONSTEXPR typename std::add_const<T>::type &qAsConst(T &t) noexcept { return t; } |