Skip to content

Commit edb5b45

Browse files
Daniel Wallinpdimov
authored andcommitted
Added support for CallPolicies.
[SVN r34475]
1 parent e52def6 commit edb5b45

1 file changed

Lines changed: 73 additions & 23 deletions

File tree

include/boost/parameter/python.hpp

Lines changed: 73 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
559581
struct 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>
589624
struct 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>
628678
struct 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

Comments
 (0)