Chris@16
|
1 // Copyright (c) 2001-2011 Hartmut Kaiser
|
Chris@16
|
2 //
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 #if !defined(BOOST_SPIRIT_KARMA_GENERATE_DEC_01_2009_0734PM)
|
Chris@16
|
7 #define BOOST_SPIRIT_KARMA_GENERATE_DEC_01_2009_0734PM
|
Chris@16
|
8
|
Chris@16
|
9 #if defined(_MSC_VER)
|
Chris@16
|
10 #pragma once
|
Chris@16
|
11 #endif
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/spirit/home/support/context.hpp>
|
Chris@16
|
14 #include <boost/spirit/home/support/nonterminal/locals.hpp>
|
Chris@16
|
15 #include <boost/spirit/home/karma/detail/generate.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost { namespace spirit { namespace karma
|
Chris@16
|
18 {
|
Chris@16
|
19 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
20 template <typename OutputIterator, typename Expr>
|
Chris@16
|
21 inline bool
|
Chris@16
|
22 generate(
|
Chris@16
|
23 OutputIterator& sink
|
Chris@16
|
24 , Expr const& expr)
|
Chris@16
|
25 {
|
Chris@16
|
26 return detail::generate_impl<Expr>::call(sink, expr);
|
Chris@16
|
27 }
|
Chris@16
|
28
|
Chris@16
|
29 template <typename OutputIterator, typename Expr>
|
Chris@16
|
30 inline bool
|
Chris@16
|
31 generate(
|
Chris@16
|
32 OutputIterator const& sink_
|
Chris@16
|
33 , Expr const& expr)
|
Chris@16
|
34 {
|
Chris@16
|
35 OutputIterator sink = sink_;
|
Chris@16
|
36 return karma::generate(sink, expr);
|
Chris@16
|
37 }
|
Chris@16
|
38
|
Chris@16
|
39 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
40 namespace detail
|
Chris@16
|
41 {
|
Chris@16
|
42 template <typename T>
|
Chris@16
|
43 struct make_context
|
Chris@16
|
44 {
|
Chris@16
|
45 typedef context<fusion::cons<T const&>, locals<> > type;
|
Chris@16
|
46 };
|
Chris@16
|
47
|
Chris@16
|
48 template <>
|
Chris@16
|
49 struct make_context<unused_type>
|
Chris@16
|
50 {
|
Chris@16
|
51 typedef unused_type type;
|
Chris@16
|
52 };
|
Chris@16
|
53 }
|
Chris@16
|
54
|
Chris@16
|
55 template <typename OutputIterator, typename Properties, typename Expr
|
Chris@16
|
56 , typename Attr>
|
Chris@16
|
57 inline bool
|
Chris@16
|
58 generate(
|
Chris@16
|
59 detail::output_iterator<OutputIterator, Properties>& sink
|
Chris@16
|
60 , Expr const& expr
|
Chris@16
|
61 , Attr const& attr)
|
Chris@16
|
62 {
|
Chris@16
|
63 // Report invalid expression error as early as possible.
|
Chris@16
|
64 // If you got an error_invalid_expression error message here,
|
Chris@16
|
65 // then the expression (expr) is not a valid spirit karma expression.
|
Chris@16
|
66 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
|
Chris@16
|
67
|
Chris@16
|
68 typename detail::make_context<Attr>::type context(attr);
|
Chris@16
|
69 return compile<karma::domain>(expr).generate(sink, context, unused, attr);
|
Chris@16
|
70 }
|
Chris@16
|
71
|
Chris@16
|
72 template <typename OutputIterator, typename Expr, typename Attr>
|
Chris@16
|
73 inline bool
|
Chris@16
|
74 generate(
|
Chris@16
|
75 OutputIterator& sink_
|
Chris@16
|
76 , Expr const& expr
|
Chris@16
|
77 , Attr const& attr)
|
Chris@16
|
78 {
|
Chris@16
|
79 // Report invalid expression error as early as possible.
|
Chris@16
|
80 // If you got an error_invalid_expression error message here,
|
Chris@16
|
81 // then the expression (expr) is not a valid spirit karma expression.
|
Chris@16
|
82 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
|
Chris@16
|
83
|
Chris@16
|
84 typedef traits::properties_of<
|
Chris@16
|
85 typename result_of::compile<karma::domain, Expr>::type
|
Chris@16
|
86 > properties;
|
Chris@16
|
87
|
Chris@16
|
88 // wrap user supplied iterator into our own output iterator
|
Chris@16
|
89 detail::output_iterator<OutputIterator
|
Chris@16
|
90 , mpl::int_<properties::value> > sink(sink_);
|
Chris@16
|
91 return karma::generate(sink, expr, attr);
|
Chris@16
|
92 }
|
Chris@16
|
93
|
Chris@16
|
94 template <typename OutputIterator, typename Expr, typename Attr>
|
Chris@16
|
95 inline bool
|
Chris@16
|
96 generate(
|
Chris@16
|
97 OutputIterator const& sink_
|
Chris@16
|
98 , Expr const& expr
|
Chris@16
|
99 , Attr const& attr)
|
Chris@16
|
100 {
|
Chris@16
|
101 OutputIterator sink = sink_;
|
Chris@16
|
102 return karma::generate(sink, expr, attr);
|
Chris@16
|
103 }
|
Chris@16
|
104
|
Chris@16
|
105 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
106 template <typename OutputIterator, typename Expr, typename Delimiter>
|
Chris@16
|
107 inline bool
|
Chris@16
|
108 generate_delimited(
|
Chris@16
|
109 OutputIterator& sink
|
Chris@16
|
110 , Expr const& expr
|
Chris@16
|
111 , Delimiter const& delimiter
|
Chris@16
|
112 , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit =
|
Chris@16
|
113 delimit_flag::dont_predelimit)
|
Chris@16
|
114 {
|
Chris@16
|
115 return detail::generate_delimited_impl<Expr>::call(
|
Chris@16
|
116 sink, expr, delimiter, pre_delimit);
|
Chris@16
|
117 }
|
Chris@16
|
118
|
Chris@16
|
119 template <typename OutputIterator, typename Expr, typename Delimiter>
|
Chris@16
|
120 inline bool
|
Chris@16
|
121 generate_delimited(
|
Chris@16
|
122 OutputIterator const& sink_
|
Chris@16
|
123 , Expr const& expr
|
Chris@16
|
124 , Delimiter const& delimiter
|
Chris@16
|
125 , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit =
|
Chris@16
|
126 delimit_flag::dont_predelimit)
|
Chris@16
|
127 {
|
Chris@16
|
128 OutputIterator sink = sink_;
|
Chris@16
|
129 return karma::generate_delimited(sink, expr, delimiter, pre_delimit);
|
Chris@16
|
130 }
|
Chris@16
|
131
|
Chris@16
|
132 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
133 template <typename OutputIterator, typename Properties, typename Expr
|
Chris@16
|
134 , typename Delimiter, typename Attribute>
|
Chris@16
|
135 inline bool
|
Chris@16
|
136 generate_delimited(
|
Chris@16
|
137 detail::output_iterator<OutputIterator, Properties>& sink
|
Chris@16
|
138 , Expr const& expr
|
Chris@16
|
139 , Delimiter const& delimiter
|
Chris@16
|
140 , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
|
Chris@16
|
141 , Attribute const& attr)
|
Chris@16
|
142 {
|
Chris@16
|
143 // Report invalid expression error as early as possible.
|
Chris@16
|
144 // If you got an error_invalid_expression error message here,
|
Chris@16
|
145 // then either the expression (expr) or skipper is not a valid
|
Chris@16
|
146 // spirit karma expression.
|
Chris@16
|
147 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
|
Chris@16
|
148 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
|
Chris@16
|
149
|
Chris@16
|
150 typename result_of::compile<karma::domain, Delimiter>::type const
|
Chris@16
|
151 delimiter_ = compile<karma::domain>(delimiter);
|
Chris@16
|
152
|
Chris@16
|
153 if (pre_delimit == delimit_flag::predelimit &&
|
Chris@16
|
154 !karma::delimit_out(sink, delimiter_))
|
Chris@16
|
155 {
|
Chris@16
|
156 return false;
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 typename detail::make_context<Attribute>::type context(attr);
|
Chris@16
|
160 return compile<karma::domain>(expr).
|
Chris@16
|
161 generate(sink, context, delimiter_, attr);
|
Chris@16
|
162 }
|
Chris@16
|
163
|
Chris@16
|
164 template <typename OutputIterator, typename Expr, typename Delimiter
|
Chris@16
|
165 , typename Attribute>
|
Chris@16
|
166 inline bool
|
Chris@16
|
167 generate_delimited(
|
Chris@16
|
168 OutputIterator& sink_
|
Chris@16
|
169 , Expr const& expr
|
Chris@16
|
170 , Delimiter const& delimiter
|
Chris@16
|
171 , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
|
Chris@16
|
172 , Attribute const& attr)
|
Chris@16
|
173 {
|
Chris@16
|
174 typedef traits::properties_of<
|
Chris@16
|
175 typename result_of::compile<karma::domain, Expr>::type
|
Chris@16
|
176 > properties;
|
Chris@16
|
177 typedef traits::properties_of<
|
Chris@16
|
178 typename result_of::compile<karma::domain, Delimiter>::type
|
Chris@16
|
179 > delimiter_properties;
|
Chris@16
|
180
|
Chris@16
|
181 // wrap user supplied iterator into our own output iterator
|
Chris@16
|
182 detail::output_iterator<OutputIterator
|
Chris@16
|
183 , mpl::int_<properties::value | delimiter_properties::value>
|
Chris@16
|
184 > sink(sink_);
|
Chris@16
|
185 return karma::generate_delimited(sink, expr, delimiter, pre_delimit, attr);
|
Chris@16
|
186 }
|
Chris@16
|
187
|
Chris@16
|
188 template <typename OutputIterator, typename Expr, typename Delimiter
|
Chris@16
|
189 , typename Attribute>
|
Chris@16
|
190 inline bool
|
Chris@16
|
191 generate_delimited(
|
Chris@16
|
192 OutputIterator const& sink_
|
Chris@16
|
193 , Expr const& expr
|
Chris@16
|
194 , Delimiter const& delimiter
|
Chris@16
|
195 , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
|
Chris@16
|
196 , Attribute const& attr)
|
Chris@16
|
197 {
|
Chris@16
|
198 OutputIterator sink = sink_;
|
Chris@16
|
199 return karma::generate_delimited(sink, expr, delimiter, pre_delimit, attr);
|
Chris@16
|
200 }
|
Chris@16
|
201
|
Chris@16
|
202 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
203 template <typename OutputIterator, typename Expr, typename Delimiter
|
Chris@16
|
204 , typename Attribute>
|
Chris@16
|
205 inline bool
|
Chris@16
|
206 generate_delimited(
|
Chris@16
|
207 OutputIterator& sink
|
Chris@16
|
208 , Expr const& expr
|
Chris@16
|
209 , Delimiter const& delimiter
|
Chris@16
|
210 , Attribute const& attr)
|
Chris@16
|
211 {
|
Chris@16
|
212 return karma::generate_delimited(sink, expr, delimiter
|
Chris@16
|
213 , delimit_flag::dont_predelimit, attr);
|
Chris@16
|
214 }
|
Chris@16
|
215
|
Chris@16
|
216 template <typename OutputIterator, typename Expr, typename Delimiter
|
Chris@16
|
217 , typename Attribute>
|
Chris@16
|
218 inline bool
|
Chris@16
|
219 generate_delimited(
|
Chris@16
|
220 OutputIterator const& sink_
|
Chris@16
|
221 , Expr const& expr
|
Chris@16
|
222 , Delimiter const& delimiter
|
Chris@16
|
223 , Attribute const& attr)
|
Chris@16
|
224 {
|
Chris@16
|
225 OutputIterator sink = sink_;
|
Chris@16
|
226 return karma::generate_delimited(sink, expr, delimiter
|
Chris@16
|
227 , delimit_flag::dont_predelimit, attr);
|
Chris@16
|
228 }
|
Chris@16
|
229 }}}
|
Chris@16
|
230
|
Chris@16
|
231 #endif
|
Chris@16
|
232
|