1 // Boost.TypeErasure library
3 // Copyright 2011 Steven Watanabe
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)
11 #if !defined(BOOST_PP_IS_ITERATING)
13 #ifndef BOOST_TYPE_ERASURE_DETAIL_CONSTRUCT_HPP_INCLUDED
14 #define BOOST_TYPE_ERASURE_DETAIL_CONSTRUCT_HPP_INCLUDED
16 #define BOOST_PP_FILENAME_1 <boost/type_erasure/detail/construct.hpp>
17 #define BOOST_PP_ITERATION_LIMITS (1, BOOST_TYPE_ERASURE_MAX_ARITY)
18 #include BOOST_PP_ITERATE()
24 #define N BOOST_PP_ITERATION()
26 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
28 #define BOOST_TYPE_ERASURE_FORWARD_I(z, n, data) ::std::forward<BOOST_PP_CAT(U, n)>(BOOST_PP_CAT(u, n))
29 #define BOOST_TYPE_ERASURE_FORWARD(n) BOOST_PP_ENUM(n, BOOST_TYPE_ERASURE_FORWARD_I, ~)
35 BOOST_PP_ENUM_TRAILING_PARAMS(N, class A)
36 BOOST_PP_ENUM_TRAILING_PARAMS(N, class U)
38 const table_type& _boost_type_erasure_extract_table(
39 ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, A))>*
40 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
42 return *::boost::type_erasure::detail::BOOST_PP_CAT(extract_table, N)(
43 (R(*)(BOOST_PP_ENUM_PARAMS(N, A)))0,
44 BOOST_PP_ENUM_PARAMS(N, u));
47 template<BOOST_PP_ENUM_PARAMS(N, class U)>
48 any(BOOST_PP_ENUM_BINARY_PARAMS(N, U, &&u))
50 _boost_type_erasure_extract_table(
51 false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
52 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
55 data(::boost::type_erasure::call(
56 ::boost::type_erasure::detail::make(
57 false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
58 ), BOOST_TYPE_ERASURE_FORWARD(N))
64 template<BOOST_PP_ENUM_PARAMS(N, class U)>
65 any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
68 ::boost::type_erasure::call(
70 ::boost::type_erasure::detail::make(
71 false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
74 BOOST_TYPE_ERASURE_FORWARD(N)
80 template<BOOST_PP_ENUM_PARAMS(N, class U)>
81 any(binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
84 ::boost::type_erasure::call(
86 ::boost::type_erasure::detail::make(
87 false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
90 BOOST_TYPE_ERASURE_FORWARD(N)
96 template<BOOST_PP_ENUM_PARAMS(N, class U)>
97 any(binding<Concept>&& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &&u))
100 ::boost::type_erasure::call(
102 ::boost::type_erasure::detail::make(
103 false? this->_boost_type_erasure_deduce_constructor(BOOST_TYPE_ERASURE_FORWARD(N)) : 0
106 BOOST_TYPE_ERASURE_FORWARD(N)
111 #undef BOOST_TYPE_ERASURE_FORWARD
112 #undef BOOST_TYPE_ERASURE_FORWARD_I
120 BOOST_PP_ENUM_TRAILING_PARAMS(N, class A)
121 BOOST_PP_ENUM_TRAILING_PARAMS(N, class U)
123 const table_type& _boost_type_erasure_extract_table(
124 ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, A))>*
125 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
127 return *::boost::type_erasure::detail::BOOST_PP_CAT(extract_table, N)(
128 (R(*)(BOOST_PP_ENUM_PARAMS(N, A)))0,
129 BOOST_PP_ENUM_PARAMS(N, u));
132 template<BOOST_PP_ENUM_PARAMS(N, class U)>
133 any(BOOST_PP_ENUM_BINARY_PARAMS(N, const U, &u))
135 _boost_type_erasure_extract_table(
136 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
137 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
140 data(::boost::type_erasure::call(
141 ::boost::type_erasure::detail::make(
142 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
143 ), BOOST_PP_ENUM_PARAMS(N, u))
147 template<BOOST_PP_ENUM_PARAMS(N, class U)>
148 any(BOOST_PP_ENUM_BINARY_PARAMS(N, U, &u))
150 _boost_type_erasure_extract_table(
151 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
152 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
155 data(::boost::type_erasure::call(
156 ::boost::type_erasure::detail::make(
157 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
158 ), BOOST_PP_ENUM_PARAMS(N, u))
164 template<BOOST_PP_ENUM_PARAMS(N, class U)>
165 any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, const U, &u))
166 : table(binding_arg),
168 ::boost::type_erasure::call(
170 ::boost::type_erasure::detail::make(
171 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
173 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
178 template<BOOST_PP_ENUM_PARAMS(N, class U)>
179 any(const binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
180 : table(binding_arg),
182 ::boost::type_erasure::call(
184 ::boost::type_erasure::detail::make(
185 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
187 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)
193 template<BOOST_PP_ENUM_PARAMS(N, class U)>
194 any(binding<Concept>& binding_arg BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, U, &u))
195 : table(binding_arg),
197 ::boost::type_erasure::call(
199 ::boost::type_erasure::detail::make(
200 false? this->_boost_type_erasure_deduce_constructor(BOOST_PP_ENUM_PARAMS(N, u)) : 0
202 BOOST_PP_ENUM_TRAILING_PARAMS(N, u)