From de8b4f17a1a0db19ff0f31be622521112e65a6a4 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 16 Oct 2021 09:57:50 +1000 Subject: [PATCH] Common: Add ScopedGuard --- common/CMakeLists.txt | 1 + common/ScopedGuard.h | 58 +++++++++++++++++++++++++++++++++++ common/common.vcxproj | 3 +- common/common.vcxproj.filters | 5 ++- 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 common/ScopedGuard.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 202af8f01b..174f03eab5 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -76,6 +76,7 @@ target_sources(common PRIVATE RwMutex.h SafeArray.h ScopedAlloc.h + ScopedGuard.h ScopedPtrMT.h SettingsInterface.h SettingsWrapper.h diff --git a/common/ScopedGuard.h b/common/ScopedGuard.h new file mode 100644 index 0000000000..1ad9abd216 --- /dev/null +++ b/common/ScopedGuard.h @@ -0,0 +1,58 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "Pcsx2Defs.h" +#include +#include + +/// ScopedGuard provides an object which runs a function (usually a lambda) when +/// it goes out of scope. This can be useful for releasing resources or handles +/// which do not normally have C++ types to automatically release. +template +class ScopedGuard final +{ +public: + __fi ScopedGuard(T&& func) + : m_func(std::forward(func)) + { + } + __fi ScopedGuard(ScopedGuard&& other) + : m_func(std::move(other.m_func)) + { + other.m_func = nullptr; + } + + __fi ~ScopedGuard() + { + if (!m_func.has_value()) + return; + + m_func.value()(); + m_func.reset(); + } + + ScopedGuard(const ScopedGuard&) = delete; + void operator=(const ScopedGuard&) = delete; + + /// Prevents the function from being invoked when we go out of scope. + __fi void Cancel() + { + m_func.reset(); + } + +private: + std::optional m_func; +}; diff --git a/common/common.vcxproj b/common/common.vcxproj index a9eb69c152..1279726b75 100644 --- a/common/common.vcxproj +++ b/common/common.vcxproj @@ -98,6 +98,7 @@ + @@ -160,4 +161,4 @@ - + \ No newline at end of file diff --git a/common/common.vcxproj.filters b/common/common.vcxproj.filters index 81fc51b00a..c35d5215d9 100644 --- a/common/common.vcxproj.filters +++ b/common/common.vcxproj.filters @@ -270,6 +270,9 @@ Header Files + + Header Files + @@ -289,4 +292,4 @@ Source Files - + \ No newline at end of file