annotate DEPENDENCIES/generic/include/boost/spirit/home/karma/auxiliary/lazy.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 // Copyright (c) 2001-2011 Joel de Guzman
Chris@16 3 //
Chris@16 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 #if !defined(BOOST_SPIRIT_KARMA_LAZY_MARCH_27_2007_1231PM)
Chris@16 8 #define BOOST_SPIRIT_KARMA_LAZY_MARCH_27_2007_1231PM
Chris@16 9
Chris@16 10 #if defined(_MSC_VER)
Chris@16 11 #pragma once
Chris@16 12 #endif
Chris@16 13
Chris@16 14 #include <boost/spirit/home/karma/domain.hpp>
Chris@16 15 #include <boost/spirit/home/karma/delimit_out.hpp>
Chris@16 16 #include <boost/spirit/home/karma/meta_compiler.hpp>
Chris@16 17 #include <boost/spirit/home/karma/detail/attributes.hpp>
Chris@16 18 #include <boost/spirit/home/support/unused.hpp>
Chris@16 19 #include <boost/spirit/home/support/info.hpp>
Chris@16 20 #include <boost/spirit/home/support/lazy.hpp>
Chris@16 21 #include <boost/spirit/include/phoenix_core.hpp>
Chris@16 22 #include <boost/fusion/include/at.hpp>
Chris@16 23 #include <boost/utility/result_of.hpp>
Chris@16 24 #include <boost/type_traits/remove_reference.hpp>
Chris@16 25 #include <boost/mpl/not.hpp>
Chris@16 26
Chris@16 27 namespace boost { namespace spirit
Chris@16 28 {
Chris@16 29 ///////////////////////////////////////////////////////////////////////////
Chris@16 30 // Enablers
Chris@16 31 ///////////////////////////////////////////////////////////////////////////
Chris@16 32 template <typename Eval>
Chris@16 33 struct use_terminal<karma::domain, phoenix::actor<Eval> > // enables phoenix actors
Chris@16 34 : mpl::true_ {};
Chris@16 35
Chris@16 36 // forward declaration
Chris@16 37 template <typename Terminal, typename Actor, int Arity>
Chris@16 38 struct lazy_terminal;
Chris@16 39
Chris@16 40 }}
Chris@16 41
Chris@16 42 namespace boost { namespace spirit { namespace karma
Chris@16 43 {
Chris@16 44 using spirit::lazy;
Chris@16 45 typedef modify<karma::domain> karma_modify;
Chris@16 46
Chris@16 47 namespace detail
Chris@16 48 {
Chris@16 49 template <typename Generator, typename OutputIterator, typename Context
Chris@16 50 , typename Delimiter, typename Attribute>
Chris@16 51 bool lazy_generate_impl(Generator const& g, OutputIterator& sink
Chris@16 52 , Context& context, Delimiter const& delim
Chris@16 53 , Attribute const& attr, mpl::false_)
Chris@16 54 {
Chris@16 55 return g.generate(sink, context, delim, attr);
Chris@16 56 }
Chris@16 57
Chris@16 58 template <typename Generator, typename OutputIterator, typename Context
Chris@16 59 , typename Delimiter, typename Attribute>
Chris@16 60 bool lazy_generate_impl(Generator const& g, OutputIterator& sink
Chris@16 61 , Context& context, Delimiter const& delim
Chris@16 62 , Attribute const& attr, mpl::true_)
Chris@16 63 {
Chris@16 64 // If DeducedAuto is false (semantic actions is present), the
Chris@16 65 // component's attribute is unused.
Chris@16 66 return g.generate(sink, context, delim, unused);
Chris@16 67 }
Chris@16 68
Chris@16 69 template <typename Generator, typename OutputIterator, typename Context
Chris@16 70 , typename Delimiter, typename Attribute>
Chris@16 71 bool lazy_generate_impl_main(Generator const& g, OutputIterator& sink
Chris@16 72 , Context& context, Delimiter const& delim, Attribute const& attr)
Chris@16 73 {
Chris@16 74 // If DeducedAuto is true (no semantic action), we pass the parser's
Chris@16 75 // attribute on to the component.
Chris@16 76 typedef typename traits::has_semantic_action<Generator>::type auto_rule;
Chris@16 77 return lazy_generate_impl(g, sink, context, delim, attr, auto_rule());
Chris@16 78 }
Chris@16 79 }
Chris@16 80
Chris@16 81 template <typename Function, typename Modifiers>
Chris@16 82 struct lazy_generator : generator<lazy_generator<Function, Modifiers> >
Chris@16 83 {
Chris@16 84 typedef mpl::int_<generator_properties::all_properties> properties;
Chris@16 85
Chris@16 86 template <typename Context, typename Iterator>
Chris@16 87 struct attribute
Chris@16 88 {
Chris@16 89 typedef typename
Chris@16 90 boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
Chris@16 91 modifier;
Chris@16 92
Chris@16 93 typedef typename
Chris@16 94 remove_reference<
Chris@16 95 typename boost::result_of<Function(unused_type, Context)>::type
Chris@16 96 >::type
Chris@16 97 expr_type;
Chris@16 98
Chris@16 99 // If you got an error_invalid_expression error message here,
Chris@16 100 // then the expression (expr_type) is not a valid spirit karma
Chris@16 101 // expression.
Chris@16 102 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type);
Chris@16 103
Chris@16 104 typedef typename
Chris@16 105 result_of::compile<karma::domain, expr_type, modifier>::type
Chris@16 106 generator_type;
Chris@16 107
Chris@16 108 typedef typename
Chris@16 109 traits::attribute_of<generator_type, Context, Iterator>::type
Chris@16 110 type;
Chris@16 111 };
Chris@16 112
Chris@16 113 lazy_generator(Function const& func, Modifiers const& modifiers)
Chris@16 114 : func(func), modifiers(modifiers) {}
Chris@16 115
Chris@16 116 template <
Chris@16 117 typename OutputIterator, typename Context,
Chris@16 118 typename Delimiter, typename Attribute
Chris@16 119 >
Chris@16 120 bool generate(OutputIterator& sink, Context& context,
Chris@16 121 Delimiter const& d, Attribute const& attr) const
Chris@16 122 {
Chris@16 123 return detail::lazy_generate_impl_main(
Chris@16 124 compile<karma::domain>(func(unused, context)
Chris@16 125 , karma_modify()(tag::lazy_eval(), modifiers))
Chris@16 126 , sink, context, d, attr);
Chris@16 127 }
Chris@16 128
Chris@16 129 template <typename Context>
Chris@16 130 info what(Context& context) const
Chris@16 131 {
Chris@16 132 return info("lazy"
Chris@16 133 , compile<karma::domain>(func(unused, context)
Chris@16 134 , karma_modify()(tag::lazy_eval(), modifiers))
Chris@16 135 .what(context)
Chris@16 136 );
Chris@16 137 }
Chris@16 138
Chris@16 139 Function func;
Chris@16 140 Modifiers modifiers;
Chris@16 141
Chris@16 142 private:
Chris@16 143 // silence MSVC warning C4512: assignment operator could not be generated
Chris@16 144 lazy_generator& operator= (lazy_generator const&);
Chris@16 145 };
Chris@16 146
Chris@16 147 ///////////////////////////////////////////////////////////////////////////
Chris@16 148 template <typename Function, typename Subject, typename Modifiers>
Chris@16 149 struct lazy_directive
Chris@16 150 : unary_generator<lazy_directive<Function, Subject, Modifiers> >
Chris@16 151 {
Chris@16 152 typedef mpl::int_<generator_properties::all_properties> properties;
Chris@16 153
Chris@16 154 typedef Subject subject_type;
Chris@16 155
Chris@16 156 template <typename Context, typename Iterator>
Chris@16 157 struct attribute
Chris@16 158 {
Chris@16 159 typedef typename
Chris@16 160 boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
Chris@16 161 modifier;
Chris@16 162
Chris@16 163 typedef typename
Chris@16 164 remove_reference<
Chris@16 165 typename boost::result_of<Function(unused_type, Context)>::type
Chris@16 166 >::type
Chris@16 167 directive_expr_type;
Chris@16 168
Chris@16 169 typedef typename
Chris@16 170 proto::result_of::make_expr<
Chris@16 171 proto::tag::subscript
Chris@16 172 , directive_expr_type
Chris@16 173 , Subject
Chris@16 174 >::type
Chris@16 175 expr_type;
Chris@16 176
Chris@16 177 // If you got an error_invalid_expression error message here,
Chris@16 178 // then the expression (expr_type) is not a valid spirit karma
Chris@16 179 // expression.
Chris@16 180 BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type);
Chris@16 181
Chris@16 182 typedef typename
Chris@16 183 result_of::compile<karma::domain, expr_type, modifier>::type
Chris@16 184 generator_type;
Chris@16 185
Chris@16 186 typedef typename
Chris@16 187 traits::attribute_of<generator_type, Context, Iterator>::type
Chris@16 188 type;
Chris@16 189 };
Chris@16 190
Chris@16 191 lazy_directive(Function const& function, Subject const& subject
Chris@16 192 , Modifiers const& modifiers)
Chris@16 193 : function(function), subject(subject), modifiers(modifiers) {}
Chris@16 194
Chris@16 195 template <typename OutputIterator, typename Context, typename Delimiter
Chris@16 196 , typename Attribute>
Chris@16 197 bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d
Chris@16 198 , Attribute const& attr) const
Chris@16 199 {
Chris@16 200 return detail::lazy_generate_impl_main(compile<karma::domain>(
Chris@16 201 proto::make_expr<proto::tag::subscript>(
Chris@16 202 function(unused, ctx), subject)
Chris@16 203 , karma_modify()(tag::lazy_eval(), modifiers))
Chris@16 204 , sink, ctx, d, attr);
Chris@16 205 }
Chris@16 206
Chris@16 207 template <typename Context>
Chris@16 208 info what(Context& ctx) const
Chris@16 209 {
Chris@16 210 return info("lazy-directive"
Chris@16 211 , compile<karma::domain>(
Chris@16 212 proto::make_expr<proto::tag::subscript>(
Chris@16 213 function(unused, ctx), subject)
Chris@16 214 , karma_modify()(tag::lazy_eval(), modifiers))
Chris@16 215 .what(ctx)
Chris@16 216 );
Chris@16 217 }
Chris@16 218
Chris@16 219 Function function;
Chris@16 220 Subject subject;
Chris@16 221 Modifiers modifiers;
Chris@16 222 };
Chris@16 223
Chris@16 224 ///////////////////////////////////////////////////////////////////////////
Chris@16 225 // Generator generators: make_xxx function (objects)
Chris@16 226 ///////////////////////////////////////////////////////////////////////////
Chris@16 227 template <typename Eval, typename Modifiers>
Chris@16 228 struct make_primitive<phoenix::actor<Eval>, Modifiers>
Chris@16 229 {
Chris@16 230 typedef lazy_generator<phoenix::actor<Eval>, Modifiers> result_type;
Chris@16 231 result_type operator()(phoenix::actor<Eval> const& f
Chris@16 232 , Modifiers const& modifiers) const
Chris@16 233 {
Chris@16 234 return result_type(f, modifiers);
Chris@16 235 }
Chris@16 236 };
Chris@16 237
Chris@16 238 template <typename Terminal, typename Actor, int Arity, typename Modifiers>
Chris@16 239 struct make_primitive<lazy_terminal<Terminal, Actor, Arity>, Modifiers>
Chris@16 240 {
Chris@16 241 typedef lazy_generator<Actor, Modifiers> result_type;
Chris@16 242 result_type operator()(
Chris@16 243 lazy_terminal<Terminal, Actor, Arity> const& lt
Chris@16 244 , Modifiers const& modifiers) const
Chris@16 245 {
Chris@16 246 return result_type(lt.actor, modifiers);
Chris@16 247 }
Chris@16 248 };
Chris@16 249
Chris@16 250 template <
Chris@16 251 typename Terminal, typename Actor, int Arity, typename Subject
Chris@16 252 , typename Modifiers>
Chris@16 253 struct make_directive<lazy_terminal<Terminal, Actor, Arity>
Chris@16 254 , Subject, Modifiers>
Chris@16 255 {
Chris@16 256 typedef lazy_directive<Actor, Subject, Modifiers> result_type;
Chris@16 257 result_type operator()(
Chris@16 258 lazy_terminal<Terminal, Actor, Arity> const& lt
Chris@16 259 , Subject const& subject, Modifiers const& modifiers) const
Chris@16 260 {
Chris@16 261 return result_type(lt.actor, subject, modifiers);
Chris@16 262 }
Chris@16 263 };
Chris@16 264
Chris@16 265 }}}
Chris@16 266
Chris@16 267 #endif