Skip to content

Commit 962a087

Browse files
committed
Use PP lib
[SVN r13463]
1 parent d23daf2 commit 962a087

File tree

10 files changed

+387
-100
lines changed

10 files changed

+387
-100
lines changed

include/boost/python/call.hpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright David Abrahams 2002. Permission to copy, use,
2+
// modify, sell and distribute this software is granted provided this
3+
// copyright notice appears in all copies. This software is provided
4+
// "as is" without express or implied warranty, and with no claim as
5+
// to its suitability for any purpose.
6+
#ifndef CALL_DWA2002411_HPP
7+
# define CALL_DWA2002411_HPP
8+
9+
# include <boost/python/converter/callback.hpp>
10+
# include <boost/python/detail/preprocessor.hpp>
11+
# include <boost/preprocessor/comma_if.hpp>
12+
# include <boost/preprocessor/enum.hpp>
13+
# include <boost/preprocessor/enum_params.hpp>
14+
# include <boost/preprocessor/repeat.hpp>
15+
# include <boost/preprocessor/cat.hpp>
16+
# include <boost/type.hpp>
17+
18+
namespace boost { namespace python {
19+
20+
# ifndef BOOST_PYTHON_GENERATE_CODE
21+
# include <boost/python/preprocessed/call.hpp>
22+
# endif
23+
24+
# define BOOST_PYTHON_CALL_FUNCTION(nargs,ignored) \
25+
template < \
26+
class R \
27+
BOOST_PP_COMMA_IF(nargs) BOOST_PP_ENUM_PARAMS(nargs, class A) \
28+
> \
29+
typename converter::callback_from_python<R>::result_type \
30+
call(PyObject* callable \
31+
BOOST_PP_COMMA_IF(nargs) BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,const& a)) \
32+
, boost::type<R>* = 0 \
33+
) \
34+
{ \
35+
converter::callback_from_python<R> converter; \
36+
return converter( \
37+
PyEval_CallFunction( \
38+
callable \
39+
, const_cast<char*>(BOOST_PYTHON_ARG_STRING(nargs)) \
40+
BOOST_PP_COMMA_IF(nargs) \
41+
BOOST_PP_ENUM(nargs,BOOST_PYTHON_CALLBACK_TO_PYTHON_GET,nil) \
42+
)); \
43+
}
44+
45+
BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_CALL_FUNCTION,data)
46+
47+
}} // namespace boost::python
48+
49+
#endif // CALL_DWA2002411_HPP
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright David Abrahams 2002. Permission to copy, use,
2+
// modify, sell and distribute this software is granted provided this
3+
// copyright notice appears in all copies. This software is provided
4+
// "as is" without express or implied warranty, and with no claim as
5+
// to its suitability for any purpose.
6+
#ifndef CALL_METHOD_DWA2002411_HPP
7+
# define CALL_METHOD_DWA2002411_HPP
8+
9+
# include <boost/python/converter/callback.hpp>
10+
# include <boost/python/detail/preprocessor.hpp>
11+
# include <boost/preprocessor/comma_if.hpp>
12+
# include <boost/preprocessor/enum.hpp>
13+
# include <boost/preprocessor/enum_params.hpp>
14+
# include <boost/preprocessor/repeat.hpp>
15+
# include <boost/preprocessor/cat.hpp>
16+
# include <boost/type.hpp>
17+
18+
namespace boost { namespace python {
19+
20+
# ifndef BOOST_PYTHON_GENERATE_CODE
21+
# include <boost/python/preprocessed/call_method.hpp>
22+
# endif
23+
24+
# define BOOST_PYTHON_CALL_METHOD_FUNCTION(nargs,ignored) \
25+
template < \
26+
class R \
27+
BOOST_PP_COMMA_IF(nargs) BOOST_PP_ENUM_PARAMS(nargs, class A) \
28+
> \
29+
typename converter::callback_from_python<R>::result_type \
30+
call_method(PyObject* self, char const* name \
31+
BOOST_PP_COMMA_IF(nargs) BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,const& a)) \
32+
, boost::type<R>* = 0 \
33+
) \
34+
{ \
35+
converter::callback_from_python<R> converter; \
36+
return converter( \
37+
PyEval_CallMethod( \
38+
self \
39+
, const_cast<char*>(name) \
40+
, const_cast<char*>(BOOST_PYTHON_ARG_STRING(nargs)) \
41+
BOOST_PP_COMMA_IF(nargs) \
42+
BOOST_PP_ENUM(nargs,BOOST_PYTHON_CALLBACK_TO_PYTHON_GET,nil) \
43+
)); \
44+
}
45+
46+
BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_CALL_METHOD_FUNCTION,data)
47+
48+
}} // namespace boost::python
49+
50+
#endif // CALL_METHOD_DWA2002411_HPP

