diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2019-05-13 20:43:27 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2019-05-14 17:21:40 +0000 |
commit | a73385e2cfd0455f09166cdb380876ba8b26fb5f (patch) | |
tree | 02d837ce2b268089d7f8676b98a9db27ed6dcb58 /src | |
parent | 969e60e075b2560f499b7a98b502401a23c8c319 (diff) |
Short live qExchange()!
This is a 1:1 replacement for std::exchange, and should be removed once
Qt fully depends on C++14. It's too versatile a tool to miss it, so
provide a copy.
[ChangeLog][QtCore][QtGlobal] Added qExchange(), a drop-in for C++14's std::exchange()
Change-Id: I31c4f1141e7a99f99ea65eb36ddf9d68b7847337
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qglobal.cpp | 11 | ||||
-rw-r--r-- | src/corelib/global/qglobal.h | 9 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 88a61562cb..3436a19881 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -3806,6 +3806,17 @@ bool qunsetenv(const char *varName) */ /*! + \fn template <typename T, typename U = T> T qExchange(T &obj, U &&newValue) + \relates <QtGlobal> + \since 5.14 + + Replaces the value of \a obj with \a newValue and returns the old value of \a obj. + + This is Qt's implementation of std::exchange(). It differs from std::exchange() + only in that it is \c constexpr already in C++14, and available on all supported + compilers. +*/ +/*! \macro QT_TR_NOOP(sourceText) \relates <QtGlobal> diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 0a0c434a07..24d250d923 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1008,6 +1008,15 @@ Q_DECL_CONSTEXPR typename std::add_const<T>::type &qAsConst(T &t) noexcept { ret template <typename T> void qAsConst(const T &&) = delete; +// like std::exchange +template <typename T, typename U = T> +Q_DECL_RELAXED_CONSTEXPR T qExchange(T &t, U &&newValue) +{ + T old = std::move(t); + t = std::forward<U>(newValue); + return old; +} + #ifndef QT_NO_FOREACH namespace QtPrivate { |