// Copyright 2015 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #pragma once #include namespace Common { class ScopeGuard final { public: template ScopeGuard(Callable&& finalizer) : m_finalizer(std::forward(finalizer)) { } ScopeGuard(ScopeGuard&& other) : m_finalizer(std::move(other.m_finalizer)) { other.m_finalizer = nullptr; } ~ScopeGuard() { Exit(); } void Dismiss() { m_finalizer = nullptr; } void Exit() { if (m_finalizer) { m_finalizer(); // must not throw m_finalizer = nullptr; } } ScopeGuard(const ScopeGuard&) = delete; void operator=(const ScopeGuard&) = delete; private: std::function m_finalizer; }; } // Namespace Common