// Copyright (c) 2001-2011 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_NO_DELIMIT_JAN_19_2010_0920AM) #define BOOST_SPIRIT_KARMA_NO_DELIMIT_JAN_19_2010_0920AM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_directive // enables no_delimit[] : mpl::true_ {}; }} namespace boost { namespace spirit { namespace karma { #ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS using spirit::no_delimit; #endif using spirit::no_delimit_type; /////////////////////////////////////////////////////////////////////////// // The no_delimit generator is used for no_delimit[...] directives. /////////////////////////////////////////////////////////////////////////// template struct no_delimit_generator : unary_generator > { typedef Subject subject_type; typedef typename subject_type::properties properties; template struct attribute : traits::attribute_of {}; no_delimit_generator(Subject const& subject) : subject(subject) {} template bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d , Attribute const& attr) const { // the no_delimit 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; // the difference to verbatim[] is that this does not post-delimit return subject.generate(sink, ctx, unused_delimiter(d), attr); } template info what(Context& context) const { return info("no_delimit", subject.what(context)); } Subject subject; }; /////////////////////////////////////////////////////////////////////////// // Generator generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_directive { typedef no_delimit_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 {}; /////////////////////////////////////////////////////////////////////////// template struct handles_container, Attribute , Context, Iterator> : unary_handles_container {}; }}} #endif