Skip to content

Commit 7ecd7e8

Browse files
committed
Cleaned up internals and generalized detail::target()
[SVN r13998]
1 parent 49c2dbd commit 7ecd7e8

File tree

4 files changed

+436
-85
lines changed

4 files changed

+436
-85
lines changed

include/boost/python/detail/target.hpp

Lines changed: 23 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,87 +3,36 @@
33
// copyright notice appears in all copies. This software is provided
44
// "as is" without express or implied warranty, and with no claim as
55
// to its suitability for any purpose.
6-
#ifndef TARGET_DWA2002513_HPP
7-
# define TARGET_DWA2002513_HPP
8-
6+
#ifndef TARGET_DWA2002521_HPP
7+
# define TARGET_DWA2002521_HPP
8+
9+
# include <boost/python/detail/preprocessor.hpp>
10+
# include <boost/preprocessor/comma_if.hpp>
11+
# include <boost/mpl/aux_/preprocessor.hpp>
12+
# include <boost/preprocessor/comma_if.hpp>
13+
# include <boost/preprocessor/if.hpp>
914
# include <boost/type.hpp>
1015

11-
namespace boost { namespace python { namespace detail {
12-
13-
//
14-
// target(x) - deduce the type of the first argument when bind(x) is
15-
// invoked.
16-
//
17-
18-
// functions
19-
template <class Target, class R>
20-
boost::type<Target>* target(R (*)(Target)) { return 0; }
21-
22-
template <class Target, class R, class A1>
23-
boost::type<Target>* target(R (*)(Target, A1)) { return 0; }
24-
25-
template <class Target, class R, class A1, class A2>
26-
boost::type<Target>* target(R (*)(Target, A1, A2)) { return 0; }
27-
28-
template <class Target, class R, class A1, class A2, class A3>
29-
boost::type<Target>* target(R (*)(Target, A1, A2, A3)) { return 0; }
30-
31-
// data member pointers
32-
template <class Target, class R>
33-
boost::type<Target&>* target(R (Target::*)) { return 0; }
34-
35-
// member Functions
36-
template <class Target, class R>
37-
boost::type<Target&>* target(R (Target::*)()) { return 0; }
38-
39-
template <class Target, class R, class A1>
40-
boost::type<Target&>* target(R (Target::*)(A1)) { return 0; }
41-
42-
template <class Target, class R, class A1, class A2>
43-
boost::type<Target&>* target(R (Target::*)(A1,A2)) { return 0; }
44-
45-
template <class Target, class R, class A1, class A2, class A3>
46-
boost::type<Target&>* target(R (Target::*)(A1,A2,A3)) { return 0; }
47-
48-
// const member functions
49-
template <class Target, class R>
50-
boost::type<Target const&>* target(R (Target::*)() const) { return 0; }
51-
52-
template <class Target, class R, class A1>
53-
boost::type<Target const&>* target(R (Target::*)(A1) const) { return 0; }
54-
55-
template <class Target, class R, class A1, class A2>
56-
boost::type<Target const&>* target(R (Target::*)(A1,A2) const) { return 0; }
57-
58-
template <class Target, class R, class A1, class A2, class A3>
59-
boost::type<Target const&>* target(R (Target::*)(A1,A2,A3) const) { return 0; }
60-
61-
// volatile member functions
62-
template <class Target, class R>
63-
boost::type<Target volatile&>* target(R (Target::*)() volatile) { return 0; }
64-
65-
template <class Target, class R, class A1>
66-
boost::type<Target volatile&>* target(R (Target::*)(A1) volatile) { return 0; }
67-
68-
template <class Target, class R, class A1, class A2>
69-
boost::type<Target volatile&>* target(R (Target::*)(A1,A2) volatile) { return 0; }
16+
namespace boost { namespace python { namespace detail {
7017

71-
template <class Target, class R, class A1, class A2, class A3>
72-
boost::type<Target volatile&>* target(R (Target::*)(A1,A2,A3) volatile) { return 0; }
18+
# ifndef BOOST_PYTHON_GENERATE_CODE
19+
# include <boost/python/preprocessed/target.hpp>
20+
# endif
7321

74-
// const volatile member functions
75-
template <class Target, class R>
76-
boost::type<Target const volatile&>* target(R (Target::*)() const volatile) { return 0; }
22+
# define BOOST_PYTHON_FIRST_ARGUMENT_PF(args, ignored) \
23+
template <class R BOOST_PP_COMMA_IF(args) BOOST_MPL_TEMPLATE_PARAMETERS(0, args, class A)> \
24+
boost::type<BOOST_PP_IF(args, A0, void)>* target(BOOST_PYTHON_FN(*,0,args)) { return 0; }
7725

78-
template <class Target, class R, class A1>
79-
boost::type<Target const volatile&>* target(R (Target::*)(A1) const volatile) { return 0; }
26+
# define BOOST_PYTHON_FIRST_ARGUMENT_PMF(args, cv) \
27+
template <class R, BOOST_MPL_TEMPLATE_PARAMETERS(0, args, class A)> \
28+
boost::type<A0 cv()*>* target(BOOST_PYTHON_FN(A0::*,1,args)cv()) { return 0; }
8029

81-
template <class Target, class R, class A1, class A2>
82-
boost::type<Target const volatile&>* target(R (Target::*)(A1,A2) const volatile) { return 0; }
30+
BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_FIRST_ARGUMENT_PF, nil)
31+
BOOST_PYTHON_REPEAT_MF_CV_2ND(BOOST_PYTHON_FIRST_ARGUMENT_PMF)
8332

84-
template <class Target, class R, class A1, class A2, class A3>
85-
boost::type<Target const volatile&>* target(R (Target::*)(A1,A2,A3) const volatile) { return 0; }
33+
template <class R, class T>
34+
boost::type<T*>* target(R (T::*)) { return 0; }
8635

8736
}}} // namespace boost::python::detail
8837

89-
#endif // TARGET_DWA2002513_HPP
38+
#endif // TARGET_DWA2002521_HPP

include/boost/python/iterator.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ namespace detail
1818
// Adds an additional layer of binding to
1919
// objects::make_iterator(...), which allows us to pass member
2020
// function and member data pointers.
21-
template <class Target, class NextPolicies, class Accessor1, class Accessor2>
21+
template <class NextPolicies, class Target, class Accessor1, class Accessor2>
2222
inline ref make_iterator(
23-
Accessor1 get_start, Accessor2 get_finish, NextPolicies* = 0, boost::type<Target>* target = 0)
23+
Accessor1 get_start, Accessor2 get_finish, boost::type<Target>* target = 0, NextPolicies* = 0)
2424
{
25-
return objects::make_iterator_function(
25+
return objects::make_iterator_function<NextPolicies,Target>(
2626
boost::protect(boost::bind(get_start, _1))
2727
, boost::protect(boost::bind(get_finish, _1))
28-
, (NextPolicies*)0
29-
, target);
28+
);
3029
}
3130

3231
// Guts of template class iterators<>, below.
@@ -71,15 +70,17 @@ struct iterators
7170
template <class Accessor1, class Accessor2>
7271
ref range(Accessor1 start, Accessor2 finish)
7372
{
74-
return detail::make_iterator(start, finish, (objects::default_iterator_call_policies*)0, detail::target(start));
73+
return detail::make_iterator<objects::default_iterator_call_policies>(
74+
start, finish
75+
, detail::target(start));
7576
}
7677

7778
// Create an iterator-building function which uses the given accessors
7879
// and next() policies. Deduce the Target type.
7980
template <class NextPolicies, class Accessor1, class Accessor2>
8081
ref range(Accessor1 start, Accessor2 finish, NextPolicies* = 0)
8182
{
82-
return detail::make_iterator(start, finish, (NextPolicies*)0, detail::target(start));
83+
return detail::make_iterator<NextPolicies>(start, finish, detail::target(start));
8384
}
8485

8586
// Create an iterator-building function which uses the given accessors
@@ -88,8 +89,7 @@ template <class NextPolicies, class Target, class Accessor1, class Accessor2>
8889
ref range(Accessor1 start, Accessor2 finish, NextPolicies* = 0, boost::type<Target>* = 0)
8990
{
9091
typedef typename add_reference<Target>::type target;
91-
return detail::make_iterator(start, finish, (NextPolicies*)0,
92-
(boost::type<target>*)0);
92+
return detail::make_iterator<NextPolicies, target>(start, finish);
9393
}
9494

9595
// A Python callable object which produces an iterator traversing

include/boost/python/object/iterator.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ namespace detail
119119

120120
// Check the registry. If one is already registered, return it.
121121
ref result(
122-
objects::registered_class_object(converter::undecorated_type_id<range_>()));
122+
objects::registered_class_object(python::type_id<range_>()));
123123

124124
if (result.get() == 0)
125125
{
@@ -189,7 +189,7 @@ namespace detail
189189
template <class NextPolicies, class Target, class Accessor1, class Accessor2>
190190
inline ref make_iterator_function(
191191
Accessor1 const& get_start, Accessor2 const& get_finish
192-
, NextPolicies* , boost::type<Target>*)
192+
, boost::type<Target>* = 0, NextPolicies* = 0)
193193
{
194194
typedef typename Accessor1::result_type result_type;
195195

0 commit comments

Comments
 (0)