44 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #if !defined(MIJIN_UTIL_SCOPE_GUARD_HPP_INCLUDED)
 | |
| #define MIJIN_UTIL_SCOPE_GUARD_HPP_INCLUDED 1
 | |
| 
 | |
| #include <functional>
 | |
| #include "./common_macros.hpp"
 | |
| #include "../internal/common.hpp"
 | |
| 
 | |
| #define MIJIN_SCOPE_EXIT_NAMED(name) \
 | |
| const mijin::ScopeExitGuard name = [&]()
 | |
| 
 | |
| #define MIJIN_SCOPE_EXIT MIJIN_SCOPE_EXIT_NAMED(MIJIN_CONCAT(MIJIN_CONCAT(scope_guard_, __LINE__), __))
 | |
| 
 | |
| namespace mijin
 | |
| {
 | |
| class ScopeExitGuard
 | |
| {
 | |
| private:
 | |
|     mutable std::function<void(void)> func; // variable is declared const to make clang-tidy happy, but we still want to be able to reset()
 | |
| public:
 | |
|     template<typename TFunc>
 | |
|     inline ScopeExitGuard(TFunc&& func_) MIJIN_NOEXCEPT : func(std::forward<TFunc>(func_)) {}
 | |
|     ScopeExitGuard(const ScopeExitGuard&) = delete;
 | |
|     ScopeExitGuard(ScopeExitGuard&&) = delete;
 | |
|     inline ~ScopeExitGuard() MIJIN_NOEXCEPT
 | |
|     {
 | |
|         if (func) {
 | |
|             func();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     ScopeExitGuard& operator=(const ScopeExitGuard&) = delete;
 | |
|     ScopeExitGuard& operator=(ScopeExitGuard&&) = delete;
 | |
| 
 | |
|     inline void reset() const MIJIN_NOEXCEPT
 | |
|     {
 | |
|         func = {};
 | |
|     }
 | |
| };
 | |
| }
 | |
| 
 | |
| #endif // defined(MIJIN_UTIL_SCOPE_GUARD_HPP_INCLUDED)
 |