// Copyright (c) 2001-2010 Hartmut Kaiser // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #if !defined(BOOST_SPIRIT_KARMA_DELIMIT_MAR_02_2007_0217PM) #define BOOST_SPIRIT_KARMA_DELIMIT_MAR_02_2007_0217PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_directive // enables delimit[] : mpl::true_ {}; // enables delimit(d)[g], where d is a generator template struct use_directive > > : boost::spirit::traits::matches {}; // enables *lazy* delimit(d)[g] template <> struct use_lazy_directive : mpl::true_ {}; }} namespace boost { namespace spirit { namespace karma { using spirit::delimit; using spirit::delimit_type; /////////////////////////////////////////////////////////////////////////// // The redelimit_generator generator is used for delimit[...] directives. /////////////////////////////////////////////////////////////////////////// template struct redelimit_generator : unary_generator > { typedef Subject subject_type; typedef typename subject_type::properties properties; template struct attribute : traits::attribute_of {}; redelimit_generator(Subject const& subject) : subject(subject) {} template bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d , Attribute const& attr) const { // The delimit_space generator simply dispatches to the embedded // generator while supplying either the delimiter which has been // used before a surrounding verbatim[] directive or a single // space as the new delimiter to use (if no surrounding verbatim[] // was specified). return subject.generate(sink, ctx , detail::get_delimiter(d, compile(' ')), attr); } template info what(Context& context) const { return info("delimit", subject.what(context)); } Subject subject; }; /////////////////////////////////////////////////////////////////////////// // The delimit_generator is used for delimit(d)[...] directives. /////////////////////////////////////////////////////////////////////////// template struct delimit_generator : unary_generator > { typedef Subject subject_type; typedef Delimiter delimiter_type; typedef typename subject_type::properties properties; template struct attribute : traits::attribute_of {}; delimit_generator(Subject const& subject, Delimiter const& delimiter) : subject(subject), delimiter(delimiter) {} template bool generate(OutputIterator& sink, Context& ctx, Delimiter_ const& , Attribute const& attr) const { // the delimit generator simply dispatches to the embedded // generator while supplying it's argument as the new delimiter // to use return subject.generate(sink, ctx, delimiter, attr); } template info what(Context& context) const { return info("delimit", subject.what(context)); } Subject subject; Delimiter delimiter; }; /////////////////////////////////////////////////////////////////////////// // Generator generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_directive { typedef redelimit_generator result_type; result_type operator()(unused_type, Subject const& subject , unused_type) const { return result_type(subject); } }; template struct make_directive< terminal_ex > , Subject, Modifiers> { typedef typename result_of::compile::type delimiter_type; typedef delimit_generator result_type; template result_type operator()(Terminal const& term, Subject const& subject , unused_type) const { return result_type(subject , compile(fusion::at_c<0>(term.args))); } }; }}} namespace boost { namespace spirit { namespace traits { template struct has_semantic_action > : unary_has_semantic_action {}; template struct has_semantic_action > : unary_has_semantic_action {}; }}} #endif