// 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(SPIRIT_KARMA_OMIT_JUL_20_2009_1008AM) #define SPIRIT_KARMA_OMIT_JUL_20_2009_1008AM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_directive // enables omit : mpl::true_ {}; template <> struct use_directive // enables skip : mpl::true_ {}; }} namespace boost { namespace spirit { namespace karma { #ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS using spirit::omit; using spirit::skip; #endif using spirit::omit_type; using spirit::skip_type; /////////////////////////////////////////////////////////////////////////// // omit_directive consumes the attribute of subject generator without // generating anything /////////////////////////////////////////////////////////////////////////// template struct omit_directive : unary_generator > { typedef Subject subject_type; typedef mpl::int_< generator_properties::disabling | subject_type::properties::value > properties; omit_directive(Subject const& subject) : subject(subject) {} template struct attribute : traits::attribute_of {}; template bool generate(OutputIterator& sink, Context& ctx, Delimiter const& d , Attribute const& attr) const { // We need to actually compile the output operation as we don't // have any other means to verify, whether the passed attribute is // compatible with the subject. // omit[] will execute the code, while skip[] doesn't execute it if (Execute) { // wrap the given output iterator to avoid output detail::disable_output disable(sink); return subject.generate(sink, ctx, d, attr); } return true; } template info what(Context& context) const { return info(Execute ? "omit" : "skip", subject.what(context)); } Subject subject; }; /////////////////////////////////////////////////////////////////////////// // Generator generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_directive { typedef omit_directive result_type; result_type operator()(unused_type, Subject const& subject , unused_type) const { return result_type(subject); } }; template struct make_directive { typedef omit_directive 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