|
#pragma once |
|
|
|
#include <type_traits> |
|
#include <utility> |
|
|
|
namespace c10 { |
|
|
|
|
|
|
|
|
|
template <typename Callable> |
|
class scope_exit { |
|
Callable ExitFunction; |
|
bool Engaged = true; |
|
|
|
public: |
|
template <typename Fp> |
|
|
|
|
|
|
|
explicit scope_exit(Fp&& F) : ExitFunction(std::forward<Fp>(F)) {} |
|
|
|
scope_exit(scope_exit&& Rhs) noexcept |
|
: ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) { |
|
Rhs.release(); |
|
} |
|
scope_exit(const scope_exit&) = delete; |
|
scope_exit& operator=(scope_exit&&) = delete; |
|
scope_exit& operator=(const scope_exit&) = delete; |
|
|
|
void release() { |
|
Engaged = false; |
|
} |
|
|
|
~scope_exit() { |
|
if (Engaged) { |
|
ExitFunction(); |
|
} |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename Callable> |
|
scope_exit<typename std::decay<Callable>::type> make_scope_exit(Callable&& F) { |
|
return scope_exit<typename std::decay<Callable>::type>( |
|
std::forward<Callable>(F)); |
|
} |
|
|
|
} |
|
|