1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- ///
- /// \file
- /// This file defines the make_scope_exit function, which executes user-defined
- /// cleanup logic at scope exit.
- ///
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_ADT_SCOPEEXIT_H
- #define LLVM_ADT_SCOPEEXIT_H
- #include "llvm/Support/Compiler.h"
- #include <type_traits>
- #include <utility>
- namespace llvm {
- namespace detail {
- template <typename Callable> class scope_exit {
- Callable ExitFunction;
- bool Engaged = true; // False once moved-from or release()d.
- public:
- template <typename Fp>
- explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
- scope_exit(scope_exit &&Rhs)
- : 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();
- }
- };
- } // end namespace detail
- // 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>
- LLVM_NODISCARD detail::scope_exit<typename std::decay<Callable>::type>
- make_scope_exit(Callable &&F) {
- return detail::scope_exit<typename std::decay<Callable>::type>(
- std::forward<Callable>(F));
- }
- } // end namespace llvm
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|