CodeMover prototype
[dyninst.git] / external / boost / assign / ptr_map_inserter.hpp
1 // Boost.Assign library\r
2 //\r
3 //  Copyright Thorsten Ottosen 2006. Use, modification and\r
4 //  distribution is subject to the Boost Software License, Version\r
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at\r
6 //  http://www.boost.org/LICENSE_1_0.txt)\r
7 //\r
8 // For more information, see http://www.boost.org/libs/assign/\r
9 //\r
10 \r
11 #ifndef BOOST_ASSIGN_PTR_CONTAINER_PTR_MAP_INSERTER_HPP\r
12 #define BOOST_ASSIGN_PTR_CONTAINER_PTR_MAP_INSERTER_HPP\r
13 \r
14 #if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
15 # pragma once\r
16 #endif\r
17 \r
18 #include <boost/assign/list_inserter.hpp>\r
19 #include <boost/type_traits/remove_reference.hpp>\r
20 #include <boost/type_traits/remove_pointer.hpp>\r
21 \r
22 namespace boost\r
23 {\r
24 \r
25 namespace assign\r
26 {\r
27     template< class PtrMap, class Obj > \r
28     class ptr_map_inserter\r
29     {\r
30         typedef BOOST_DEDUCED_TYPENAME\r
31                 remove_pointer< BOOST_DEDUCED_TYPENAME \r
32                        remove_reference<Obj>::type >::type\r
33            obj_type;\r
34         typedef BOOST_DEDUCED_TYPENAME PtrMap::key_type\r
35            key_type;\r
36         \r
37     public:\r
38         \r
39         ptr_map_inserter( PtrMap& m ) : m_( m )\r
40         {}\r
41         \r
42         template< class Key >\r
43         ptr_map_inserter& operator()( const Key& t )\r
44         {\r
45             key_type k(t);\r
46             m_.insert( k, new obj_type );\r
47             return *this;\r
48         }\r
49 \r
50 #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value\r
51 #define BOOST_ASSIGN_MAX_PARAMS 6        \r
52 #endif\r
53 #define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1)\r
54 #define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class T)\r
55 #define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& t)\r
56 #define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, t)\r
57         \r
58 #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)\r
59 #define BOOST_PP_LOCAL_MACRO(n) \\r
60     template< class T, BOOST_ASSIGN_PARAMS1(n) > \\r
61     ptr_map_inserter& operator()( const T& t, BOOST_ASSIGN_PARAMS2(n) ) \\r
62     { \\r
63         key_type k(t); \\r
64         m_.insert( k, new obj_type( BOOST_ASSIGN_PARAMS3(n) ) ); \\r
65         return *this; \\r
66     } \\r
67     /**/\r
68         \r
69 #include BOOST_PP_LOCAL_ITERATE()\r
70 \r
71     private:\r
72 \r
73         ptr_map_inserter& operator=( const ptr_map_inserter& );\r
74         PtrMap& m_;\r
75     };\r
76     \r
77     template< class PtrMap >\r
78     inline ptr_map_inserter< PtrMap, typename PtrMap::mapped_reference >\r
79     ptr_map_insert( PtrMap& m )\r
80     {\r
81         return ptr_map_inserter< PtrMap, typename PtrMap::mapped_reference >( m );\r
82     }\r
83 \r
84 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\r
85 \r
86     template< class T, class PtrMap >\r
87     inline ptr_map_inserter< PtrMap, T >\r
88     ptr_map_insert( PtrMap& m )\r
89     {\r
90         return ptr_map_inserter< PtrMap, T >( m );\r
91     }\r
92 \r
93 #endif\r
94      \r
95 } // namespace 'assign'\r
96 } // namespace 'boost'\r
97 \r
98 #undef BOOST_ASSIGN_PARAMS1\r
99 #undef BOOST_ASSIGN_PARAMS2\r
100 #undef BOOST_ASSIGN_PARAMS3\r
101 #undef BOOST_ASSIGN_MAX_PARAMETERS\r
102 \r
103 #endif\r