1 /*============================================================================= 2 Copyright (c) 2001-2011 Hartmut Kaiser 3 Copyright (c) 2001-2011 Joel de Guzman 4 5 Distributed under the Boost Software License, Version 1.0. (See accompanying 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 ==============================================================================*/ 8 #if !defined(BOOST_PP_IS_ITERATING) 9 10 #if !defined(BOOST_SPIRIT_MATCH_MANIP_ATTR_MAY_05_2007_1202PM) 11 #define BOOST_SPIRIT_MATCH_MANIP_ATTR_MAY_05_2007_1202PM 12 13 #include <boost/spirit/home/qi/stream/match_manip.hpp> 14 15 #include <boost/fusion/include/vector.hpp> 16 #include <boost/preprocessor/iterate.hpp> 17 #include <boost/preprocessor/repetition/enum.hpp> 18 #include <boost/preprocessor/repetition/enum_params.hpp> 19 #include <boost/preprocessor/repetition/enum_binary_params.hpp> 20 21 #define BOOST_PP_FILENAME_1 \ 22 <boost/spirit/home/qi/stream/match_manip_attr.hpp> 23 #define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT) 24 #include BOOST_PP_ITERATE() 25 26 #endif 27 28 /////////////////////////////////////////////////////////////////////////////// 29 // 30 // Preprocessor vertical repetition code 31 // 32 /////////////////////////////////////////////////////////////////////////////// 33 #else // defined(BOOST_PP_IS_ITERATING) 34 35 #define N BOOST_PP_ITERATION() 36 #define BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE(z, n, A) BOOST_PP_CAT(A, n) & 37 38 /////////////////////////////////////////////////////////////////////////////// 39 namespace boost { namespace spirit { namespace qi 40 { 41 /////////////////////////////////////////////////////////////////////////// 42 template <typename Expr, BOOST_PP_ENUM_PARAMS(N, typename A)> 43 inline detail::match_manip<Expr, mpl::false_, mpl::true_, unused_type 44 , fusion::vector< 45 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 46 > > match(Expr const & xpr,BOOST_PP_ENUM_BINARY_PARAMS (N,A,& attr))47 match( 48 Expr const& xpr 49 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr)) 50 { 51 using qi::detail::match_manip; 52 53 // Report invalid expression error as early as possible. 54 // If you got an error_invalid_expression error message here, 55 // then the expression (expr) is not a valid spirit qi expression. 56 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr); 57 58 typedef fusion::vector< 59 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 60 > vector_type; 61 62 vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr)); 63 return match_manip<Expr, mpl::false_, mpl::true_, unused_type, vector_type>( 64 xpr, unused, attr); 65 } 66 67 /////////////////////////////////////////////////////////////////////////// 68 template <typename Expr, typename Skipper 69 , BOOST_PP_ENUM_PARAMS(N, typename A)> 70 inline detail::match_manip<Expr, mpl::false_, mpl::true_, Skipper 71 , fusion::vector< 72 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 73 > > phrase_match(Expr const & xpr,Skipper const & s,BOOST_SCOPED_ENUM (skip_flag)post_skip,BOOST_PP_ENUM_BINARY_PARAMS (N,A,& attr))74 phrase_match( 75 Expr const& xpr 76 , Skipper const& s 77 , BOOST_SCOPED_ENUM(skip_flag) post_skip 78 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr)) 79 { 80 using qi::detail::match_manip; 81 82 // Report invalid expression error as early as possible. 83 // If you got an error_invalid_expression error message here, 84 // then either the expression (expr) or skipper is not a valid 85 // spirit qi expression. 86 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr); 87 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper); 88 89 typedef fusion::vector< 90 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 91 > vector_type; 92 93 vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr)); 94 return match_manip<Expr, mpl::false_, mpl::true_, Skipper, vector_type>( 95 xpr, s, post_skip, attr); 96 } 97 98 template <typename Expr, typename Skipper 99 , BOOST_PP_ENUM_PARAMS(N, typename A)> 100 inline detail::match_manip<Expr, mpl::false_, mpl::true_, Skipper 101 , fusion::vector< 102 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 103 > > phrase_match(Expr const & xpr,Skipper const & s,BOOST_PP_ENUM_BINARY_PARAMS (N,A,& attr))104 phrase_match( 105 Expr const& xpr 106 , Skipper const& s 107 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr)) 108 { 109 using qi::detail::match_manip; 110 111 // Report invalid expression error as early as possible. 112 // If you got an error_invalid_expression error message here, 113 // then either the expression (expr) or skipper is not a valid 114 // spirit qi expression. 115 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr); 116 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper); 117 118 typedef fusion::vector< 119 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A) 120 > vector_type; 121 122 vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr)); 123 return match_manip<Expr, mpl::false_, mpl::true_, Skipper, vector_type>( 124 xpr, s, attr); 125 } 126 127 }}} 128 129 #undef BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE 130 #undef N 131 132 #endif 133 134