Chris@102: // Boost.Range library Chris@102: // Chris@102: // Copyright Neil Groves 2014. Use, modification and Chris@102: // distribution is subject to the Boost Software License, Version Chris@102: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // For more information, see http://www.boost.org/libs/range/ Chris@102: // Chris@102: #ifndef BOOST_RANGE_DETAIL_COMBINE_CXX03_HPP Chris@102: #define BOOST_RANGE_DETAIL_COMBINE_CXX03_HPP Chris@102: Chris@102: #ifndef BOOST_RANGE_MIN_COMBINE_ARGS Chris@102: #define BOOST_RANGE_MIN_COMBINE_ARGS 2 Chris@102: #endif Chris@102: Chris@102: #ifndef BOOST_RANGE_MAX_COMBINE_ARGS Chris@102: #define BOOST_RANGE_MAX_COMBINE_ARGS 5 Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: namespace range_detail Chris@102: { Chris@102: Chris@102: template Chris@102: struct combined_result_impl; Chris@102: Chris@102: template Chris@102: struct combined_result Chris@102: : combined_result_impl::value> Chris@102: { Chris@102: }; Chris@102: Chris@102: #define BOOST_RANGE_combined_element(z, n, data) \ Chris@102: typename tuples::element::type Chris@102: Chris@102: #define BOOST_RANGE_combined_result(z, n, data) \ Chris@102: template \ Chris@102: struct combined_result_impl \ Chris@102: : result_of \ Chris@102: { \ Chris@102: }; Chris@102: Chris@102: #define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combined_result(~,n,~) Chris@102: Chris@102: #define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \ Chris@102: BOOST_RANGE_MAX_COMBINE_ARGS) Chris@102: #include BOOST_PP_LOCAL_ITERATE() Chris@102: Chris@102: #define BOOST_RANGE_combined_get(z, n, data) get(tuple) Chris@102: Chris@102: #define BOOST_RANGE_combined_unpack(z, n, data) \ Chris@102: template inline \ Chris@102: typename combined_result::type \ Chris@102: unpack_(mpl::int_, F f, const T& tuple) \ Chris@102: { \ Chris@102: return f(BOOST_PP_ENUM(n, BOOST_RANGE_combined_get, ~)); \ Chris@102: } Chris@102: Chris@102: #define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combined_unpack(~,n,~) Chris@102: #define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \ Chris@102: BOOST_RANGE_MAX_COMBINE_ARGS) Chris@102: #include BOOST_PP_LOCAL_ITERATE() Chris@102: Chris@102: } // namespace range_detail Chris@102: Chris@102: namespace range Chris@102: { Chris@102: Chris@102: #define BOOST_RANGE_combined_seq(z, n, data) boost::data(BOOST_PP_CAT(r,n)) Chris@102: Chris@102: #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@102: Chris@102: #include Chris@102: Chris@102: #else // by using rvalue references we avoid requiring 2^n overloads. Chris@102: Chris@102: #include Chris@102: Chris@102: #endif Chris@102: Chris@102: #define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combine(~,n,~) Chris@102: #define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \ Chris@102: BOOST_RANGE_MAX_COMBINE_ARGS) Chris@102: #include BOOST_PP_LOCAL_ITERATE() Chris@102: Chris@102: } // namespace range Chris@102: Chris@102: using boost::range::combine; Chris@102: Chris@102: } // namespace boost Chris@102: Chris@102: #endif // include guard Chris@102: Chris@102: #undef BOOST_RANGE_combined_element Chris@102: #undef BOOST_RANGE_combined_result Chris@102: #undef BOOST_RANGE_combined_get Chris@102: #undef BOOST_RANGE_combined_unpack Chris@102: #undef BOOST_RANGE_combined_seq Chris@102: #undef BOOST_RANGE_combined_exp_pred Chris@102: #undef BOOST_RANGE_combined_exp_op Chris@102: #undef BOOST_RANGE_combined_exp Chris@102: #undef BOOST_RANGE_combined_bitset_pred Chris@102: #undef BOOST_RANGE_combined_bitset_op Chris@102: #undef BOOST_RANGE_combined_bitset Chris@102: #undef BOOST_RANGE_combined_range_iterator Chris@102: #undef BOOST_RANGE_combined_args Chris@102: #undef BOOST_RANGE_combine_impl Chris@102: #undef BOOST_RANGE_combine