1234567891011121314151617181920212223242526272829303132333435363738394041 |
- // Copyright 2015 Dolphin Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #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
|