diff --git a/include/boost/python/converter/builtin_converters.hpp b/include/boost/python/converter/builtin_converters.hpp index 4db0eb9c..c0d2ba09 100644 --- a/include/boost/python/converter/builtin_converters.hpp +++ b/include/boost/python/converter/builtin_converters.hpp @@ -27,9 +27,13 @@ namespace detail namespace converter { template struct callback_to_python; + BOOST_PYTHON_DECL PyObject* do_call_to_python(char); + BOOST_PYTHON_DECL PyObject* do_call_to_python(char const*); + BOOST_PYTHON_DECL PyObject* do_call_to_python(PyObject*); + BOOST_PYTHON_DECL PyObject* do_callback_to_python(PyObject*); } -# define BOOST_PYTHON_TO_PYTHON_BY_VALUE(T, expr) \ +# define BOOST_PYTHON_CALL_TO_PYTHON_BY_VALUE(T, expr) \ template <> struct to_python_value \ : detail::builtin_to_python \ { \ @@ -45,7 +49,9 @@ namespace converter { \ return (expr); \ } \ - }; \ + }; + +# define BOOST_PYTHON_CALLBACK_TO_PYTHON_BY_VALUE(T, expr) \ namespace converter \ { \ template <> struct callback_to_python< T > \ @@ -57,8 +63,11 @@ namespace converter private: \ ref m_held; \ }; \ - } + } +# define BOOST_PYTHON_TO_PYTHON_BY_VALUE(T, expr) \ + BOOST_PYTHON_CALL_TO_PYTHON_BY_VALUE(T,expr) \ + BOOST_PYTHON_CALLBACK_TO_PYTHON_BY_VALUE(T,expr) # define BOOST_PYTHON_TO_INT(T) \ BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed T, PyInt_FromLong(x)) \ @@ -71,12 +80,14 @@ BOOST_PYTHON_TO_INT(int) BOOST_PYTHON_TO_INT(long) # undef BOOST_TO_PYTHON_INT -BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, x ? PyString_FromString(x) : boost::python::detail::none()) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_call_to_python(x)) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_call_to_python(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, PyString_FromString(x.c_str())) BOOST_PYTHON_TO_PYTHON_BY_VALUE(float, PyFloat_FromDouble(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(double, PyFloat_FromDouble(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(long double, PyFloat_FromDouble(x)) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(PyObject*, (x ? x : boost::python::detail::none())) +BOOST_PYTHON_CALL_TO_PYTHON_BY_VALUE(PyObject*, converter::do_call_to_python(x)) +BOOST_PYTHON_CALLBACK_TO_PYTHON_BY_VALUE(PyObject*, converter::do_callback_to_python(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, PyComplex_FromDoubles(x.real(), x.imag())) BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, PyComplex_FromDoubles(x.real(), x.imag())) BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, PyComplex_FromDoubles(x.real(), x.imag()))