43 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.0 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"
 | 
						|
 | 
						|
#define MIJIN_SCOPE_EXIT_NAMED(name) \
 | 
						|
mijin::ScopeExitGuard name = [&]()
 | 
						|
 | 
						|
#define MIJIN_SCOPE_EXIT MIJIN_SCOPE_EXIT_NAMED(MIJIN_CONCAT(MIJIN_CONCAT(scope_guard_, __LINE__), __))
 | 
						|
 | 
						|
namespace mijin
 | 
						|
{
 | 
						|
class ScopeExitGuard
 | 
						|
{
 | 
						|
private:
 | 
						|
    std::function<void(void)> func;
 | 
						|
public:
 | 
						|
    template<typename TFunc>
 | 
						|
    inline ScopeExitGuard(TFunc&& func_) noexcept : func(std::forward<TFunc>(func_)) {}
 | 
						|
    ScopeExitGuard(const ScopeExitGuard&) noexcept = delete;
 | 
						|
    ScopeExitGuard(ScopeExitGuard&&) noexcept = delete;
 | 
						|
    inline ~ScopeExitGuard() noexcept
 | 
						|
    {
 | 
						|
        if (func) {
 | 
						|
            func();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    ScopeExitGuard& operator=(const ScopeExitGuard&) noexcept = delete;
 | 
						|
    ScopeExitGuard& operator=(ScopeExitGuard&&) noexcept = delete;
 | 
						|
 | 
						|
    inline void reset() noexcept
 | 
						|
    {
 | 
						|
        func = {};
 | 
						|
    }
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
#endif // defined(MIJIN_UTIL_SCOPE_GUARD_HPP_INCLUDED)
 |