8#ifndef INCLUDED_BDLB_SCOPEEXIT
9#define INCLUDED_BDLB_SCOPEEXIT
594#include <bdlscm_version.h>
612#include <bsl_functional.h>
614#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
615 #include <bsl_type_traits.h>
617#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
618 #include <bsl_utility.h>
631#ifdef BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
648 #define BDLB_SCOPEEXIT_USES_MODERN_CPP
651#ifdef BDE_BUILD_TARGET_EXC
652 #define BDLB_SCOPEEXIT_NOEXCEPT_SPEC BSLS_KEYWORD_NOEXCEPT_SPECIFICATION
654 #define BDLB_SCOPEEXIT_NOEXCEPT_SPEC(...)
664#ifdef BDLB_SCOPEEXIT_USES_MODERN_CPP
665 #define BDLB_SCOPEEXIT_PROCTOR(NAME, EXIT_FUNC) \
666 auto NAME{ BloombergLP::bdlb::ScopeExitUtil::makeScopeExit(EXIT_FUNC) }
668 #define BDLB_SCOPEEXIT_PROCTOR(NAME, EXIT_FUNC) \
669 BloombergLP::bdlb::ScopeExitAny NAME((EXIT_FUNC))
675#define BDLB_SCOPEEXIT_PRIVATE_CAT(X, Y) BDLB_SCOPEEXIT_PRIVATE_CAT_IMP(X, Y)
680#define BDLB_SCOPEEXIT_PRIVATE_CAT_IMP(X, Y) X##Y
685#if defined(BSLS_PLATFORM_CMP_MSVC) || defined(BSLS_PLATFORM_CMP_GNU) || \
686 defined(BSLS_PLATFORM_CMP_CLANG)
692 #define BDLB_SCOPEEXIT_PRIVATE_UNIQNUM __COUNTER__
694 #define BDLB_SCOPEEXIT_PRIVATE_UNIQNUM __LINE__
707#define BDLB_SCOPEEXIT_GUARD(EXIT_FUNC) \
709 const BDLB_SCOPEEXIT_PROCTOR( \
710 BDLB_SCOPEEXIT_PRIVATE_CAT(bdlbScopeExitGuard_, \
711 BDLB_SCOPEEXIT_PRIVATE_UNIQNUM), \
741template <
class EXIT_FUNC>
769 EXIT_FUNC d_exitFunction;
770 bool d_executeOnDestruction;
776#ifdef BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
797 template <
class EXIT_FUNC_PARAM>
800#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
807 bsl::is_constructible<
811 bsl::is_constructible<
831#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
851#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
854 || bsl::is_nothrow_copy_constructible<EXIT_FUNC>::value);
872#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
874template <
class EXIT_FUNC_PARAM>
887#ifdef BDLB_SCOPEEXIT_USES_MODERN_CPP
899struct ScopeExitUtil {
906 template <
class EXIT_FUNC_PARAM>
910 makeScopeExit(EXIT_FUNC_PARAM&& function);
923template <
class EXIT_FUNC>
924template <
class EXIT_FUNC_PARAM>
929#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
930 bsl::is_constructible<
934 bsl::is_constructible<
949#ifdef BDE_BUILD_TARGET_EXC
952#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
956 bsl::is_nothrow_constructible<EXIT_FUNC,
957 EXIT_FUNC_PARAM>::value ||
958 !bsl::is_constructible<
961 EXIT_FUNC_PARAM>::type&
965 EXIT_FUNC_PARAM>::type&
976, d_executeOnDestruction(
true)
979#ifdef BDE_BUILD_TARGET_EXC
982 MoveUtil::access(function)();
986#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
987template <
class EXIT_FUNC>
988inline ScopeExit<EXIT_FUNC>::ScopeExit(
void (*function)())
989#ifdef BDE_BUILD_TARGET_EXC
992: d_exitFunction(function)
993, d_executeOnDestruction(
true)
996#ifdef BDE_BUILD_TARGET_EXC
1004template <
class EXIT_FUNC>
1007#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
1010 || bsl::is_nothrow_copy_constructible<EXIT_FUNC>::value)
1015: d_exitFunction(MoveUtil::move_if_noexcept(
1016 MoveUtil::access(original).d_exitFunction))
1017, d_executeOnDestruction(
true)
1019 MoveUtil::access(original).
release();
1022template <
class EXIT_FUNC>
1026 if (d_executeOnDestruction) {
1032template <
class EXIT_FUNC>
1036 d_executeOnDestruction =
false;
1039#ifdef BDLB_SCOPEEXIT_USES_MODERN_CPP
1046template <
class EXIT_FUNC_PARAM>
1049ScopeExitUtil::makeScopeExit(EXIT_FUNC_PARAM&& function)
1052 bslmf::Util::forward<EXIT_FUNC_PARAM>(function));
1064#ifndef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
1069template <
class EXIT_FUNC>
1076#ifdef BDLB_SCOPEEXIT_USES_MODERN_CPP
1077#undef BDLB_SCOPEEXIT_USES_MODERN_CPP
1080#ifdef BDLB_SCOPEEXIT_NOEXCEPT_SPEC
1081#undef BDLB_SCOPEEXIT_NOEXCEPT_SPEC
Definition bdlb_scopeexit.h:742
void release()
Definition bdlb_scopeexit.h:1034
ScopeExit(bslmf::MovableRef< ScopeExit > original) BDLB_SCOPEEXIT_NOEXCEPT_SPEC(bsl ~ScopeExit()
Definition bdlb_scopeexit.h:1024
Forward declaration.
Definition bslstl_function.h:946
Definition bslmf_movableref.h:752
#define BDLB_SCOPEEXIT_NOEXCEPT_SPEC(...)
Definition bdlb_scopeexit.h:654
#define BSLA_NODISCARD_CPP17
Definition bsla_nodiscard.h:321
#define BSLA_NODISCARD
Definition bsla_nodiscard.h:320
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_COMPILERFEATURES_CPLUSPLUS
Definition bsls_compilerfeatures.h:1396
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_DELETED
Definition bsls_keyword.h:651
Definition bdlb_algorithmworkaroundutil.h:74
ScopeExit< bsl::function< void()> > ScopeExitAny
Definition bdlb_scopeexit.h:885
Definition bdlat_valuetypefunctions.h:939
Definition bslmf_conditional.h:123
Definition bslmf_enableif.h:530
Definition bslmf_isconvertible.h:875
Definition bslmf_isfunction.h:232
Definition bslmf_isnothrowmoveconstructible.h:361
Definition bslmf_ispointer.h:138
Definition bslmf_isreference.h:137
BloombergLP::bslmf::RemovePointer_Imp< t_TYPE >::Type type
Definition bslmf_removepointer.h:274
Definition bslmf_movableref.h:867
Definition bslmf_movableref.h:829
Definition bslmf_movableref.h:795
static BSLS_KEYWORD_CONSTEXPR const t_TYPE & forward(const t_TYPE &t) BSLS_KEYWORD_NOEXCEPT
Definition bslmf_util.h:462