LLVM 22.0.0git
ScopeExit.h
Go to the documentation of this file.
1//===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file defines the make_scope_exit function, which executes user-defined
11/// cleanup logic at scope exit.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_ADT_SCOPEEXIT_H
16#define LLVM_ADT_SCOPEEXIT_H
17
18#include <utility>
19
20namespace llvm {
21
22template <typename Callable> class scope_exit {
23 Callable ExitFunction;
24 bool Engaged = true; // False once moved-from or release()d.
25
26public:
27 template <typename Fp>
28 explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
29
31 : ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) {
32 Rhs.release();
33 }
34 scope_exit(const scope_exit &) = delete;
36 scope_exit &operator=(const scope_exit &) = delete;
37
38 void release() { Engaged = false; }
39
41 if (Engaged)
42 ExitFunction();
43 }
44};
45
46template <typename Callable> scope_exit(Callable) -> scope_exit<Callable>;
47
48// Keeps the callable object that is passed in, and execute it at the
49// destruction of the returned object (usually at the scope exit where the
50// returned object is kept).
51//
52// Interface is specified by p0052r2.
53template <typename Callable> [[nodiscard]] auto make_scope_exit(Callable &&F) {
54 return scope_exit(std::forward<Callable>(F));
55}
56
57} // end namespace llvm
58
59#endif
#define F(x, y, z)
Definition MD5.cpp:54
scope_exit & operator=(const scope_exit &)=delete
scope_exit(const scope_exit &)=delete
scope_exit(Fp &&F)
Definition ScopeExit.h:28
scope_exit(scope_exit &&Rhs)
Definition ScopeExit.h:30
scope_exit & operator=(scope_exit &&)=delete
This is an optimization pass for GlobalISel generic memory operations.
scope_exit(Callable) -> scope_exit< Callable >
auto make_scope_exit(Callable &&F)
Definition ScopeExit.h:53
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1915
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870