diff options
Diffstat (limited to 'src/corelib/tools/qscopeguard.h')
-rw-r--r-- | src/corelib/tools/qscopeguard.h | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/corelib/tools/qscopeguard.h b/src/corelib/tools/qscopeguard.h index 40d2747b1d..6a5bc6cc61 100644 --- a/src/corelib/tools/qscopeguard.h +++ b/src/corelib/tools/qscopeguard.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com> +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -42,13 +43,11 @@ #include <QtCore/qglobal.h> +#include <type_traits> +#include <utility> QT_BEGIN_NAMESPACE - -template <typename F> class QScopeGuard; -template <typename F> QScopeGuard<F> qScopeGuard(F f); - template <typename F> class #if __has_cpp_attribute(nodiscard) @@ -59,13 +58,23 @@ Q_REQUIRED_RESULT QScopeGuard { public: + explicit QScopeGuard(F &&f) noexcept + : m_func(std::move(f)) + { + } + + explicit QScopeGuard(const F &f) noexcept + : m_func(f) + { + } + QScopeGuard(QScopeGuard &&other) noexcept : m_func(std::move(other.m_func)) , m_invoke(qExchange(other.m_invoke, false)) { } - ~QScopeGuard() + ~QScopeGuard() noexcept { if (m_invoke) m_func(); @@ -77,26 +86,23 @@ public: } private: - explicit QScopeGuard(F &&f) noexcept - : m_func(std::move(f)) - { - } - Q_DISABLE_COPY(QScopeGuard) F m_func; bool m_invoke = true; - friend QScopeGuard qScopeGuard<F>(F); }; +#ifdef __cpp_deduction_guides +template <typename F> QScopeGuard(F(&)()) -> QScopeGuard<F(*)()>; +#endif template <typename F> #if __has_cpp_attribute(nodiscard) Q_REQUIRED_RESULT #endif -QScopeGuard<F> qScopeGuard(F f) +QScopeGuard<typename std::decay<F>::type> qScopeGuard(F &&f) { - return QScopeGuard<F>(std::move(f)); + return QScopeGuard<typename std::decay<F>::type>(std::forward<F>(f)); } QT_END_NAMESPACE |