mirror of
				https://github.com/dolphin-emu/dolphin.git
				synced 2025-10-24 17:09:06 +00:00 
			
		
		
		
	SPDX standardizes how source code conveys its copyright and licensing information. See https://spdx.github.io/spdx-spec/1-rationale/ . SPDX tags are adopted in many large projects, including things like the Linux kernel.
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			773 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			773 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2015 Dolphin Emulator Project
 | |
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <optional>
 | |
| 
 | |
| namespace Common
 | |
| {
 | |
| template <typename Callable>
 | |
| class ScopeGuard final
 | |
| {
 | |
| public:
 | |
|   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.reset(); }
 | |
|   void Exit()
 | |
|   {
 | |
|     if (m_finalizer)
 | |
|     {
 | |
|       (*m_finalizer)();  // must not throw
 | |
|       m_finalizer.reset();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   ScopeGuard(const ScopeGuard&) = delete;
 | |
| 
 | |
|   void operator=(const ScopeGuard&) = delete;
 | |
| 
 | |
| private:
 | |
|   std::optional<Callable> m_finalizer;
 | |
| };
 | |
| 
 | |
| }  // Namespace Common
 |