Commit e61c2150 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Move ScopeGuardImpl and ScopeGuardImplBase into the detail namespace

Summary:
[Folly] Move `ScopeGuardImpl` and `ScopeGuardImplBase` into the `detail` namespace.

Let them be marked as private implementation details.

Reviewed By: andrewjcg

Differential Revision: D6665317

fbshipit-source-id: 03e8fee6a16338395ec92c582613b053bd9f74ec
parent 5277a636
/* /*
* Copyright 2017 Facebook, Inc. * Copyright 2016-present Facebook, Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <iostream> #include <iostream>
/*static*/ void folly::ScopeGuardImplBase::warnAboutToCrash() noexcept { /*static*/ void folly::detail::ScopeGuardImplBase::warnAboutToCrash() noexcept {
// Ensure the availability of std::cerr // Ensure the availability of std::cerr
std::ios_base::Init ioInit; std::ios_base::Init ioInit;
std::cerr std::cerr
......
...@@ -28,47 +28,8 @@ ...@@ -28,47 +28,8 @@
namespace folly { namespace folly {
/** namespace detail {
* ScopeGuard is a general implementation of the "Initialization is
* Resource Acquisition" idiom. Basically, it guarantees that a function
* is executed upon leaving the currrent scope unless otherwise told.
*
* The makeGuard() function is used to create a new ScopeGuard object.
* It can be instantiated with a lambda function, a std::function<void()>,
* a functor, or a void(*)() function pointer.
*
*
* Usage example: Add a friend to memory if and only if it is also added
* to the db.
*
* void User::addFriend(User& newFriend) {
* // add the friend to memory
* friends_.push_back(&newFriend);
*
* // If the db insertion that follows fails, we should
* // remove it from memory.
* auto guard = makeGuard([&] { friends_.pop_back(); });
*
* // this will throw an exception upon error, which
* // makes the ScopeGuard execute UserCont::pop_back()
* // once the Guard's destructor is called.
* db_->addFriend(GetName(), newFriend.GetName());
*
* // an exception was not thrown, so don't execute
* // the Guard.
* guard.dismiss();
* }
*
* Examine ScopeGuardTest.cpp for some more sample usage.
*
* Stolen from:
* Andrei's and Petru Marginean's CUJ article:
* http://drdobbs.com/184403758
* and the loki library:
* http://loki-lib.sourceforge.net/index.php?n=Idioms.ScopeGuardPointer
* and triendl.kj article:
* http://www.codeproject.com/KB/cpp/scope_guard.aspx
*/
class ScopeGuardImplBase { class ScopeGuardImplBase {
public: public:
void dismiss() noexcept { void dismiss() noexcept {
...@@ -172,19 +133,62 @@ class ScopeGuardImpl : public ScopeGuardImplBase { ...@@ -172,19 +133,62 @@ class ScopeGuardImpl : public ScopeGuardImplBase {
FunctionType function_; FunctionType function_;
}; };
template <typename FunctionType> template <typename F>
ScopeGuardImpl<typename std::decay<FunctionType>::type> using ScopeGuardImplDecay = ScopeGuardImpl<typename std::decay<F>::type>;
makeGuard(FunctionType&& fn) noexcept(
std::is_nothrow_constructible<typename std::decay<FunctionType>::type, } // namespace detail
FunctionType>::value) {
return ScopeGuardImpl<typename std::decay<FunctionType>::type>( /**
std::forward<FunctionType>(fn)); * ScopeGuard is a general implementation of the "Initialization is
* Resource Acquisition" idiom. Basically, it guarantees that a function
* is executed upon leaving the currrent scope unless otherwise told.
*
* The makeGuard() function is used to create a new ScopeGuard object.
* It can be instantiated with a lambda function, a std::function<void()>,
* a functor, or a void(*)() function pointer.
*
*
* Usage example: Add a friend to memory if and only if it is also added
* to the db.
*
* void User::addFriend(User& newFriend) {
* // add the friend to memory
* friends_.push_back(&newFriend);
*
* // If the db insertion that follows fails, we should
* // remove it from memory.
* auto guard = makeGuard([&] { friends_.pop_back(); });
*
* // this will throw an exception upon error, which
* // makes the ScopeGuard execute UserCont::pop_back()
* // once the Guard's destructor is called.
* db_->addFriend(GetName(), newFriend.GetName());
*
* // an exception was not thrown, so don't execute
* // the Guard.
* guard.dismiss();
* }
*
* Examine ScopeGuardTest.cpp for some more sample usage.
*
* Stolen from:
* Andrei's and Petru Marginean's CUJ article:
* http://drdobbs.com/184403758
* and the loki library:
* http://loki-lib.sourceforge.net/index.php?n=Idioms.ScopeGuardPointer
* and triendl.kj article:
* http://www.codeproject.com/KB/cpp/scope_guard.aspx
*/
template <typename F>
detail::ScopeGuardImplDecay<F> makeGuard(F&& f) noexcept(
noexcept(detail::ScopeGuardImplDecay<F>(static_cast<F&&>(f)))) {
return detail::ScopeGuardImplDecay<F>(static_cast<F&&>(f));
} }
/** /**
* This is largely unneeded if you just use auto for your guards. * This is largely unneeded if you just use auto for your guards.
*/ */
typedef ScopeGuardImplBase&& ScopeGuard; typedef detail::ScopeGuardImplBase&& ScopeGuard;
namespace detail { namespace detail {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment