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_SWAP_ACTOR_HPP
9 #define BOOST_SPIRIT_ACTOR_SWAP_ACTOR_HPP
10 
11 #include <boost/spirit/home/classic/namespace.hpp>
12 #include <boost/spirit/home/classic/actor/ref_value_actor.hpp>
13 
14 namespace boost { namespace spirit {
15 
16 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
17 
18     ///////////////////////////////////////////////////////////////////////////
19     //  Summary:
20     //  A semantic action policy that swaps values.
21     //  (This doc uses convention available in actors.hpp)
22     //
23     //  Actions (what it does):
24     //      ref.swap( value_ref );
25     //
26     //  Policy name:
27     //      swap_action
28     //
29     //  Policy holder, corresponding helper method:
30     //      ref_value_actor, swap_a( ref );
31     //      ref_const_ref_actor, swap_a( ref, value_ref );
32     //
33     //  () operators: both
34     //
35     //  See also ref_value_actor and ref_const_ref_actor for more details.
36     ///////////////////////////////////////////////////////////////////////////
37     template<
38         typename T
39     >
40     class swap_actor
41     {
42     private:
43         T& ref;
44         T& swap_ref;
45 
46     public:
swap_actor(T & ref_,T & swap_ref_)47         swap_actor(
48             T& ref_,
49             T& swap_ref_)
50             : ref(ref_), swap_ref(swap_ref_)
51         {};
52 
53         template<typename T2>
operator ()(T2 const &) const54         void operator()(T2 const& /*val*/) const
55         {
56             ref.swap(swap_ref);
57         }
58 
59 
60         template<typename IteratorT>
operator ()(IteratorT const &,IteratorT const &) const61         void operator()(
62             IteratorT const& /*first*/,
63             IteratorT const& /*last*/
64             ) const
65         {
66             ref.swap(swap_ref);
67         }
68     };
69 
70     template<
71         typename T
72     >
swap_a(T & ref_,T & swap_ref_)73     inline swap_actor<T> swap_a(
74         T& ref_,
75         T& swap_ref_
76     )
77     {
78         return swap_actor<T>(ref_,swap_ref_);
79     }
80 
81 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
82 
83 }}
84 
85 #endif
86