From 3ed21726ecad6fad0d3fff40b96aa44aa8f85229 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 3 Aug 2019 09:06:50 +0300 Subject: 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 --- src/corelib/kernel/qcore_mac_p.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/corelib/kernel/qcore_mac_p.h') 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 ::value) + : value(std::move(t)) {} + QAppleRefCounted(QAppleRefCounted &&other) + noexcept(std::is_nothrow_move_assignable::value && + std::is_nothrow_move_constructible::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::value && + std::is_nothrow_move_constructible::value) { QAppleRefCounted moved(std::move(other)); swap(moved); return *this; } T *operator&() { return &value; } protected: -- cgit v1.2.3