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)
|