construct.hpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Boost.TypeErasure library
  2. //
  3. // Copyright 2011 Steven Watanabe
  4. //
  5. // Distributed under the Boost Software License Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // $Id$
  10. #if !defined(BOOST_PP_IS_ITERATING)
  11. #ifndef BOOST_TYPE_ERASURE_DETAIL_CONSTRUCT_HPP_INCLUDED
  12. #define BOOST_TYPE_ERASURE_DETAIL_CONSTRUCT_HPP_INCLUDED
  13. #define BOOST_PP_FILENAME_1 <boost/type_erasure/detail/construct.hpp>
  14. #define BOOST_PP_ITERATION_LIMITS (1, BOOST_TYPE_ERASURE_MAX_ARITY)
  15. #include BOOST_PP_ITERATE()
  16. #endif
  17. #else
  18. #define N BOOST_PP_ITERATION()
  19. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  20. #define BOOST_TYPE_ERASURE_FORWARD_I(z, n, data) ::std::forward<BOOST_PP_CAT(U, n)>(BOOST_PP_CAT(u, n))
  21. #define BOOST_TYPE_ERASURE_FORWARD(n) BOOST_PP_ENUM(n, BOOST_TYPE_ERASURE_FORWARD_I, ~)
  22. #if N > 1
  23. template<
  24. class R
  25. BOOST_PP_ENUM_TRAILING_PARAMS(N, class A)
  26. BOOST_PP_ENUM_TRAILING_PARAMS(N, class U)
  27. >
  28. const table_type& _boost_type_erasure_extract_table(
  29. ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, A))>*
  30. BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
  31. {
  32. return *::boost::type_erasure::detail::BOOST_PP_CAT(extract_table, N)(
  33. (R(*)(BOOST_PP_ENUM_PARAMS(N, A)))0,
  34. BOOST_PP_ENUM_PARAMS(N, u));
  35. }
  36. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  37. any(BOOST_PP_ENUM_BINARY_PARAMS(N, U, &&u))
  38. : table(
  39. _boost_type_erasure_extract_table(
  40. false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
  41. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  42. )
  43. ),
  44. data(::boost::type_erasure::call(
  45. ::boost::type_erasure::detail::make(
  46. false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
  47. ), BOOST_TYPE_ERASURE_FORWARD(N))
  48. )
  49. {}
  50. #endif
  51. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  52. any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
  53. : table(binding_arg),
  54. data(
  55. ::boost::type_erasure::call(
  56. binding_arg,
  57. ::boost::type_erasure::detail::make(
  58. false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
  59. )
  60. BOOST_PP_COMMA_IF(N)
  61. BOOST_TYPE_ERASURE_FORWARD(N)
  62. )
  63. )
  64. {}
  65. // disambiguate
  66. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  67. any(binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
  68. : table(binding_arg),
  69. data(
  70. ::boost::type_erasure::call(
  71. binding_arg,
  72. ::boost::type_erasure::detail::make(
  73. false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
  74. )
  75. BOOST_PP_COMMA_IF(N)
  76. BOOST_TYPE_ERASURE_FORWARD(N)
  77. )
  78. )
  79. {}
  80. // disambiguate
  81. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  82. any(binding<Concept>&& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
  83. : table(binding_arg),
  84. data(
  85. ::boost::type_erasure::call(
  86. binding_arg,
  87. ::boost::type_erasure::detail::make(
  88. false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
  89. )
  90. BOOST_PP_COMMA_IF(N)
  91. BOOST_TYPE_ERASURE_FORWARD(N)
  92. )
  93. )
  94. {}
  95. #undef BOOST_TYPE_ERASURE_FORWARD
  96. #undef BOOST_TYPE_ERASURE_FORWARD_I
  97. #else
  98. #if N > 1
  99. template<
  100. class R
  101. BOOST_PP_ENUM_TRAILING_PARAMS(N, class A)
  102. BOOST_PP_ENUM_TRAILING_PARAMS(N, class U)
  103. >
  104. const table_type& _boost_type_erasure_extract_table(
  105. ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, A))>*
  106. BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
  107. {
  108. return *::boost::type_erasure::detail::BOOST_PP_CAT(extract_table, N)(
  109. (R(*)(BOOST_PP_ENUM_PARAMS(N, A)))0,
  110. BOOST_PP_ENUM_PARAMS(N, u));
  111. }
  112. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  113. any(BOOST_PP_ENUM_BINARY_PARAMS(N, const U, &u))
  114. : table(
  115. _boost_type_erasure_extract_table(
  116. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  117. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  118. )
  119. ),
  120. data(::boost::type_erasure::call(
  121. ::boost::type_erasure::detail::make(
  122. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  123. ), BOOST_PP_ENUM_PARAMS(N, u))
  124. )
  125. {}
  126. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  127. any(BOOST_PP_ENUM_BINARY_PARAMS(N, U, &u))
  128. : table(
  129. _boost_type_erasure_extract_table(
  130. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  131. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  132. )
  133. ),
  134. data(::boost::type_erasure::call(
  135. ::boost::type_erasure::detail::make(
  136. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  137. ), BOOST_PP_ENUM_PARAMS(N, u))
  138. )
  139. {}
  140. #endif
  141. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  142. any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, const U, &u))
  143. : table(binding_arg),
  144. data(
  145. ::boost::type_erasure::call(
  146. binding_arg,
  147. ::boost::type_erasure::detail::make(
  148. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  149. )
  150. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  151. )
  152. )
  153. {}
  154. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  155. any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
  156. : table(binding_arg),
  157. data(
  158. ::boost::type_erasure::call(
  159. binding_arg,
  160. ::boost::type_erasure::detail::make(
  161. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  162. )
  163. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  164. )
  165. )
  166. {}
  167. // disambiguate
  168. template<BOOST_PP_ENUM_PARAMS(N, class U)>
  169. any(binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
  170. : table(binding_arg),
  171. data(
  172. ::boost::type_erasure::call(
  173. binding_arg,
  174. ::boost::type_erasure::detail::make(
  175. false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
  176. )
  177. BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
  178. )
  179. )
  180. {}
  181. #endif
  182. #undef N
  183. #endif