summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qcore_mac_p.h
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2019-08-03 09:06:50 +0300
committerMarc Mutz <marc.mutz@kdab.com>2019-08-09 07:36:26 +0000
commit3ed21726ecad6fad0d3fff40b96aa44aa8f85229 (patch)
tree6e313ac41eeae3f82fccf9a9db3a822b45a16494 /src/corelib/kernel/qcore_mac_p.h
parent9c891bead8c14af0aa2fd10f74275e35af87b16c (diff)
Give some TLC to QAppleRefCounted
- add conditional noexcept to move special member functions - use qExchange() in the move ctor implementation (turns a copy into a move) - separate the default ctor from the ctor that acquires a resource, then - overload the latter for rvalue payloads Change-Id: I6816143a94fe6a74cf0d02569b83a752a8da3089 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qcore_mac_p.h')
-rw-r--r--src/corelib/kernel/qcore_mac_p.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h
index 447dcd9cbe..3266dc10a8 100644
--- a/src/corelib/kernel/qcore_mac_p.h
+++ b/src/corelib/kernel/qcore_mac_p.h
@@ -86,8 +86,14 @@ template <typename T, typename U, U (*RetainFunction)(U), void (*ReleaseFunction
class QAppleRefCounted
{
public:
- QAppleRefCounted(const T &t = T()) : value(t) {}
- QAppleRefCounted(QAppleRefCounted &&other) : value(other.value) { other.value = T(); }
+ QAppleRefCounted() : value() {}
+ QAppleRefCounted(const T &t) : value(t) {}
+ QAppleRefCounted(T &&t) noexcept(std::is_nothrow_move_constructible<T>::value)
+ : value(std::move(t)) {}
+ QAppleRefCounted(QAppleRefCounted &&other)
+ noexcept(std::is_nothrow_move_assignable<T>::value &&
+ std::is_nothrow_move_constructible<T>::value)
+ : value(qExchange(other.value, T())) {}
QAppleRefCounted(const QAppleRefCounted &other) : value(other.value) { if (value) RetainFunction(value); }
~QAppleRefCounted() { if (value) ReleaseFunction(value); }
operator T() const { return value; }
@@ -96,6 +102,8 @@ public:
QAppleRefCounted &operator=(const QAppleRefCounted &other)
{ QAppleRefCounted copy(other); swap(copy); return *this; }
QAppleRefCounted &operator=(QAppleRefCounted &&other)
+ noexcept(std::is_nothrow_move_assignable<T>::value &&
+ std::is_nothrow_move_constructible<T>::value)
{ QAppleRefCounted moved(std::move(other)); swap(moved); return *this; }
T *operator&() { return &value; }
protected: