123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #ifndef BOOST_SCOPE_DEFER_HPP_INCLUDED_
- #define BOOST_SCOPE_DEFER_HPP_INCLUDED_
- #include <type_traits>
- #include <boost/scope/detail/config.hpp>
- #include <boost/scope/detail/is_not_like.hpp>
- #include <boost/scope/detail/move_or_copy_construct_ref.hpp>
- #include <boost/scope/detail/type_traits/conjunction.hpp>
- #include <boost/scope/detail/type_traits/is_nothrow_invocable.hpp>
- #include <boost/scope/detail/header.hpp>
- #ifdef BOOST_HAS_PRAGMA_ONCE
- #pragma once
- #endif
- namespace boost {
- namespace scope {
- template< typename Func >
- class defer_guard;
- namespace detail {
- template< typename T >
- using is_not_like_defer_guard = detail::is_not_like< T, defer_guard >;
- }
- template< typename Func >
- class defer_guard
- {
- private:
- struct data
- {
- Func m_func;
- template< typename F, typename = typename std::enable_if< std::is_constructible< Func, F >::value >::type >
- explicit data(F&& func, std::true_type) noexcept :
- m_func(static_cast< F&& >(func))
- {
- }
- template< typename F, typename = typename std::enable_if< std::is_constructible< Func, F >::value >::type >
- explicit data(F&& func, std::false_type) try :
- m_func(static_cast< F&& >(func))
- {
- }
- catch (...)
- {
- func();
- }
- };
- data m_data;
- public:
-
- template<
- typename F
-
- , typename = typename std::enable_if< detail::conjunction<
- std::is_constructible<
- data,
- typename detail::move_or_copy_construct_ref< F, Func >::type,
- typename std::is_nothrow_constructible< Func, typename detail::move_or_copy_construct_ref< F, Func >::type >::type
- >,
- detail::is_not_like_defer_guard< F >
- >::value >::type
-
- >
- defer_guard(F&& func)
- noexcept(BOOST_SCOPE_DETAIL_DOC_HIDDEN(
- std::is_nothrow_constructible<
- data,
- typename detail::move_or_copy_construct_ref< F, Func >::type,
- typename std::is_nothrow_constructible< Func, typename detail::move_or_copy_construct_ref< F, Func >::type >::type
- >::value
- )) :
- m_data
- (
- static_cast< typename detail::move_or_copy_construct_ref< F, Func >::type >(func),
- typename std::is_nothrow_constructible< Func, typename detail::move_or_copy_construct_ref< F, Func >::type >::type()
- )
- {
- }
- defer_guard(defer_guard const&) = delete;
- defer_guard& operator= (defer_guard const&) = delete;
-
- ~defer_guard() noexcept(BOOST_SCOPE_DETAIL_DOC_HIDDEN(detail::is_nothrow_invocable< Func& >::value))
- {
- m_data.m_func();
- }
- };
- #if !defined(BOOST_NO_CXX17_DEDUCTION_GUIDES)
- template< typename Func >
- defer_guard(Func) -> defer_guard< Func >;
- #endif
- }
- #if defined(BOOST_MSVC)
- #define BOOST_SCOPE_DETAIL_UNIQUE_VAR_TAG __COUNTER__
- #else
- #define BOOST_SCOPE_DETAIL_UNIQUE_VAR_TAG __LINE__
- #endif
- #define BOOST_SCOPE_DEFER \
- boost::scope::defer_guard BOOST_JOIN(_boost_defer_guard_, BOOST_SCOPE_DETAIL_UNIQUE_VAR_TAG) =
- }
- #include <boost/scope/detail/footer.hpp>
- #endif
|