forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			51 lines
		
	
	
		
			778 B
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			778 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
 |