43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
# pragma once
 | 
						|
 | 
						|
# include <utility>
 | 
						|
 | 
						|
# define AX_CONCATENATE_IMPL(s1, s2) s1##s2
 | 
						|
# define AX_CONCATENATE(s1, s2)    AX_CONCATENATE_IMPL(s1, s2)
 | 
						|
# ifdef __COUNTER__
 | 
						|
#     define AX_ANONYMOUS_VARIABLE(str) AX_CONCATENATE(str, __COUNTER__)
 | 
						|
# else
 | 
						|
#     define AX_ANONYMOUS_VARIABLE(str) AX_CONCATENATE(str, __LINE__)
 | 
						|
# endif
 | 
						|
 | 
						|
namespace ax {
 | 
						|
namespace scopeguard_detail {
 | 
						|
 | 
						|
enum class ScopeGuardOnExit {};
 | 
						|
template <typename F>
 | 
						|
class ScopeGuard
 | 
						|
{
 | 
						|
    F f_;
 | 
						|
    bool active_;
 | 
						|
public:
 | 
						|
    ScopeGuard() = delete;
 | 
						|
    ScopeGuard(const ScopeGuard&) = delete;
 | 
						|
    ScopeGuard& operator=(const ScopeGuard&) = delete;
 | 
						|
    ScopeGuard(ScopeGuard&& rhs): f_(std::move(rhs.f_)), active_(rhs.active_) { rhs.dismiss(); }
 | 
						|
    ScopeGuard(F f): f_(std::move(f)), active_(true) {}
 | 
						|
    ~ScopeGuard() { if (active_) f_(); }
 | 
						|
    void dismiss() { active_ = false; }
 | 
						|
};
 | 
						|
template <typename F>
 | 
						|
inline ScopeGuard<F> operator+(ScopeGuardOnExit, F&& f)
 | 
						|
{
 | 
						|
    return ScopeGuard<F>(std::forward<F>(f));
 | 
						|
}
 | 
						|
 | 
						|
} // namespace scopeguard_detail
 | 
						|
} // namespace ax
 | 
						|
 | 
						|
# define AX_SCOPE_EXIT \
 | 
						|
    auto AX_ANONYMOUS_VARIABLE(AX_SCOPE_EXIT_STATE) \
 | 
						|
    = ::ax::scopeguard_detail::ScopeGuardOnExit() + [&]()
 |