Fixes for VS 2008
[dyninst.git] / external / boost / assign / ptr_list_inserter.hpp
1 // Boost.Assign library\r
2 //\r
3 //  Copyright Thorsten Ottosen 2003-2005. 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_LIST_INSERTER_HPP\r
12 #define BOOST_ASSIGN_PTR_LIST_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 Function, class Obj > \r
28     class ptr_list_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     public:\r
35         \r
36         ptr_list_inserter( Function fun ) : insert_( fun )\r
37         {}\r
38         \r
39         template< class Function2, class Obj2 >\r
40         ptr_list_inserter( const ptr_list_inserter<Function2,Obj2>& r ) \r
41         : insert_( r.fun_private() ) \r
42         {}\r
43 \r
44         ptr_list_inserter( const ptr_list_inserter& r ) : insert_( r.insert_ )\r
45         {}\r
46 \r
47         ptr_list_inserter& operator()()\r
48         {\r
49             insert_( new obj_type() );\r
50             return *this;\r
51         }\r
52         \r
53         template< class T >\r
54         ptr_list_inserter& operator()( const T& t )\r
55         {\r
56             insert_( new obj_type(t) );\r
57             return *this;\r
58         }\r
59 \r
60 #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value\r
61 #define BOOST_ASSIGN_MAX_PARAMS 5        \r
62 #endif\r
63 #define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1)\r
64 #define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class T)\r
65 #define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& t)\r
66 #define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, t)\r
67         \r
68 #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)\r
69 #define BOOST_PP_LOCAL_MACRO(n) \\r
70     template< class T, BOOST_ASSIGN_PARAMS1(n) > \\r
71     ptr_list_inserter& operator()( const T& t, BOOST_ASSIGN_PARAMS2(n) ) \\r
72     { \\r
73         insert_( new obj_type(t, BOOST_ASSIGN_PARAMS3(n) )); \\r
74         return *this; \\r
75     } \\r
76     /**/\r
77         \r
78 #include BOOST_PP_LOCAL_ITERATE()\r
79 \r
80     private:\r
81         \r
82         ptr_list_inserter& operator=( const ptr_list_inserter& );\r
83         Function insert_;\r
84     };\r
85     \r
86     template< class Obj, class Function >\r
87     inline ptr_list_inserter< Function, Obj >\r
88     make_ptr_list_inserter( Function fun )\r
89     {\r
90         return ptr_list_inserter< Function, Obj >( fun );\r
91     }\r
92     \r
93     template< class C >\r
94     inline ptr_list_inserter< assign_detail::call_push_back<C>, \r
95                               BOOST_DEDUCED_TYPENAME C::reference >\r
96     ptr_push_back( C& c )\r
97     {\r
98         return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference>\r
99                    ( assign_detail::call_push_back<C>( c ) ); \r
100     }\r
101 \r
102 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\r
103 \r
104     template< class T, class C >\r
105     inline ptr_list_inserter< assign_detail::call_push_back<C>, T >\r
106     ptr_push_back( C& c )\r
107     {\r
108         return make_ptr_list_inserter<T>( \r
109                     assign_detail::call_push_back<C>( c ) );\r
110     }\r
111 \r
112 #endif\r
113     \r
114     template< class C >\r
115     inline ptr_list_inserter< assign_detail::call_push_front<C>,\r
116                               BOOST_DEDUCED_TYPENAME C::reference >\r
117     ptr_push_front( C& c )\r
118     {\r
119         return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference>\r
120                  ( assign_detail::call_push_front<C>( c ) );\r
121     }\r
122 \r
123 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\r
124 \r
125     template< class T, class C >\r
126     inline ptr_list_inserter< assign_detail::call_push_front<C>, T >\r
127     ptr_push_front( C& c )\r
128     {\r
129         return make_ptr_list_inserter<T>( \r
130                     assign_detail::call_push_front<C>( c ) );\r
131     }\r
132 \r
133 #endif\r
134     \r
135     template< class C >\r
136     inline ptr_list_inserter< assign_detail::call_insert<C>, \r
137                           BOOST_DEDUCED_TYPENAME C::reference>\r
138     ptr_insert( C& c )\r
139     {\r
140         return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference>\r
141                     ( assign_detail::call_insert<C>( c ) );\r
142     }\r
143 \r
144 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\r
145 \r
146     template< class T, class C >\r
147     inline ptr_list_inserter< assign_detail::call_insert<C>, T >\r
148     ptr_insert( C& c )\r
149     {\r
150         return make_ptr_list_inserter<T>( assign_detail::call_insert<C>( c ) );\r
151     }\r
152 \r
153 #endif\r
154     \r
155     \r
156 } // namespace 'assign'\r
157 } // namespace 'boost'\r
158 \r
159 #undef BOOST_ASSIGN_PARAMS1\r
160 #undef BOOST_ASSIGN_PARAMS2\r
161 #undef BOOST_ASSIGN_PARAMS3\r
162 #undef BOOST_ASSIGN_MAX_PARAMETERS\r
163 \r
164 #endif\r