Common: Add scope_guard.h from Dolphin

This commit is contained in:
Connor McLaughlin 2020-06-16 22:46:14 +10:00
parent 47138aa9cf
commit 0890164987
4 changed files with 44 additions and 0 deletions

View file

@ -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

View file

@ -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" />

View file

@ -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
View 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