/*////////////////////////////////////////////////////////////////////////////// Copyright (c) 2011 Jamboree 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) //////////////////////////////////////////////////////////////////////////////*/ #ifndef BOOST_SPIRIT_REPOSITORY_KARMA_TRANS #define BOOST_SPIRIT_REPOSITORY_KARMA_TRANS #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { namespace repository { namespace tag { struct trans {}; } namespace karma { // enables trans(f)[...] template inline spirit::stateful_tag_type trans(F f) { return spirit::stateful_tag_type(f); } // enables trans(f)[...] template inline spirit::stateful_tag_type trans(F f) { return spirit::stateful_tag_type(f); } } }}} namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// // enables trans(f)[...] template struct use_directive > : mpl::true_ {}; }} // namespace boost::spirit namespace boost { namespace spirit { namespace repository {namespace karma { template struct trans_directive : spirit::karma::unary_generator > { typedef Subject subject_type; template struct attribute : mpl::eval_if < is_same , traits::attribute_of , mpl::identity > {}; trans_directive(Subject const& subject, F f) : subject(subject), f(f) {} template < typename OutputIterator, typename Context , typename Delimiter, typename Attribute > bool generate ( OutputIterator& sink, Context& ctx, Delimiter const& d , Attribute const& attr) const { return subject.generate(sink, ctx, d, f(attr)); } template info what(Context& context) const { return info("trans", subject.what(context)); } Subject subject; F f; }; }}}} // namespace boost::spirit::repository::karma namespace boost { namespace spirit { namespace karma { /////////////////////////////////////////////////////////////////////////// // Generator generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_directive, Subject, Modifiers> { typedef repository::karma::trans_directive result_type; template result_type operator()( StatefulTag const& tag, Subject const& subject, unused_type) const { return result_type(subject, tag.data_); } }; }}} // namespace boost::spirit::karma namespace boost { namespace spirit { namespace traits { /////////////////////////////////////////////////////////////////////////// template struct has_semantic_action > : unary_has_semantic_action {}; /////////////////////////////////////////////////////////////////////////// template struct handles_container < repository::karma::trans_directive , Attribute, Context, Iterator > : mpl::false_ {}; // FIXME }}} // namespace boost::spirit::traits #endif