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_ASSIGN_ACTOR_HPP
9 #define BOOST_SPIRIT_ACTOR_ASSIGN_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     //  A semantic action policy that applies the assignement operator.
22     //  (This doc uses convention available in actors.hpp)
23     //
24     //  Actions (what it does):
25     //      ref = value;
26     //      ref = T(first,last);
27     //      ref = value_ref;
28     //
29     //  Policy name:
30     //      assign_action
31     //
32     //  Policy holder, corresponding helper method:
33     //      ref_value_actor, assign_a( ref );
34     //      ref_const_ref_actor, assign_a( ref, value_ref );
35     //
36     //  () operators: both
37     //
38     //  See also ref_value_actor and ref_const_ref_actor for more details.
39     ///////////////////////////////////////////////////////////////////////////
40     struct assign_action
41     {
42         template<
43             typename T,
44             typename ValueT
45         >
actboost::spirit::assign_action46         void act(T& ref_, ValueT const& value_) const
47         {
48             ref_ = value_;
49         }
50         template<
51             typename T,
52             typename IteratorT
53         >
actboost::spirit::assign_action54         void act(
55             T& ref_,
56             IteratorT const& first_,
57             IteratorT const& last_
58             ) const
59         {
60             typedef T value_type;
61 #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
62             value_type value(first_,last_);
63 #else
64             value_type value;
65             std::copy(first_, last_, std::inserter(value, value.end()));
66 #endif
67             ref_ = value;
68         }
69     };
70 
71     // Deprecated. Please use assign_a
72     template<typename T>
assign(T & ref_)73     inline ref_value_actor<T,assign_action> assign(T& ref_)
74     {
75         return ref_value_actor<T,assign_action>(ref_);
76     }
77 
78     template<typename T>
assign_a(T & ref_)79     inline ref_value_actor<T,assign_action> assign_a(T& ref_)
80     {
81         return ref_value_actor<T,assign_action>(ref_);
82     }
83 
84     template<
85         typename T,
86         typename ValueT
87     >
assign_a(T & ref_,ValueT const & value_)88     inline ref_const_ref_actor<T,ValueT,assign_action> assign_a(
89         T& ref_,
90         ValueT const& value_
91     )
92     {
93         return ref_const_ref_actor<T,ValueT,assign_action>(ref_,value_);
94     }
95 
96 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
97 
98 }}
99 
100 #endif
101