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_INSERT_AT_ACTOR_HPP
9 #define BOOST_SPIRIT_ACTOR_INSERT_AT_ACTOR_HPP
10 
11 #include <boost/spirit/home/classic/namespace.hpp>
12 #include <boost/spirit/home/classic/actor/ref_const_ref_value_actor.hpp>
13 #include <boost/spirit/home/classic/actor/ref_const_ref_const_ref_a.hpp>
14 
15 namespace boost { namespace spirit {
16 
17 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
18 
19     ///////////////////////////////////////////////////////////////////////////
20     //  Summary:
21     //  A semantic action policy that insert data into an associative
22     //  container using a const reference to a key.
23     //  (This doc uses convention available in actors.hpp)
24     //
25     //  Actions (what it does):
26     //      ref.insert( T::value_type(key_ref,value) );
27     //      ref.insert( T::value_type(key_ref, T::mapped_type(first,last)));;
28     //      ref.insert( T::value_type(key_ref,value_ref) );
29     //
30     //  Policy name:
31     //      insert_at_action
32     //
33     //  Policy holder, corresponding helper method:
34     //      ref_const_ref_value_actor, insert_at_a( ref, key_ref );
35     //      ref_const_ref_const_ref_actor, insert_a( ref, key_ref, value_ref );
36     //
37     //  () operators: both
38     //
39     //  See also ref_const_ref_value_actor and ref_const_ref_const_ref_actor
40     //  for more details.
41     ///////////////////////////////////////////////////////////////////////////
42     struct insert_at_action
43     {
44         template<
45             typename T,
46             typename ReferentT,
47             typename ValueT
48         >
actboost::spirit::insert_at_action49         void act(
50             T& ref_,
51             ReferentT const& key_,
52             ValueT const& value_
53             ) const
54         {
55             typedef typename T::value_type value_type;
56             ref_.insert( value_type(key_, value_) );
57         }
58 
59         template<
60             typename T,
61             typename ReferentT,
62             typename IteratorT
63         >
actboost::spirit::insert_at_action64         void act(
65             T& ref_,
66             ReferentT const& key_,
67             IteratorT const& first_,
68             IteratorT const& last_
69             ) const
70         {
71             typedef typename T::mapped_type mapped_type;
72             typedef typename T::value_type value_type;
73 
74             mapped_type value(first_,last_);
75             value_type key_value(key_, value);
76             ref_.insert( key_value );
77         }
78     };
79 
80     template<
81         typename T,
82         typename ReferentT
83         >
84     inline ref_const_ref_value_actor<T,ReferentT,insert_at_action>
insert_at_a(T & ref_,ReferentT const & key_)85     insert_at_a(
86             T& ref_,
87             ReferentT const& key_
88         )
89     {
90         return ref_const_ref_value_actor<
91             T,
92             ReferentT,
93             insert_at_action
94             >(ref_,key_);
95     }
96 
97     template<
98         typename T,
99         typename ReferentT,
100         typename ValueT
101     >
102     inline ref_const_ref_const_ref_actor<T,ReferentT,ValueT,insert_at_action>
insert_at_a(T & ref_,ReferentT const & key_,ValueT const & value_)103     insert_at_a(
104                 T& ref_,
105                 ReferentT const& key_,
106                 ValueT const& value_
107             )
108     {
109         return ref_const_ref_const_ref_actor<
110             T,
111             ReferentT,
112             ValueT,
113             insert_at_action
114             >(ref_,key_,value_);
115     }
116 
117 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
118 
119 }}
120 
121 #endif
122