1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2017-2017. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/libs/container for documentation.
9 //////////////////////////////////////////////////////////////////////////////
10 #ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP
11 #define BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP
13 #ifndef BOOST_CONFIG_HPP
14 # include <boost/config.hpp>
17 #if defined(BOOST_HAS_PRAGMA_ONCE)
21 #include <boost/container/allocator_traits.hpp>
26 namespace container_detail {
28 template <class Cont, class U>
29 struct container_rebind;
31 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
33 template <template <class, class, class...> class Cont, typename V, typename A, class... An, class U>
34 struct container_rebind<Cont<V, A, An...>, U>
36 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type;
39 //Needed for non-conforming compilers like GCC 4.3
40 template <template <class, class> class Cont, typename V, typename A, class U>
41 struct container_rebind<Cont<V, A>, U>
43 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
46 template <template <class> class Cont, typename V, class U>
47 struct container_rebind<Cont<V>, U>
52 //for small_vector,static_vector
54 template <template <class, std::size_t, class, class...> class Cont, typename V, std::size_t N, typename A, class... An, class U>
55 struct container_rebind<Cont<V, N, A, An...>, U>
57 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type;
60 //Needed for non-conforming compilers like GCC 4.3
61 template <template <class, std::size_t, class> class Cont, typename V, std::size_t N, typename A, class U>
62 struct container_rebind<Cont<V, N, A>, U>
64 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
67 template <template <class, std::size_t> class Cont, typename V, std::size_t N, class U>
68 struct container_rebind<Cont<V, N>, U>
70 typedef Cont<U, N> type;
73 #else //C++03 compilers
75 template <template <class> class Cont //0arg
78 struct container_rebind<Cont<V>, U>
83 template <template <class, class> class Cont //0arg
84 , typename V, typename A
86 struct container_rebind<Cont<V, A>, U>
88 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
91 template <template <class, class, class> class Cont //1arg
92 , typename V, typename A, class P0
94 struct container_rebind<Cont<V, A, P0>, U>
96 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type;
99 template <template <class, class, class, class> class Cont //2arg
100 , typename V, typename A, class P0, class P1
102 struct container_rebind<Cont<V, A, P0, P1>, U>
104 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type;
107 template <template <class, class, class, class, class> class Cont //3arg
108 , typename V, typename A, class P0, class P1, class P2
110 struct container_rebind<Cont<V, A, P0, P1, P2>, U>
112 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type;
115 template <template <class, class, class, class, class, class> class Cont //4arg
116 , typename V, typename A, class P0, class P1, class P2, class P3
118 struct container_rebind<Cont<V, A, P0, P1, P2, P3>, U>
120 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type;
123 template <template <class, class, class, class, class, class, class> class Cont //5arg
124 , typename V, typename A, class P0, class P1, class P2, class P3, class P4
126 struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4>, U>
128 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type;
131 template <template <class, class, class, class, class, class, class, class> class Cont //6arg
132 , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5
134 struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5>, U>
136 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type;
139 template <template <class, class, class, class, class, class, class, class, class> class Cont //7arg
140 , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6
142 struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6>, U>
144 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type;
147 template <template <class, class, class, class, class, class, class, class, class, class> class Cont //8arg
148 , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7
150 struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7>, U>
152 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type;
155 template <template <class, class, class, class, class, class, class, class, class, class, class> class Cont //9arg
156 , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8
158 struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U>
160 typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type;
163 //For small_vector/static_vector
164 template <template <class, std::size_t> class Cont //0arg
165 , typename V, std::size_t N
167 struct container_rebind<Cont<V, N>, U>
169 typedef Cont<U, N> type;
172 template <template <class, std::size_t, class> class Cont //0arg
173 , typename V, std::size_t N, typename A
175 struct container_rebind<Cont<V, N, A>, U>
177 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
180 template <template <class, std::size_t, class, class> class Cont //1arg
181 , typename V, std::size_t N, typename A, class P0
183 struct container_rebind<Cont<V, N, A, P0>, U>
185 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type;
188 template <template <class, std::size_t, class, class, class> class Cont //2arg
189 , typename V, std::size_t N, typename A, class P0, class P1
191 struct container_rebind<Cont<V, N, A, P0, P1>, U>
193 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type;
196 template <template <class, std::size_t, class, class, class, class> class Cont //3arg
197 , typename V, std::size_t N, typename A, class P0, class P1, class P2
199 struct container_rebind<Cont<V, N, A, P0, P1, P2>, U>
201 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type;
204 template <template <class, std::size_t, class, class, class, class, class> class Cont //4arg
205 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3
207 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3>, U>
209 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type;
212 template <template <class, std::size_t, class, class, class, class, class, class> class Cont //5arg
213 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4
215 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4>, U>
217 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type;
220 template <template <class, std::size_t, class, class, class, class, class, class, class> class Cont //6arg
221 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5
223 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5>, U>
225 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type;
228 template <template <class, std::size_t, class, class, class, class, class, class, class, class> class Cont //7arg
229 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6
231 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6>, U>
233 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type;
236 template <template <class, std::size_t, class, class, class, class, class, class, class, class, class> class Cont //8arg
237 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7
239 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7>, U>
241 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type;
244 template <template <class, std::size_t, class, class, class, class, class, class, class, class, class, class> class Cont //9arg
245 , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8
247 struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U>
249 typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type;
252 #endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
254 } //namespace container_detail {
255 } //namespace container {
256 } //namespace boost {
258 #endif //#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP