1 // Boost.Assign library 2 // 3 // Copyright Thorsten Ottosen 2003-2005. Use, modification and 4 // distribution is subject to the Boost Software License, Version 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 // For more information, see http://www.boost.org/libs/assign/ 9 // 10 11 #ifndef BOOST_ASSIGN_PTR_LIST_INSERTER_HPP 12 #define BOOST_ASSIGN_PTR_LIST_INSERTER_HPP 13 14 #if defined(_MSC_VER) 15 # pragma once 16 #endif 17 18 #include <boost/assign/list_inserter.hpp> 19 #include <boost/type_traits/remove_reference.hpp> 20 #include <boost/type_traits/remove_pointer.hpp> 21 #include <boost/move/utility.hpp> 22 23 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES) 24 25 #include <boost/preprocessor/repetition/enum_binary_params.hpp> 26 #include <boost/preprocessor/repetition/enum_params.hpp> 27 #include <boost/preprocessor/iteration/local.hpp> 28 29 #endif 30 31 namespace boost 32 { 33 34 namespace assign 35 { 36 template< class Function, class Obj > 37 class ptr_list_inserter 38 { 39 typedef BOOST_DEDUCED_TYPENAME 40 remove_pointer< BOOST_DEDUCED_TYPENAME 41 remove_reference<Obj>::type >::type 42 obj_type; 43 public: 44 ptr_list_inserter(Function fun)45 ptr_list_inserter( Function fun ) : insert_( fun ) 46 {} 47 48 template< class Function2, class Obj2 > ptr_list_inserter(const ptr_list_inserter<Function2,Obj2> & r)49 ptr_list_inserter( const ptr_list_inserter<Function2,Obj2>& r ) 50 : insert_( r.fun_private() ) 51 {} 52 ptr_list_inserter(const ptr_list_inserter & r)53 ptr_list_inserter( const ptr_list_inserter& r ) : insert_( r.insert_ ) 54 {} 55 56 57 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES) operator ()()58 ptr_list_inserter& operator()() 59 { 60 insert_( new obj_type() ); 61 return *this; 62 } 63 64 template< class T > operator ()(const T & t)65 ptr_list_inserter& operator()( const T& t ) 66 { 67 insert_( new obj_type(t) ); 68 return *this; 69 } 70 71 #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value 72 #define BOOST_ASSIGN_MAX_PARAMS 5 73 #endif 74 #define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1) 75 #define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class T) 76 #define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& t) 77 #define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, t) 78 79 #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS) 80 #define BOOST_PP_LOCAL_MACRO(n) \ 81 template< class T, BOOST_ASSIGN_PARAMS1(n) > \ 82 ptr_list_inserter& operator()( const T& t, BOOST_ASSIGN_PARAMS2(n) ) \ 83 { \ 84 insert_( new obj_type(t, BOOST_ASSIGN_PARAMS3(n) )); \ 85 return *this; \ 86 } \ 87 /**/ 88 89 #include BOOST_PP_LOCAL_ITERATE() 90 91 #else 92 93 template< class... Ts > operator ()(Ts &&...ts)94 ptr_list_inserter& operator()(Ts&&... ts) 95 { 96 insert_(new obj_type(boost::forward<Ts>(ts)...)); 97 return *this; 98 } 99 100 #endif 101 102 private: 103 104 ptr_list_inserter& operator=( const ptr_list_inserter& ); 105 Function insert_; 106 }; 107 108 template< class Obj, class Function > 109 inline ptr_list_inserter< Function, Obj > make_ptr_list_inserter(Function fun)110 make_ptr_list_inserter( Function fun ) 111 { 112 return ptr_list_inserter< Function, Obj >( fun ); 113 } 114 115 template< class C > 116 inline ptr_list_inserter< assign_detail::call_push_back<C>, 117 BOOST_DEDUCED_TYPENAME C::reference > ptr_push_back(C & c)118 ptr_push_back( C& c ) 119 { 120 return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference> 121 ( assign_detail::call_push_back<C>( c ) ); 122 } 123 124 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 125 126 template< class T, class C > 127 inline ptr_list_inserter< assign_detail::call_push_back<C>, T > ptr_push_back(C & c)128 ptr_push_back( C& c ) 129 { 130 return make_ptr_list_inserter<T>( 131 assign_detail::call_push_back<C>( c ) ); 132 } 133 134 #endif 135 136 template< class C > 137 inline ptr_list_inserter< assign_detail::call_push_front<C>, 138 BOOST_DEDUCED_TYPENAME C::reference > ptr_push_front(C & c)139 ptr_push_front( C& c ) 140 { 141 return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference> 142 ( assign_detail::call_push_front<C>( c ) ); 143 } 144 145 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 146 147 template< class T, class C > 148 inline ptr_list_inserter< assign_detail::call_push_front<C>, T > ptr_push_front(C & c)149 ptr_push_front( C& c ) 150 { 151 return make_ptr_list_inserter<T>( 152 assign_detail::call_push_front<C>( c ) ); 153 } 154 155 #endif 156 157 template< class C > 158 inline ptr_list_inserter< assign_detail::call_insert<C>, 159 BOOST_DEDUCED_TYPENAME C::reference> ptr_insert(C & c)160 ptr_insert( C& c ) 161 { 162 return make_ptr_list_inserter<BOOST_DEDUCED_TYPENAME C::reference> 163 ( assign_detail::call_insert<C>( c ) ); 164 } 165 166 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 167 168 template< class T, class C > 169 inline ptr_list_inserter< assign_detail::call_insert<C>, T > ptr_insert(C & c)170 ptr_insert( C& c ) 171 { 172 return make_ptr_list_inserter<T>( assign_detail::call_insert<C>( c ) ); 173 } 174 175 #endif 176 177 178 } // namespace 'assign' 179 } // namespace 'boost' 180 181 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES) 182 183 #undef BOOST_ASSIGN_PARAMS1 184 #undef BOOST_ASSIGN_PARAMS2 185 #undef BOOST_ASSIGN_PARAMS3 186 #undef BOOST_ASSIGN_MAX_PARAMETERS 187 188 #endif 189 190 #endif 191