Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: make_scope_exit() is described in C++ proposal p0052r2, which uses RAII to do cleanup works at scope exit. Reviewers: chandlerc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D22796 llvm-svn: 278251
- Loading branch information
Showing
3 changed files
with
88 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
//===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines the make_scope_exit function, which executes user-defined | ||
// cleanup logic at scope exit. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_ADT_SCOPE_EXIT_H | ||
#define LLVM_ADT_SCOPE_EXIT_H | ||
|
||
#include "llvm/Support/Compiler.h" | ||
|
||
#include <type_traits> | ||
#include <utility> | ||
|
||
namespace llvm { | ||
namespace detail { | ||
|
||
template <typename Callable> class LLVM_ATTRIBUTE_UNUSED_RESULT scope_exit { | ||
Callable ExitFunction; | ||
|
||
public: | ||
template <typename Fp> | ||
explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {} | ||
|
||
scope_exit(const scope_exit &) = default; | ||
scope_exit(scope_exit &&) = default; | ||
|
||
~scope_exit() { 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> | ||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
//===- llvm/unittest/ADT/ScopeExit.cpp - Scope exit unit tests --*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "llvm/ADT/ScopeExit.h" | ||
#include "gtest/gtest.h" | ||
|
||
using namespace llvm; | ||
|
||
namespace { | ||
|
||
TEST(ScopeExitTest, Basic) { | ||
struct Callable { | ||
bool &Called; | ||
Callable(bool &Called) : Called(Called) {} | ||
Callable(Callable &&RHS) : Called(RHS.Called) {} | ||
void operator()() { Called = true; } | ||
}; | ||
bool Called = false; | ||
{ | ||
auto g = make_scope_exit(Callable(Called)); | ||
EXPECT_FALSE(Called); | ||
} | ||
EXPECT_TRUE(Called); | ||
} | ||
|
||
} // end anonymous namespace |