williamr@2: williamr@2: #ifndef BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED williamr@2: #define BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED williamr@2: williamr@2: // Copyright Aleksey Gurtovoy 2003-2004 williamr@2: // Copyright David Abrahams 2003-2004 williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. williamr@2: // (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // See http://www.boost.org/libs/mpl for documentation. williamr@2: williamr@2: // $Source: /cvsroot/boost/boost/boost/mpl/aux_/inserter_algorithm.hpp,v $ williamr@2: // $Date: 2004/09/02 15:40:43 $ williamr@2: // $Revision: 1.2 $ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) williamr@2: williamr@2: # define BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(arity, name) \ williamr@2: BOOST_MPL_AUX_COMMON_NAME_WKND(name) \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \ williamr@2: > \ williamr@2: struct name \ williamr@2: : aux::name##_impl \ williamr@2: { \ williamr@2: }; \ williamr@2: \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \ williamr@2: > \ williamr@2: struct name< BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P),na > \ williamr@2: : if_< has_push_back \ williamr@2: , aux::name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , back_inserter< typename clear::type > \ williamr@2: > \ williamr@2: , aux::reverse_##name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , front_inserter< typename clear::type > \ williamr@2: > \ williamr@2: >::type \ williamr@2: { \ williamr@2: }; \ williamr@2: \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \ williamr@2: > \ williamr@2: struct reverse_##name \ williamr@2: : aux::reverse_##name##_impl \ williamr@2: { \ williamr@2: }; \ williamr@2: \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \ williamr@2: > \ williamr@2: struct reverse_##name< BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P),na > \ williamr@2: : if_< has_push_back \ williamr@2: , aux::reverse_##name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , back_inserter< typename clear::type > \ williamr@2: > \ williamr@2: , aux::name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , front_inserter< typename clear::type > \ williamr@2: > \ williamr@2: >::type \ williamr@2: { \ williamr@2: }; \ williamr@2: BOOST_MPL_AUX_NA_SPEC(arity, name) \ williamr@2: BOOST_MPL_AUX_NA_SPEC(arity, reverse_##name) \ williamr@2: /**/ williamr@2: williamr@2: #else williamr@2: williamr@2: # define BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(arity, name) \ williamr@2: BOOST_MPL_AUX_COMMON_NAME_WKND(name) \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \ williamr@2: > \ williamr@2: struct def_##name##_impl \ williamr@2: : if_< has_push_back \ williamr@2: , aux::name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , back_inserter< typename clear::type > \ williamr@2: > \ williamr@2: , aux::reverse_##name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , front_inserter< typename clear::type > \ williamr@2: > \ williamr@2: >::type \ williamr@2: { \ williamr@2: }; \ williamr@2: \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \ williamr@2: > \ williamr@2: struct name \ williamr@2: { \ williamr@2: typedef typename eval_if< \ williamr@2: is_na \ williamr@2: , def_##name##_impl \ williamr@2: , aux::name##_impl \ williamr@2: >::type type; \ williamr@2: }; \ williamr@2: \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \ williamr@2: > \ williamr@2: struct def_reverse_##name##_impl \ williamr@2: : if_< has_push_back \ williamr@2: , aux::reverse_##name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , back_inserter< typename clear::type > \ williamr@2: > \ williamr@2: , aux::name##_impl< \ williamr@2: BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \ williamr@2: , front_inserter< typename clear::type > \ williamr@2: > \ williamr@2: >::type \ williamr@2: { \ williamr@2: }; \ williamr@2: template< \ williamr@2: BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \ williamr@2: > \ williamr@2: struct reverse_##name \ williamr@2: { \ williamr@2: typedef typename eval_if< \ williamr@2: is_na \ williamr@2: , def_reverse_##name##_impl \ williamr@2: , aux::reverse_##name##_impl \ williamr@2: >::type type; \ williamr@2: }; \ williamr@2: BOOST_MPL_AUX_NA_SPEC(arity, name) \ williamr@2: BOOST_MPL_AUX_NA_SPEC(arity, reverse_##name) \ williamr@2: /**/ williamr@2: williamr@2: #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: williamr@2: #endif // BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED