// 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_ACTION_MAR_07_2007_0851AM) #define BOOST_SPIRIT_KARMA_ACTION_MAR_07_2007_0851AM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { namespace karma { /////////////////////////////////////////////////////////////////////////// BOOST_PP_REPEAT(SPIRIT_ARGUMENTS_LIMIT, SPIRIT_USING_ARGUMENT, _) template struct action : unary_generator > { typedef Subject subject_type; typedef typename subject_type::properties properties; template struct attribute : traits::attribute_of {}; action(Subject const& subject, Action 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 { typedef typename attribute::type attr_type; typedef traits::make_attribute make_attribute; // create a attribute if none is supplied // this creates a _copy_ of the attribute because the semantic // action will likely change parts of this typedef traits::transform_attribute< typename make_attribute::type, attr_type, domain> transform; typename transform::type attr = traits::pre_transform(make_attribute::call(attr_)); // call the function, passing the attribute, the context and a bool // flag that the client can set to false to fail generating. return traits::action_dispatch()(f, attr, ctx) && subject.generate(sink, ctx, d, attr); } template info what(Context& context) const { // the action is transparent (does not add any info) return subject.what(context); } subject_type subject; Action f; }; }}} /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Karma action meta-compiler template <> struct make_component { template struct result; template struct result { typedef typename remove_const::type subject_type; typedef typename remove_const::type action_type; typedef karma::action type; }; template typename result::type operator()(Elements const& elements, unused_type) const { typename result::type result(elements.car, elements.cdr.car); return result; } }; }} namespace boost { namespace spirit { namespace traits { /////////////////////////////////////////////////////////////////////////// template struct has_semantic_action > : mpl::true_ {}; /////////////////////////////////////////////////////////////////////////// template struct handles_container, Attribute , Context, Iterator> : unary_handles_container {}; }}} #endif