container_rebind.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  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)
  6. //
  7. // See http://www.boost.org/libs/container for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP
  11. #define BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP
  12. #ifndef BOOST_CONFIG_HPP
  13. # include <boost/config.hpp>
  14. #endif
  15. #if defined(BOOST_HAS_PRAGMA_ONCE)
  16. # pragma once
  17. #endif
  18. #include <boost/container/allocator_traits.hpp>
  19. namespace boost {
  20. namespace container {
  21. namespace dtl {
  22. template <class Cont, class U>
  23. struct container_rebind;
  24. #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  25. template <template <class, class, class...> class Cont, typename V, typename A, class... An, class U>
  26. struct container_rebind<Cont<V, A, An...>, U>
  27. {
  28. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type;
  29. };
  30. //Needed for non-conforming compilers like GCC 4.3
  31. template <template <class, class> class Cont, typename V, typename A, class U>
  32. struct container_rebind<Cont<V, A>, U>
  33. {
  34. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
  35. };
  36. template <template <class> class Cont, typename V, class U>
  37. struct container_rebind<Cont<V>, U>
  38. {
  39. typedef Cont<U> type;
  40. };
  41. //for small_vector,static_vector
  42. template <template <class, std::size_t, class, class...> class Cont, typename V, std::size_t N, typename A, class... An, class U>
  43. struct container_rebind<Cont<V, N, A, An...>, U>
  44. {
  45. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, An...> type;
  46. };
  47. //Needed for non-conforming compilers like GCC 4.3
  48. template <template <class, std::size_t, class> class Cont, typename V, std::size_t N, typename A, class U>
  49. struct container_rebind<Cont<V, N, A>, U>
  50. {
  51. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
  52. };
  53. template <template <class, std::size_t> class Cont, typename V, std::size_t N, class U>
  54. struct container_rebind<Cont<V, N>, U>
  55. {
  56. typedef Cont<U, N> type;
  57. };
  58. #else //C++03 compilers
  59. template <template <class> class Cont //0arg
  60. , typename V
  61. , class U>
  62. struct container_rebind<Cont<V>, U>
  63. {
  64. typedef Cont<U> type;
  65. };
  66. template <template <class, class> class Cont //0arg
  67. , typename V, typename A
  68. , class U>
  69. struct container_rebind<Cont<V, A>, U>
  70. {
  71. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
  72. };
  73. template <template <class, class, class> class Cont //1arg
  74. , typename V, typename A, class P0
  75. , class U>
  76. struct container_rebind<Cont<V, A, P0>, U>
  77. {
  78. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type;
  79. };
  80. template <template <class, class, class, class> class Cont //2arg
  81. , typename V, typename A, class P0, class P1
  82. , class U>
  83. struct container_rebind<Cont<V, A, P0, P1>, U>
  84. {
  85. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type;
  86. };
  87. template <template <class, class, class, class, class> class Cont //3arg
  88. , typename V, typename A, class P0, class P1, class P2
  89. , class U>
  90. struct container_rebind<Cont<V, A, P0, P1, P2>, U>
  91. {
  92. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type;
  93. };
  94. template <template <class, class, class, class, class, class> class Cont //4arg
  95. , typename V, typename A, class P0, class P1, class P2, class P3
  96. , class U>
  97. struct container_rebind<Cont<V, A, P0, P1, P2, P3>, U>
  98. {
  99. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type;
  100. };
  101. template <template <class, class, class, class, class, class, class> class Cont //5arg
  102. , typename V, typename A, class P0, class P1, class P2, class P3, class P4
  103. , class U>
  104. struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4>, U>
  105. {
  106. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type;
  107. };
  108. template <template <class, class, class, class, class, class, class, class> class Cont //6arg
  109. , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5
  110. , class U>
  111. struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5>, U>
  112. {
  113. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type;
  114. };
  115. template <template <class, class, class, class, class, class, class, class, class> class Cont //7arg
  116. , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6
  117. , class U>
  118. struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6>, U>
  119. {
  120. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type;
  121. };
  122. template <template <class, class, class, class, class, class, class, class, class, class> class Cont //8arg
  123. , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7
  124. , class U>
  125. struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7>, U>
  126. {
  127. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type;
  128. };
  129. template <template <class, class, class, class, class, class, class, class, class, class, class> class Cont //9arg
  130. , typename V, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8
  131. , class U>
  132. struct container_rebind<Cont<V, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U>
  133. {
  134. typedef Cont<U, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type;
  135. };
  136. //For small_vector/static_vector
  137. template <template <class, std::size_t> class Cont //0arg
  138. , typename V, std::size_t N
  139. , class U>
  140. struct container_rebind<Cont<V, N>, U>
  141. {
  142. typedef Cont<U, N> type;
  143. };
  144. template <template <class, std::size_t, class> class Cont //0arg
  145. , typename V, std::size_t N, typename A
  146. , class U>
  147. struct container_rebind<Cont<V, N, A>, U>
  148. {
  149. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type> type;
  150. };
  151. template <template <class, std::size_t, class, class> class Cont //1arg
  152. , typename V, std::size_t N, typename A, class P0
  153. , class U>
  154. struct container_rebind<Cont<V, N, A, P0>, U>
  155. {
  156. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0> type;
  157. };
  158. template <template <class, std::size_t, class, class, class> class Cont //2arg
  159. , typename V, std::size_t N, typename A, class P0, class P1
  160. , class U>
  161. struct container_rebind<Cont<V, N, A, P0, P1>, U>
  162. {
  163. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1> type;
  164. };
  165. template <template <class, std::size_t, class, class, class, class> class Cont //3arg
  166. , typename V, std::size_t N, typename A, class P0, class P1, class P2
  167. , class U>
  168. struct container_rebind<Cont<V, N, A, P0, P1, P2>, U>
  169. {
  170. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2> type;
  171. };
  172. template <template <class, std::size_t, class, class, class, class, class> class Cont //4arg
  173. , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3
  174. , class U>
  175. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3>, U>
  176. {
  177. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3> type;
  178. };
  179. template <template <class, std::size_t, class, class, class, class, class, class> class Cont //5arg
  180. , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4
  181. , class U>
  182. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4>, U>
  183. {
  184. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4> type;
  185. };
  186. template <template <class, std::size_t, class, class, class, class, class, class, class> class Cont //6arg
  187. , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5
  188. , class U>
  189. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5>, U>
  190. {
  191. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5> type;
  192. };
  193. template <template <class, std::size_t, class, class, class, class, class, class, class, class> class Cont //7arg
  194. , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6
  195. , class U>
  196. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6>, U>
  197. {
  198. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6> type;
  199. };
  200. template <template <class, std::size_t, class, class, class, class, class, class, class, class, class> class Cont //8arg
  201. , typename V, std::size_t N, typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7
  202. , class U>
  203. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7>, U>
  204. {
  205. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7> type;
  206. };
  207. template <template <class, std::size_t, class, class, class, class, class, class, class, class, class, class> class Cont //9arg
  208. , 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
  209. , class U>
  210. struct container_rebind<Cont<V, N, A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U>
  211. {
  212. typedef Cont<U, N, typename allocator_traits<A>::template portable_rebind_alloc<U>::type, P0, P1, P2, P3, P4, P5, P6, P7, P8> type;
  213. };
  214. #endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  215. } //namespace dtl {
  216. } //namespace container {
  217. } //namespace boost {
  218. #endif //#ifndef BOOST_CONTAINER_DETAIL_CONTAINER_REBIND_HPP