comparison DEPENDENCIES/generic/include/boost/spirit/home/qi/parse_attr.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 // Copyright (c) 2001-2011 Hartmut Kaiser
2 // Copyright (c) 2001-2011 Joel de Guzman
3 // Copyright (c) 2009 Carl Barron
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_PARSE_ATTR_APRIL_24_2009_1043AM)
11 #define BOOST_SPIRIT_PARSE_ATTR_APRIL_24_2009_1043AM
12
13 #include <boost/spirit/home/qi/parse.hpp>
14
15 #include <boost/fusion/include/vector.hpp>
16 #include <boost/preprocessor/cat.hpp>
17 #include <boost/preprocessor/iterate.hpp>
18 #include <boost/preprocessor/repetition/enum.hpp>
19 #include <boost/preprocessor/repetition/enum_params.hpp>
20 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
21
22 #define BOOST_PP_FILENAME_1 <boost/spirit/home/qi/parse_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 namespace boost { namespace spirit { namespace qi
39 {
40 ///////////////////////////////////////////////////////////////////////////
41 template <typename Iterator, typename Expr
42 , BOOST_PP_ENUM_PARAMS(N, typename A)>
43 inline bool
44 parse(
45 Iterator& first
46 , Iterator last
47 , Expr const& expr
48 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
49 {
50 // Make sure the iterator is at least a forward_iterator. If you got an
51 // compilation error here, then you are using an input_iterator while
52 // calling this function, you need to supply at least a
53 // forward_iterator instead.
54 BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
55
56 // Report invalid expression error as early as possible.
57 // If you got an error_invalid_expression error message here,
58 // then the expression (expr) is not a valid spirit qi expression.
59 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
60
61 typedef fusion::vector<
62 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
63 > vector_type;
64
65 vector_type lattr (BOOST_PP_ENUM_PARAMS(N, attr));
66 return compile<qi::domain>(expr).parse(first, last, unused, unused, lattr);
67 }
68
69 template <typename Iterator, typename Expr
70 , BOOST_PP_ENUM_PARAMS(N, typename A)>
71 inline bool
72 parse(
73 Iterator const& first_
74 , Iterator last
75 , Expr const& expr
76 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
77 {
78 Iterator first = first_;
79 return qi::parse(first, last, expr, BOOST_PP_ENUM_PARAMS(N, attr));
80 }
81
82 ///////////////////////////////////////////////////////////////////////////
83 template <typename Iterator, typename Expr, typename Skipper
84 , BOOST_PP_ENUM_PARAMS(N, typename A)>
85 inline bool
86 phrase_parse(
87 Iterator& first
88 , Iterator last
89 , Expr const& expr
90 , Skipper const& skipper
91 , BOOST_SCOPED_ENUM(skip_flag) post_skip
92 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
93 {
94 // Make sure the iterator is at least a forward_iterator. If you got an
95 // compilation error here, then you are using an input_iterator while
96 // calling this function, you need to supply at least a
97 // forward_iterator instead.
98 BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
99
100 // Report invalid expression error as early as possible.
101 // If you got an error_invalid_expression error message here,
102 // then either the expression (expr) or skipper is not a valid
103 // spirit qi expression.
104 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
105 BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
106
107 typedef
108 typename result_of::compile<qi::domain, Skipper>::type
109 skipper_type;
110 skipper_type const skipper_ = compile<qi::domain>(skipper);
111
112 typedef fusion::vector<
113 BOOST_PP_ENUM(N, BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE, A)
114 > vector_type;
115
116 vector_type lattr (BOOST_PP_ENUM_PARAMS(N, attr));
117 if (!compile<qi::domain>(expr).parse(
118 first, last, unused, skipper_, lattr))
119 return false;
120
121 if (post_skip == skip_flag::postskip)
122 qi::skip_over(first, last, skipper_);
123 return true;
124 }
125
126 template <typename Iterator, typename Expr, typename Skipper
127 , BOOST_PP_ENUM_PARAMS(N, typename A)>
128 inline bool
129 phrase_parse(
130 Iterator const& first_
131 , Iterator last
132 , Expr const& expr
133 , Skipper const& skipper
134 , BOOST_SCOPED_ENUM(skip_flag) post_skip
135 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
136 {
137 Iterator first = first_;
138 return qi::phrase_parse(first, last, expr, skipper, post_skip
139 , BOOST_PP_ENUM_PARAMS(N, attr));
140 }
141
142 ///////////////////////////////////////////////////////////////////////////
143 template <typename Iterator, typename Expr, typename Skipper
144 , BOOST_PP_ENUM_PARAMS(N, typename A)>
145 inline bool
146 phrase_parse(
147 Iterator& first
148 , Iterator last
149 , Expr const& expr
150 , Skipper const& skipper
151 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
152 {
153 return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip
154 , BOOST_PP_ENUM_PARAMS(N, attr));
155 }
156
157 template <typename Iterator, typename Expr, typename Skipper
158 , BOOST_PP_ENUM_PARAMS(N, typename A)>
159 inline bool
160 phrase_parse(
161 Iterator const& first_
162 , Iterator last
163 , Expr const& expr
164 , Skipper const& skipper
165 , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & attr))
166 {
167 Iterator first = first_;
168 return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip
169 , BOOST_PP_ENUM_PARAMS(N, attr));
170 }
171 }}}
172
173 #undef BOOST_SPIRIT_QI_ATTRIBUTE_REFERENCE
174 #undef N
175
176 #endif
177