// 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_VERBATIM_MAR_02_2007_0303PM) #define BOOST_SPIRIT_KARMA_VERBATIM_MAR_02_2007_0303PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_directive // enables verbatim[] : mpl::true_ {}; }} namespace boost { namespace spirit { namespace karma { using spirit::verbatim; using spirit::verbatim_type; /////////////////////////////////////////////////////////////////////////// // The verbatim generator is used for verbatim[...] directives. /////////////////////////////////////////////////////////////////////////// template struct verbatim_generator : unary_generator > { typedef Subject subject_type; typedef typename subject_type::properties properties; template struct attribute : traits::attribute_of {}; verbatim_generator(Subject const& subject) : subject(subject) {} template bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d , Attribute const& attr) const { // the verbatim generator simply dispatches to the embedded // generator while supplying unused_delimiter as the new delimiter // to avoid delimiting down the generator stream typedef detail::unused_delimiter unused_delimiter; return subject.generate(sink, ctx, unused_delimiter(d), attr) && karma::delimit_out(sink, d); // always do post-delimiting } template info what(Context& context) const { return info("verbatim", subject.what(context)); } Subject subject; }; /////////////////////////////////////////////////////////////////////////// // Generator generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_directive { typedef verbatim_generator result_type; result_type operator()(unused_type, Subject const& subject, unused_type) const { return result_type(subject); } }; }}} namespace boost { namespace spirit { namespace traits { template struct has_semantic_action > : unary_has_semantic_action {}; }}} #endif