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_FRONT_ACTOR_HPP 9 #define BOOST_SPIRIT_ACTOR_PUSH_FRONT_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 front 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_front( value ); 28 // ref.push_front( T::value_type(first,last) ); 29 // ref.push_front( value_ref ); 30 // 31 // Policy name: 32 // push_front_action 33 // 34 // Policy holder, corresponding helper method: 35 // ref_value_actor, push_front_a( ref ); 36 // ref_const_ref_actor, push_front_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_front_action 43 { 44 template< 45 typename T, 46 typename ValueT 47 > actboost::spirit::push_front_action48 void act(T& ref_, ValueT const& value_) const 49 { 50 ref_.push_front( value_ ); 51 } 52 template< 53 typename T, 54 typename IteratorT 55 > actboost::spirit::push_front_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_front( value ); 66 } 67 }; 68 69 template<typename T> push_front_a(T & ref_)70 inline ref_value_actor<T,push_front_action> push_front_a(T& ref_) 71 { 72 return ref_value_actor<T,push_front_action>(ref_); 73 } 74 75 template< 76 typename T, 77 typename ValueT 78 > push_front_a(T & ref_,ValueT const & value_)79 inline ref_const_ref_actor<T,ValueT,push_front_action> push_front_a( 80 T& ref_, 81 ValueT const& value_ 82 ) 83 { 84 return ref_const_ref_actor<T,ValueT,push_front_action>(ref_,value_); 85 } 86 87 BOOST_SPIRIT_CLASSIC_NAMESPACE_END 88 89 }} 90 91 #endif 92