mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-01-18 22:35: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
|
||||
progress_callback.cpp
|
||||
progress_callback.h
|
||||
scope_guard.h
|
||||
state_wrapper.cpp
|
||||
state_wrapper.h
|
||||
string.cpp
|
||||
|
|
|
@ -70,6 +70,7 @@
|
|||
<ClInclude Include="progress_callback.h" />
|
||||
<ClInclude Include="rectangle.h" />
|
||||
<ClInclude Include="cd_subchannel_replacement.h" />
|
||||
<ClInclude Include="scope_guard.h" />
|
||||
<ClInclude Include="state_wrapper.h" />
|
||||
<ClInclude Include="string.h" />
|
||||
<ClInclude Include="string_util.h" />
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
<ClInclude Include="window_info.h" />
|
||||
<ClInclude Include="cd_image_hasher.h" />
|
||||
<ClInclude Include="dimensional_array.h" />
|
||||
<ClInclude Include="scope_guard.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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