@@ -323,7 +323,29 @@ namespace aux
323323 Def, Specs*, End, End, Invoker*)
324324 {}
325325
326- template <class Class , class Options = int >
326+ struct not_specified {};
327+
328+ template <class CallPolicies >
329+ struct call_policies_as_options
330+ {
331+ call_policies_as_options (CallPolicies const & call_policies)
332+ : call_policies(call_policies)
333+ {}
334+
335+ CallPolicies const & policies () const
336+ {
337+ return call_policies;
338+ }
339+
340+ char const * doc () const
341+ {
342+ return 0 ;
343+ }
344+
345+ CallPolicies call_policies;
346+ };
347+
348+ template <class Class , class Options = not_specified>
327349 struct def_class
328350 {
329351 def_class (Class& cl, char const * name, Options options = Options())
@@ -351,7 +373,7 @@ namespace aux
351373 }
352374
353375 template <class F , class Keywords >
354- void def (F f, Keywords const & keywords, int const *) const
376+ void def (F f, Keywords const & keywords, not_specified const *) const
355377 {
356378 cl.def (name, f, keywords);
357379 }
@@ -373,19 +395,20 @@ namespace aux
373395 Options options;
374396 };
375397
376- template <class Class >
398+ template <class Class , class CallPolicies = boost::python::default_call_policies >
377399 struct def_init
378400 {
379- def_init (Class& cl)
401+ def_init (Class& cl, CallPolicies call_policies = CallPolicies() )
380402 : cl(cl)
403+ , call_policies(call_policies)
381404 {}
382405
383406 template <class F >
384407 void operator ()(F f) const
385408 {
386409 cl.def (
387410 " __init__"
388- , boost::python::make_constructor (f)
411+ , boost::python::make_constructor (f, call_policies )
389412 );
390413 }
391414
@@ -394,13 +417,12 @@ namespace aux
394417 {
395418 cl.def (
396419 " __init__"
397- , boost::python::make_constructor (
398- f, boost::python::default_call_policies (), keywords
399- )
420+ , boost::python::make_constructor (f, call_policies, keywords)
400421 );
401422 }
402423
403424 Class& cl;
425+ CallPolicies call_policies;
404426 };
405427
406428 struct def_function
@@ -555,15 +577,26 @@ namespace aux
555577
556578} // namespace aux
557579
558- template <class Signature >
580+ template <class ParameterSpecs , class CallPolicies = boost::python::default_call_policies >
559581struct init
560- : boost::python::def_visitor<init<Signature > >
582+ : boost::python::def_visitor<init<ParameterSpecs, CallPolicies > >
561583{
584+ init (CallPolicies call_policies = CallPolicies())
585+ : call_policies(call_policies)
586+ {}
587+
588+ template <class CallPolicies1 >
589+ init<ParameterSpecs, CallPolicies1>
590+ operator [](CallPolicies1 const & call_policies) const
591+ {
592+ return init<ParameterSpecs, CallPolicies1>(call_policies);
593+ }
594+
562595 template <class Class >
563596 void visit (Class& cl) const
564597 {
565598 typedef typename mpl::transform<
566- Signature
599+ ParameterSpecs
567600 , aux::make_kw_spec<mpl::_>
568601 , mpl::back_inserter<mpl::vector0<> >
569602 >::type arg_specs;
@@ -576,30 +609,43 @@ struct init
576609 typedef typename mpl::shift_left<mpl::long_<1 >, optional_arity>::type upper;
577610
578611 aux::def_combinations (
579- aux::def_init<Class>(cl)
612+ aux::def_init<Class, CallPolicies >(cl, call_policies )
580613 , (arg_specs*)0
581614 , mpl::long_<0 >()
582615 , mpl::long_<upper::value>()
583616 , (aux::make_init_invoker<typename Class::wrapped_type>*)0
584617 );
585618 }
619+
620+ CallPolicies call_policies;
586621};
587622
588- template <class Signature >
623+ template <class ParameterSpecs , class CallPolicies = boost::python::default_call_policies >
589624struct call
590- : boost::python::def_visitor<call<Signature > >
625+ : boost::python::def_visitor<call<ParameterSpecs, CallPolicies > >
591626{
627+ call (CallPolicies const & call_policies = CallPolicies())
628+ : call_policies(call_policies)
629+ {}
630+
631+ template <class CallPolicies1 >
632+ call<ParameterSpecs, CallPolicies1>
633+ operator [](CallPolicies1 const & call_policies) const
634+ {
635+ return call<ParameterSpecs, CallPolicies1>(call_policies);
636+ }
637+
592638 template <class Class >
593639 void visit (Class& cl) const
594640 {
595641 typedef mpl::iterator_range<
596642 typename mpl::next<
597- typename mpl::begin<Signature >::type
643+ typename mpl::begin<ParameterSpecs >::type
598644 >::type
599- , typename mpl::end<Signature >::type
645+ , typename mpl::end<ParameterSpecs >::type
600646 > arg_types;
601647
602- typedef typename mpl::front<Signature >::type result_type;
648+ typedef typename mpl::front<ParameterSpecs >::type result_type;
603649
604650 typedef typename mpl::transform<
605651 arg_types
@@ -614,31 +660,35 @@ struct call
614660
615661 typedef typename mpl::shift_left<mpl::long_<1 >, optional_arity>::type upper;
616662
663+ typedef aux::call_policies_as_options<CallPolicies> options;
664+
617665 aux::def_combinations (
618- aux::def_class<Class>(cl, " __call__" )
666+ aux::def_class<Class, options >(cl, " __call__" , options (call_policies) )
619667 , (arg_specs*)0
620668 , mpl::long_<0 >()
621669 , mpl::long_<upper::value>()
622670 , (aux::make_call_invoker<typename Class::wrapped_type, result_type>*)0
623671 );
624672 }
673+
674+ CallPolicies call_policies;
625675};
626676
627- template <class Fwd , class Signature >
677+ template <class Fwd , class ParameterSpecs >
628678struct function
629- : boost::python::def_visitor<function<Fwd, Signature > >
679+ : boost::python::def_visitor<function<Fwd, ParameterSpecs > >
630680{
631681 template <class Class , class Options >
632682 void visit (Class& cl, char const * name, Options const & options) const
633683 {
634684 typedef mpl::iterator_range<
635685 typename mpl::next<
636- typename mpl::begin<Signature >::type
686+ typename mpl::begin<ParameterSpecs >::type
637687 >::type
638- , typename mpl::end<Signature >::type
688+ , typename mpl::end<ParameterSpecs >::type
639689 > arg_types;
640690
641- typedef typename mpl::front<Signature >::type result_type;
691+ typedef typename mpl::front<ParameterSpecs >::type result_type;
642692
643693 typedef typename mpl::transform<
644694 arg_types
0 commit comments