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
							 |