3636
3737// /////////////////////////////////////////////////////////////////////////////
3838#define BOOST_PYTHON_TEMPLATE_TYPES_WITH_DEFAULT \
39- BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT ( \
39+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT \
40+ ( \
4041 BOOST_PYTHON_MAX_ARITY, \
4142 class T , \
42- mpl::void_) \
43+ mpl::void_ \
44+ ) \
4345
4446#define BOOST_PYTHON_TEMPLATE_TYPES \
45- BOOST_PP_ENUM_PARAMS ( \
47+ BOOST_PP_ENUM_PARAMS \
48+ ( \
4649 BOOST_PYTHON_MAX_ARITY, \
47- class T ) \
50+ class T \
51+ ) \
4852
4953#define BOOST_PYTHON_TEMPLATE_ARGS \
50- BOOST_PP_ENUM_PARAMS ( \
54+ BOOST_PP_ENUM_PARAMS \
55+ ( \
5156 BOOST_PYTHON_MAX_ARITY, \
52- T) \
57+ T \
58+ ) \
5359
5460// /////////////////////////////////////////////////////////////////////////////
5561namespace boost { namespace python {
@@ -88,7 +94,7 @@ namespace detail {
8894 bool , value =
8995 sizeof (f(t())) == sizeof (::boost::type_traits::yes_type));
9096 typedef mpl::bool_c<value> type;
91-
97+
9298 BOOST_MPL_AUX_LAMBDA_SUPPORT (1 ,is_optional,(T)) // needed for MSVC & Borland
9399 };
94100
@@ -117,62 +123,16 @@ namespace detail {
117123
118124} // namespace detail
119125
120- template <class DerivedT >
121- struct init_base {
122-
123- DerivedT const & derived () const
124- { return *static_cast <DerivedT const *>(this ); }
125- };
126-
127- template <class CallPoliciesT , class InitT >
128- struct init_with_call_policies
129- : public init_base<init_with_call_policies<CallPoliciesT, InitT> >
130- {
131- BOOST_STATIC_CONSTANT (int , n_arguments = InitT::n_arguments);
132- BOOST_STATIC_CONSTANT (int , n_defaults = InitT::n_defaults);
133-
134- typedef typename InitT::reversed_args reversed_args;
135-
136- init_with_call_policies (CallPoliciesT const & policies_, char const * doc_)
137- : policies(policies_), doc(doc_) {}
138-
139- char const * doc_string () const
140- { return doc; }
141-
142- CallPoliciesT
143- call_policies () const
144- { return policies; }
145-
146- CallPoliciesT policies;
147- char const * doc;
148- };
149126
150127template <BOOST_PYTHON_TEMPLATE_TYPES>
151- struct init : public init_base <init< BOOST_PYTHON_TEMPLATE_ARGS> >
128+ struct init // : detail::check_init_params< BOOST_PYTHON_TEMPLATE_ARGS>
152129{
153- typedef init<BOOST_PYTHON_TEMPLATE_ARGS> self_t ;
154-
155- init (char const * doc_ = 0 )
156- : doc(doc_) {}
157-
158- char const * doc_string () const
159- { return doc; }
160-
161- default_call_policies
162- call_policies () const
163- { return default_call_policies (); }
164-
165- template <class CallPoliciesT >
166- init_with_call_policies<CallPoliciesT, self_t >
167- operator [](CallPoliciesT const & policies) const
168- { return init_with_call_policies<CallPoliciesT, self_t >(policies, doc); }
169-
170130 typedef detail::type_list<BOOST_PYTHON_TEMPLATE_ARGS> signature_;
171131 typedef typename mpl::end<signature_>::type finish;
172132
173133 // Find the optional<> element, if any
174134 typedef typename mpl::find_if<
175- signature_, detail::is_optional<mpl::_1 >
135+ signature_, detail::is_optional<mpl::_ >
176136 >::type opt;
177137
178138
@@ -183,7 +143,7 @@ struct init : public init_base<init<BOOST_PYTHON_TEMPLATE_ARGS> >
183143 , mpl::next<opt>
184144 >::type expected_finish;
185145 BOOST_STATIC_ASSERT ((is_same<expected_finish, finish>::value));
186-
146+
187147 typedef typename mpl::apply_if<
188148 is_same<opt,finish>
189149 , mpl::list0<>
@@ -213,36 +173,6 @@ struct init : public init_base<init<BOOST_PYTHON_TEMPLATE_ARGS> >
213173
214174 // Count the maximum number of arguments
215175 BOOST_STATIC_CONSTANT (int , n_arguments = mpl::size<reversed_args>::value);
216-
217- char const * doc;
218- };
219-
220- template <> // specialization for zero args
221- struct init <> : public init_base<init<> >
222- {
223- typedef init<> self_t ;
224-
225- init (char const * doc_ = 0 )
226- : doc(doc_) {}
227-
228- char const * doc_string () const
229- { return doc; }
230-
231- default_call_policies
232- call_policies () const
233- { return default_call_policies (); }
234-
235- template <class CallPoliciesT >
236- init_with_call_policies<CallPoliciesT, self_t >
237- operator [](CallPoliciesT const & policies) const
238- { return init_with_call_policies<CallPoliciesT, self_t >(policies, doc); }
239-
240- BOOST_STATIC_CONSTANT (int , n_defaults = 0 );
241- BOOST_STATIC_CONSTANT (int , n_arguments = 0 );
242-
243- typedef detail::type_list<> reversed_args;
244-
245- char const * doc;
246176};
247177
248178// /////////////////////////////////////////////////////////////////////////////
@@ -268,10 +198,10 @@ namespace detail
268198 , mpl::list0<>
269199 , mpl::push_front<>
270200 >::type args;
271-
201+
272202 cl.def_init (args (), policies, doc);
273203 }
274-
204+
275205 // /////////////////////////////////////////////////////////////////////////////
276206 //
277207 // define_class_init_helper<N>::apply
@@ -339,13 +269,12 @@ namespace detail
339269// __init__(int)
340270//
341271// /////////////////////////////////////////////////////////////////////////////
342- template <class ClassT , class InitT >
272+ template <class ClassT , class CallPoliciesT , class InitT >
343273void
344- define_init (ClassT& cl, InitT const & i)
274+ define_init (ClassT& cl, InitT const & i, CallPoliciesT const & policies, char const * doc )
345275{
346276 typedef typename InitT::reversed_args reversed_args;
347- detail::define_class_init_helper<InitT::n_defaults>::apply (
348- cl, i.call_policies (), reversed_args (), i.doc_string ());
277+ detail::define_class_init_helper<InitT::n_defaults>::apply (cl, policies, reversed_args (), doc);
349278}
350279
351280}} // namespace boost::python
0 commit comments