annotate DEPENDENCIES/generic/include/boost/spirit/home/karma/generate.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
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