mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-01-19 06:45:39 +00:00
Common: Add scope_guard.h from Dolphin
This commit is contained in:
parent
47138aa9cf
commit
0890164987
|
@ -53,6 +53,7 @@ add_library(common
|
||||||
rectangle.h
|
rectangle.h
|
||||||
progress_callback.cpp
|
progress_callback.cpp
|
||||||
progress_callback.h
|
progress_callback.h
|
||||||
|
scope_guard.h
|
||||||
state_wrapper.cpp
|
state_wrapper.cpp
|
||||||
state_wrapper.h
|
state_wrapper.h
|
||||||
string.cpp
|
string.cpp
|
||||||
|
|
|
@ -70,6 +70,7 @@
|
||||||
<ClInclude Include="progress_callback.h" />
|
<ClInclude Include="progress_callback.h" />
|
||||||
<ClInclude Include="rectangle.h" />
|
<ClInclude Include="rectangle.h" />
|
||||||
<ClInclude Include="cd_subchannel_replacement.h" />
|
<ClInclude Include="cd_subchannel_replacement.h" />
|
||||||
|
<ClInclude Include="scope_guard.h" />
|
||||||
<ClInclude Include="state_wrapper.h" />
|
<ClInclude Include="state_wrapper.h" />
|
||||||
<ClInclude Include="string.h" />
|
<ClInclude Include="string.h" />
|
||||||
<ClInclude Include="string_util.h" />
|
<ClInclude Include="string_util.h" />
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
<ClInclude Include="window_info.h" />
|
<ClInclude Include="window_info.h" />
|
||||||
<ClInclude Include="cd_image_hasher.h" />
|
<ClInclude Include="cd_image_hasher.h" />
|
||||||
<ClInclude Include="dimensional_array.h" />
|
<ClInclude Include="dimensional_array.h" />
|
||||||
|
<ClInclude Include="scope_guard.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="jit_code_buffer.cpp" />
|
<ClCompile Include="jit_code_buffer.cpp" />
|
||||||
|
|
41
src/common/scope_guard.h
Normal file
41
src/common/scope_guard.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2015 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2+
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
namespace Common
|
||||||
|
{
|
||||||
|
template <typename Callable>
|
||||||
|
class ScopeGuard final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopeGuard(Callable&& finalizer) : m_finalizer(std::forward<Callable>(finalizer)) {}
|
||||||
|
|
||||||
|
ScopeGuard(ScopeGuard&& other) : m_finalizer(std::move(other.m_finalizer))
|
||||||
|
{
|
||||||
|
other.m_finalizer = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ScopeGuard() { Exit(); }
|
||||||
|
void Dismiss() { m_finalizer.reset(); }
|
||||||
|
void Exit()
|
||||||
|
{
|
||||||
|
if (m_finalizer)
|
||||||
|
{
|
||||||
|
(*m_finalizer)(); // must not throw
|
||||||
|
m_finalizer.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScopeGuard(const ScopeGuard&) = delete;
|
||||||
|
|
||||||
|
void operator=(const ScopeGuard&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::optional<Callable> m_finalizer;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Namespace Common
|
Loading…
Reference in a new issue