1 /*============================================================================= 2 Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com) 3 http://spirit.sourceforge.net/ 4 5 Distributed under the Boost Software License, Version 1.0. (See accompanying 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 =============================================================================*/ 8 #ifndef BOOST_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP 9 #define BOOST_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP 10 11 #include <boost/spirit/home/classic/namespace.hpp> 12 #include <boost/spirit/home/classic/actor/ref_value_actor.hpp> 13 #include <boost/spirit/home/classic/actor/ref_const_ref_actor.hpp> 14 15 namespace boost { namespace spirit { 16 17 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN 18 19 /////////////////////////////////////////////////////////////////////////// 20 // Summary: 21 // 22 // A semantic action policy that appends a value to the back of a 23 // container. 24 // (This doc uses convention available in actors.hpp) 25 // 26 // Actions (what it does and what ref, value_ref must support): 27 // ref.push_back( value ); 28 // ref.push_back( T::value_type(first,last) ); 29 // ref.push_back( value_ref ); 30 // 31 // Policy name: 32 // push_back_action 33 // 34 // Policy holder, corresponding helper method: 35 // ref_value_actor, push_back_a( ref ); 36 // ref_const_ref_actor, push_back_a( ref, value_ref ); 37 // 38 // () operators: both 39 // 40 // See also ref_value_actor and ref_const_ref_actor for more details. 41 /////////////////////////////////////////////////////////////////////////// 42 struct push_back_action 43 { 44 template< 45 typename T, 46 typename ValueT 47 > actboost::spirit::push_back_action48 void act(T& ref_, ValueT const& value_) const 49 { 50 ref_.push_back( value_ ); 51 } 52 template< 53 typename T, 54 typename IteratorT 55 > actboost::spirit::push_back_action56 void act( 57 T& ref_, 58 IteratorT const& first_, 59 IteratorT const& last_ 60 ) const 61 { 62 typedef typename T::value_type value_type; 63 value_type value(first_,last_); 64 65 ref_.push_back( value ); 66 } 67 }; 68 69 // Deprecated interface. Use push_back_a 70 template<typename T> 71 inline ref_value_actor<T,push_back_action> append(T & ref_)72 append(T& ref_) 73 { 74 return ref_value_actor<T,push_back_action>(ref_); 75 } 76 77 template<typename T> 78 inline ref_value_actor<T,push_back_action> push_back_a(T & ref_)79 push_back_a(T& ref_) 80 { 81 return ref_value_actor<T,push_back_action>(ref_); 82 } 83 84 template< 85 typename T, 86 typename ValueT 87 > 88 inline ref_const_ref_actor<T,ValueT,push_back_action> push_back_a(T & ref_,ValueT const & value_)89 push_back_a( 90 T& ref_, 91 ValueT const& value_ 92 ) 93 { 94 return ref_const_ref_actor<T,ValueT,push_back_action>(ref_,value_); 95 } 96 97 BOOST_SPIRIT_CLASSIC_NAMESPACE_END 98 99 }} 100 101 #endif 102