| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
- #pragma once
- #include <type_traits>
- #include <utility>
- namespace c10 {
- /**
- * Mostly copied from https://llvm.org/doxygen/ScopeExit_8h_source.html
- */
- template <typename Callable>
- class scope_exit {
- Callable ExitFunction;
- bool Engaged = true; // False once moved-from or release()d.
- public:
- template <typename Fp>
- // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
- 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();
- }
- }
- };
- // Keeps the callable object that is passed in, and execute it at the
- // destruction of the returned object (usually at the scope exit where the
- // returned object is kept).
- //
- // Interface is specified by p0052r2.
- template <typename Callable>
- scope_exit<std::decay_t<Callable>> make_scope_exit(Callable&& F) {
- return scope_exit<std::decay_t<Callable>>(std::forward<Callable>(F));
- }
- } // namespace c10
- #else
- #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined."
- #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
|