include/boost/python/converter/callback.hpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# include <boost/python/to_python_indirect.hpp>
1818
# include <boost/python/detail/none.hpp>
1919
# include <boost/python/ptr.hpp>
20+
# include <boost/python/errors.hpp>
2021

2122
namespace boost { namespace python { namespace converter {
2223

@@ -132,6 +133,33 @@ template <class T>
132133
struct callback_from_python
133134
: detail::select_callback_from_python<T>::type
134135
{
136+
typedef T result_type;
137+
};
138+
139+
struct void_result
140+
{
141+
private:
142+
void_result() {}
143+
void operator=(void_result const&);
144+
145+
// I would prefer to make this completely untouchable, but few
146+
// compilers support template friends
147+
# if 0
148+
void_result(void_result const&);
149+
# endif
150+
friend struct callback_from_python<void>;
151+
};
152+
153+
// Specialization as a convenience for call and call_method
154+
template <>
155+
struct callback_from_python<void>
156+
{
157+
typedef void_result result_type;
158+
result_type operator()(PyObject* x) const
159+
{
160+
Py_DECREF(expect_non_null(x));
161+
return result_type();
162+
}
135163
};
136164

137165
template <class T>
@@ -144,6 +172,14 @@ struct callback_to_python
144172
callback_to_python(T const& x);
145173
};
146174

175+
// Convenience macros for call<> and call_method<> code generation
176+
# define BOOST_PYTHON_CALLBACK_TO_PYTHON_GET(index,ignored) \
177+
converter::callback_to_python<BOOST_PP_CAT(A,index)>( \
178+
BOOST_PP_CAT(a,index)).get()
179+
180+
# define BOOST_PYTHON_ARG_STRING(nargs) \
181+
"(" BOOST_PP_REPEAT(nargs,BOOST_PYTHON_PROJECT_2ND,"O") ")"
182+
147183
//
148184
// Implementations
149185
//

include/boost/python/detail/preprocessor.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ namespace boost { namespace python { namespace detail {
9191

9292
#define BOOST_PYTHON_ENUM_PARAMS2(N, Pair) BOOST_PP_ENUM(N, BOOST_PYTHON_NUMBER_PAIR, Pair)
9393

94+
# define BOOST_PYTHON_PROJECT_1ST(a1,a2) a1
95+
# define BOOST_PYTHON_PROJECT_2ND(a1,a2) a2
9496

9597
}}} // namespace boost::python::detail
9698

include/boost/python/object/pointer_holder.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ struct pointer_holder_back_reference : instance_holder
7474
BOOST_PP_COMMA_IF(nargs) \
7575
BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,a))) \
7676
: m_p(new held_type( \
77-
p, \
77+
p BOOST_PP_COMMA_IF(nargs) \
7878
BOOST_PP_ENUM(nargs, BOOST_PYTHON_UNFORWARD, nil) \
7979
)) \
8080
{ \
Lines changed: 76 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,116 @@
1-
// Copyright David Abrahams 2002. Permission to copy, use,
2-
// modify, sell and distribute this software is granted provided this
3-
// copyright notice appears in all copies. This software is provided
4-
// "as is" without express or implied warranty, and with no claim as
5-
// to its suitability for any purpose.
1+
//Copyright David Abrahams 2002.Permission to copy,use,
2+
//modify,sell and distribute this software is granted provided this
3+
//copyright notice appears in all copies.This software is provided
4+
//"as is" without express or implied warranty,and with no claim as
5+
//to its suitability for any purpose.
66
#ifndef CALL_PP_DWA2002411_HPP
7-
# define CALL_PP_DWA2002411_HPP
7+
#define CALL_PP_DWA2002411_HPP
88

9-
call(PyObject*self)
10-
:m_result(
11-
PyEval_CallFunction(self,const_cast<char*>("(" ")")))
9+
template<class R>
10+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,boost::type<R>* =0)
1211
{
13-
12+
converter::callback_from_python<R>converter;
13+
return converter(
14+
PyEval_CallFunction(callable,const_cast<char*>("(" ")")));
1415
}
15-
template<class A0>
16-
call(PyObject*self,A0 const&a0)
17-
:m_result(
18-
PyEval_CallFunction(self,const_cast<char*>("(" "O" ")"),
19-
converter::callback_to_python<A0>(a0).get()))
16+
template<class R,class A0>
17+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,boost::type<R>* =0)
2018
{
21-
19+
converter::callback_from_python<R>converter;
20+
return converter(
21+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" ")"),
22+
converter::callback_to_python<A0>(a0).get()));
2223
}
23-
template<class A0,class A1>
24-
call(PyObject*self,A0 const&a0,A1 const&a1)
25-
:m_result(
26-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" ")"),
27-
converter::callback_to_python<A0>(a0).get(),
28-
converter::callback_to_python<A1>(a1).get()))
24+
template<class R,class A0,class A1>
25+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,boost::type<R>* =0)
2926
{
30-
27+
converter::callback_from_python<R>converter;
28+
return converter(
29+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" ")"),
30+
converter::callback_to_python<A0>(a0).get(),
31+
converter::callback_to_python<A1>(a1).get()));
3132
}
32-
template<class A0,class A1,class A2>
33-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2)
34-
:m_result(
35-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" ")"),
33+
template<class R,class A0,class A1,class A2>
34+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,boost::type<R>* =0)
35+
{
36+
converter::callback_from_python<R>converter;
37+
return converter(
38+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" ")"),
3639
converter::callback_to_python<A0>(a0).get(),
3740
converter::callback_to_python<A1>(a1).get(),
38-
converter::callback_to_python<A2>(a2).get()))
39-
{
40-
41+
converter::callback_to_python<A2>(a2).get()));
4142
}
42-
template<class A0,class A1,class A2,class A3>
43-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3)
44-
:m_result(
45-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" ")"),
43+
template<class R,class A0,class A1,class A2,class A3>
44+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,boost::type<R>* =0)
45+
{
46+
converter::callback_from_python<R>converter;
47+
return converter(
48+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" ")"),
4649
converter::callback_to_python<A0>(a0).get(),
4750
converter::callback_to_python<A1>(a1).get(),
4851
converter::callback_to_python<A2>(a2).get(),
49-
converter::callback_to_python<A3>(a3).get()))
50-
{
51-
52+
converter::callback_to_python<A3>(a3).get()));
5253
}
53-
template<class A0,class A1,class A2,class A3,class A4>
54-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4)
55-
:m_result(
56-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" "O" ")"),
54+
template<class R,class A0,class A1,class A2,class A3,class A4>
55+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,boost::type<R>* =0)
56+
{
57+
converter::callback_from_python<R>converter;
58+
return converter(
59+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" "O" ")"),
5760
converter::callback_to_python<A0>(a0).get(),
5861
converter::callback_to_python<A1>(a1).get(),
5962
converter::callback_to_python<A2>(a2).get(),
6063
converter::callback_to_python<A3>(a3).get(),
61-
converter::callback_to_python<A4>(a4).get()))
62-
{
63-
64+
converter::callback_to_python<A4>(a4).get()));
6465
}
65-
template<class A0,class A1,class A2,class A3,class A4,class A5>
66-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5)
67-
:m_result(
68-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" ")"),
66+
template<class R,class A0,class A1,class A2,class A3,class A4,class A5>
67+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,boost::type<R>* =0)
68+
{
69+
converter::callback_from_python<R>converter;
70+
return converter(
71+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" ")"),
6972
converter::callback_to_python<A0>(a0).get(),
7073
converter::callback_to_python<A1>(a1).get(),
7174
converter::callback_to_python<A2>(a2).get(),
7275
converter::callback_to_python<A3>(a3).get(),
7376
converter::callback_to_python<A4>(a4).get(),
74-
converter::callback_to_python<A5>(a5).get()))
75-
{
76-
77+
converter::callback_to_python<A5>(a5).get()));
7778
}
78-
template<class A0,class A1,class A2,class A3,class A4,class A5,class A6>
79-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6)
80-
:m_result(
81-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" ")"),
79+
template<class R,class A0,class A1,class A2,class A3,class A4,class A5,class A6>
80+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,boost::type<R>* =0)
81+
{
82+
converter::callback_from_python<R>converter;
83+
return converter(
84+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" ")"),
8285
converter::callback_to_python<A0>(a0).get(),
8386
converter::callback_to_python<A1>(a1).get(),
8487
converter::callback_to_python<A2>(a2).get(),
8588
converter::callback_to_python<A3>(a3).get(),
8689
converter::callback_to_python<A4>(a4).get(),
8790
converter::callback_to_python<A5>(a5).get(),
88-
converter::callback_to_python<A6>(a6).get()))
89-
{
90-
91+
converter::callback_to_python<A6>(a6).get()));
9192
}
92-
template<class A0,class A1,class A2,class A3,class A4,class A5,class A6,class A7>
93-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7)
94-
:m_result(
95-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" "O" ")"),
93+
template<class R,class A0,class A1,class A2,class A3,class A4,class A5,class A6,class A7>
94+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,boost::type<R>* =0)
95+
{
96+
converter::callback_from_python<R>converter;
97+
return converter(
98+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" "O" ")"),
9699
converter::callback_to_python<A0>(a0).get(),
97100
converter::callback_to_python<A1>(a1).get(),
98101
converter::callback_to_python<A2>(a2).get(),
99102
converter::callback_to_python<A3>(a3).get(),
100103
converter::callback_to_python<A4>(a4).get(),
101104
converter::callback_to_python<A5>(a5).get(),
102105
converter::callback_to_python<A6>(a6).get(),
103-
converter::callback_to_python<A7>(a7).get()))
104-
{
105-
106+
converter::callback_to_python<A7>(a7).get()));
106107
}
107-
template<class A0,class A1,class A2,class A3,class A4,class A5,class A6,class A7,class A8>
108-
call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8)
109-
:m_result(
110-
PyEval_CallFunction(self,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" "O" "O" ")"),
108+
template<class R,class A0,class A1,class A2,class A3,class A4,class A5,class A6,class A7,class A8>
109+
typename converter::callback_from_python<R>::result_type call(PyObject*callable,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,boost::type<R>* =0)
110+
{
111+
converter::callback_from_python<R>converter;
112+
return converter(
113+
PyEval_CallFunction(callable,const_cast<char*>("(" "O" "O" "O" "O" "O" "O" "O" "O" "O" ")"),
111114
converter::callback_to_python<A0>(a0).get(),
112115
converter::callback_to_python<A1>(a1).get(),
113116
converter::callback_to_python<A2>(a2).get(),
@@ -116,10 +119,8 @@ call(PyObject*self,A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A
116119
converter::callback_to_python<A5>(a5).get(),
117120
converter::callback_to_python<A6>(a6).get(),
118121
converter::callback_to_python<A7>(a7).get(),
119-
converter::callback_to_python<A8>(a8).get()
120-
))
121-
{
122-
123-
}
122+
converter::callback_to_python<A8>(a8).get()));
123+
}
124+
124125

125-
#endif // CALL_PP_DWA2002411_HPP
126+
#endif//CALL_PP_DWA2002411_HPP

0 commit comments

Comments
 (0)