| 
									
										
										
										
											2015-09-26 17:59:27 +03:00
										 |  |  | // 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: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   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; | 
					
						
							| 
									
										
										
										
											2015-09-26 17:59:27 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::function<void()> m_finalizer; | 
					
						
							| 
									
										
										
										
											2015-09-26 17:59:27 +03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // Namespace Common
 |