forked from dolphin-emu/dolphin
		
	
		
			
				
	
	
		
			44 lines
		
	
	
		
			801 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			801 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2015 Dolphin Emulator Project
 | |
| // Licensed under GPLv2+
 | |
| // Refer to the license.txt file included.
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <functional>
 | |
| 
 | |
| namespace Common
 | |
| {
 | |
| class ScopeGuard final
 | |
| {
 | |
| public:
 | |
|   template <class Callable>
 | |
|   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 = 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<void()> m_finalizer;
 | |
| };
 | |
| 
 | |
| }  // Namespace Common
 |