Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef TO_PYTHON_VALUE_DWA200221_HPP Chris@16: # define TO_PYTHON_VALUE_DWA200221_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: Chris@16: template Chris@16: struct object_manager_get_pytype Chris@16: { Chris@16: template Chris@16: static PyTypeObject const* get( U& (*)() =0) Chris@16: { Chris@16: return converter::object_manager_traits::get_pytype(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct object_manager_get_pytype Chris@16: { Chris@16: template Chris@16: static PyTypeObject const* get( U const& (*)() =0) Chris@16: { Chris@16: return converter::object_manager_traits::get_pytype(); Chris@16: } Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: template Chris@16: struct object_manager_to_python_value Chris@16: { Chris@16: typedef typename value_arg::type argument_type; Chris@16: Chris@16: PyObject* operator()(argument_type) const; Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: typedef boost::mpl::bool_::value> is_t_handle; Chris@16: typedef boost::detail::indirect_traits::is_reference_to_const is_t_const; Chris@16: PyTypeObject const* get_pytype() const { Chris@16: return get_pytype_aux((is_t_handle*)0); Chris@16: } Chris@16: Chris@16: inline static PyTypeObject const* get_pytype_aux(mpl::true_*) {return converter::object_manager_traits::get_pytype();} Chris@16: Chris@16: inline static PyTypeObject const* get_pytype_aux(mpl::false_* ) Chris@16: { Chris@16: return object_manager_get_pytype::get((T(*)())0); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: // This information helps make_getter() decide whether to try to Chris@16: // return an internal reference or not. I don't like it much, Chris@16: // but it will have to serve for now. Chris@16: BOOST_STATIC_CONSTANT(bool, uses_registry = false); Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct registry_to_python_value Chris@16: { Chris@16: typedef typename value_arg::type argument_type; Chris@16: Chris@16: PyObject* operator()(argument_type) const; Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: PyTypeObject const* get_pytype() const {return converter::registered::converters.to_python_target_type();} Chris@16: #endif Chris@16: Chris@16: // This information helps make_getter() decide whether to try to Chris@16: // return an internal reference or not. I don't like it much, Chris@16: // but it will have to serve for now. Chris@16: BOOST_STATIC_CONSTANT(bool, uses_registry = true); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct shared_ptr_to_python_value Chris@16: { Chris@16: typedef typename value_arg::type argument_type; Chris@16: Chris@16: PyObject* operator()(argument_type) const; Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: PyTypeObject const* get_pytype() const {return get_pytype((boost::type*)0);} Chris@16: #endif Chris@16: // This information helps make_getter() decide whether to try to Chris@16: // return an internal reference or not. I don't like it much, Chris@16: // but it will have to serve for now. Chris@16: BOOST_STATIC_CONSTANT(bool, uses_registry = false); Chris@16: private: Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: template Chris@16: PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} Chris@16: template Chris@16: PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} Chris@16: #endif Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@16: struct to_python_value Chris@16: : mpl::if_< Chris@16: detail::value_is_shared_ptr Chris@16: , detail::shared_ptr_to_python_value Chris@16: , typename mpl::if_< Chris@16: mpl::or_< Chris@16: converter::is_object_manager Chris@16: , converter::is_reference_to_object_manager Chris@16: > Chris@16: , detail::object_manager_to_python_value Chris@16: , detail::registry_to_python_value Chris@16: >::type Chris@16: >::type Chris@16: { Chris@16: }; Chris@16: Chris@16: // Chris@16: // implementation Chris@16: // Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: inline PyObject* registry_to_python_value::operator()(argument_type x) const Chris@16: { Chris@16: typedef converter::registered r; Chris@16: # if BOOST_WORKAROUND(__GNUC__, < 3) Chris@16: // suppresses an ICE, somehow Chris@16: (void)r::converters; Chris@16: # endif Chris@16: return converter::registered::converters.to_python(&x); Chris@16: } Chris@16: Chris@16: template Chris@16: inline PyObject* object_manager_to_python_value::operator()(argument_type x) const Chris@16: { Chris@16: return python::upcast( Chris@16: python::xincref( Chris@16: get_managed_object(x, tag)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: inline PyObject* shared_ptr_to_python_value::operator()(argument_type x) const Chris@16: { Chris@16: return converter::shared_ptr_to_python(x); Chris@16: } Chris@16: } Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: #endif // TO_PYTHON_VALUE_DWA200221_HPP