| // ty: EMPTY() | typename
#define BOOST_SCOPE_EXIT_AUX_IMPL(id, ty, traits) \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_DETAIL_TAG_DECL, id, \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_DETAIL_CAPTURE_DECL, (id, ty), \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_IIF(BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
BOOST_SCOPE_EXIT_DETAIL_TYPEDEF_TYPEOF_THIS \
, \
BOOST_PP_TUPLE_EAT(3) \
)(id, ty, BOOST_SCOPE_EXIT_AUX_THIS_CAPTURE_T(id)) \
struct BOOST_SCOPE_EXIT_DETAIL_PARAMS_T(id) { \
/* interim capture types to workaround internal errors on old GCC */ \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_DETAIL_PARAM_DECL, (id, ty), \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_EXPR_IIF(BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
typedef BOOST_SCOPE_EXIT_AUX_THIS_CAPTURE_T(id) \
BOOST_SCOPE_EXIT_AUX_THIS_T(id) ; \
) \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER, id, \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_EXPR_IIF(BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
BOOST_SCOPE_EXIT_AUX_THIS_T(id) \
BOOST_SCOPE_EXIT_DETAIL_PARAM_THIS(id) ; \
) \
BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, ty, \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits), \
BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits)) \
} BOOST_SCOPE_EXIT_AUX_PARAMS(id) \
BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits), \
BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits)) \
; \
::boost::scope_exit::detail::declared< \
::boost::scope_exit::detail::resolve< \
sizeof(BOOST_SCOPE_EXIT_AUX_ARGS) \
>::cmp1<0>::cmp2 \
> BOOST_SCOPE_EXIT_AUX_ARGS; \
BOOST_SCOPE_EXIT_AUX_ARGS.value = &BOOST_SCOPE_EXIT_AUX_PARAMS(id); \
struct BOOST_SCOPE_EXIT_AUX_GUARD_T(id) { \
BOOST_SCOPE_EXIT_DETAIL_PARAMS_T(id)* boost_se_params_; \
BOOST_SCOPE_EXIT_AUX_GUARD_T(id) (void* boost_se_params) \
: boost_se_params_( \
(BOOST_SCOPE_EXIT_DETAIL_PARAMS_T(id)*)boost_se_params) \
{} \
~BOOST_SCOPE_EXIT_AUX_GUARD_T(id)() { \
boost_se_body( \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_ARG, id, \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_COMMA_IF(BOOST_PP_BITAND(BOOST_PP_LIST_IS_CONS( \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)), \
BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits))) \
BOOST_PP_EXPR_IIF(BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS( \
traits), \
boost_se_params_->BOOST_SCOPE_EXIT_DETAIL_PARAM_THIS(id) \
) \
); \
} \
static void boost_se_body( \
BOOST_PP_LIST_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_ARG_DECL, (id, ty), \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)) \
BOOST_PP_COMMA_IF(BOOST_PP_BITAND(BOOST_PP_LIST_IS_CONS( \
BOOST_SCOPE_EXIT_AUX_TRAITS_CAPTURES(traits)), \
BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits))) \
BOOST_PP_EXPR_IIF(BOOST_SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
ty BOOST_SCOPE_EXIT_DETAIL_PARAMS_T(id):: \
BOOST_SCOPE_EXIT_AUX_THIS_T(id) this_ \
) \
)
|