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 ARG_TO_PYTHON_DWA200265_HPP Chris@16: # define ARG_TO_PYTHON_DWA200265_HPP 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: // Bring in specializations Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace converter { Chris@16: Chris@16: template struct is_object_manager; Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct function_arg_to_python : handle<> Chris@16: { Chris@16: function_arg_to_python(T const& x); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct reference_arg_to_python : handle<> Chris@16: { Chris@16: reference_arg_to_python(T& x); Chris@16: private: Chris@16: static PyObject* get_object(T& x); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct shared_ptr_arg_to_python : handle<> Chris@16: { Chris@16: shared_ptr_arg_to_python(T const& x); Chris@16: private: Chris@16: static PyObject* get_object(T& x); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct value_arg_to_python : arg_to_python_base Chris@16: { Chris@16: // Throw an exception if the conversion can't succeed Chris@16: value_arg_to_python(T const&); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pointer_deep_arg_to_python : arg_to_python_base Chris@16: { Chris@16: // Throw an exception if the conversion can't succeed Chris@16: pointer_deep_arg_to_python(Ptr); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pointer_shallow_arg_to_python : handle<> Chris@16: { Chris@16: // Throw an exception if the conversion can't succeed Chris@16: pointer_shallow_arg_to_python(Ptr); Chris@16: private: Chris@16: static PyObject* get_object(Ptr p); Chris@16: }; Chris@16: Chris@16: // Convert types that manage a Python object to_python Chris@16: template Chris@16: struct object_manager_arg_to_python Chris@16: { Chris@16: object_manager_arg_to_python(T const& x) : m_src(x) {} Chris@16: Chris@16: PyObject* get() const Chris@16: { Chris@16: return python::upcast(get_managed_object(m_src, tag)); Chris@16: } Chris@16: Chris@16: private: Chris@16: T const& m_src; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct select_arg_to_python Chris@16: { Chris@16: typedef typename unwrap_reference::type unwrapped_referent; Chris@16: typedef typename unwrap_pointer::type unwrapped_ptr; Chris@16: Chris@16: typedef typename mpl::if_< Chris@16: // Special handling for char const[N]; interpret them as char Chris@16: // const* for the sake of conversion Chris@16: python::detail::is_string_literal Chris@16: , arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: python::detail::value_is_shared_ptr Chris@16: , shared_ptr_arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: mpl::or_< Chris@16: is_function Chris@16: , indirect_traits::is_pointer_to_function Chris@16: , is_member_function_pointer Chris@16: > Chris@16: , function_arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: is_object_manager Chris@16: , object_manager_arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: is_pointer Chris@16: , pointer_deep_arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: is_pointer_wrapper Chris@16: , pointer_shallow_arg_to_python Chris@16: Chris@16: , typename mpl::if_< Chris@16: is_reference_wrapper Chris@16: , reference_arg_to_python Chris@16: , value_arg_to_python Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: Chris@16: type; Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@16: struct arg_to_python Chris@16: : detail::select_arg_to_python::type Chris@16: { Chris@16: typedef typename detail::select_arg_to_python::type base; Chris@16: public: // member functions Chris@16: // Throw an exception if the conversion can't succeed Chris@16: arg_to_python(T const& x); Chris@16: }; Chris@16: Chris@16: // Chris@16: // implementations Chris@16: // Chris@16: namespace detail Chris@16: { Chris@16: // reject_raw_object_ptr -- cause a compile-time error if the user Chris@16: // should pass a raw Python object pointer Chris@16: using python::detail::yes_convertible; Chris@16: using python::detail::no_convertible; Chris@16: using python::detail::unspecialized; Chris@16: Chris@16: template struct cannot_convert_raw_PyObject; Chris@16: Chris@16: template Chris@16: struct reject_raw_object_helper Chris@16: { Chris@16: static void error(Convertibility) Chris@16: { Chris@16: cannot_convert_raw_PyObject::to_python_use_handle_instead(); Chris@16: } Chris@16: static void error(...) {} Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void reject_raw_object_ptr(T*) Chris@16: { Chris@16: reject_raw_object_helper::error( Chris@16: python::detail::convertible::check((T*)0)); Chris@16: Chris@16: typedef typename remove_cv::type value_type; Chris@16: Chris@16: reject_raw_object_helper::error( Chris@16: python::detail::convertible::check( Chris@16: (base_type_traits*)0 Chris@16: )); Chris@16: } Chris@16: // --------- Chris@16: Chris@16: template Chris@16: inline function_arg_to_python::function_arg_to_python(T const& x) Chris@16: : handle<>(python::objects::make_function_handle(x)) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: inline value_arg_to_python::value_arg_to_python(T const& x) Chris@16: : arg_to_python_base(&x, registered::converters) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: inline pointer_deep_arg_to_python::pointer_deep_arg_to_python(Ptr x) Chris@16: : arg_to_python_base(x, registered_pointee::converters) Chris@16: { Chris@16: detail::reject_raw_object_ptr((Ptr)0); Chris@16: } Chris@16: Chris@16: template Chris@16: inline PyObject* reference_arg_to_python::get_object(T& x) Chris@16: { Chris@16: to_python_indirect convert; Chris@16: return convert(x); Chris@16: } Chris@16: Chris@16: template Chris@16: inline reference_arg_to_python::reference_arg_to_python(T& x) Chris@16: : handle<>(reference_arg_to_python::get_object(x)) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: inline shared_ptr_arg_to_python::shared_ptr_arg_to_python(T const& x) Chris@16: : handle<>(shared_ptr_to_python(x)) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: inline pointer_shallow_arg_to_python::pointer_shallow_arg_to_python(Ptr x) Chris@16: : handle<>(pointer_shallow_arg_to_python::get_object(x)) Chris@16: { Chris@16: detail::reject_raw_object_ptr((Ptr)0); Chris@16: } Chris@16: Chris@16: template Chris@16: inline PyObject* pointer_shallow_arg_to_python::get_object(Ptr x) Chris@16: { Chris@16: to_python_indirect convert; Chris@16: return convert(x); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline arg_to_python::arg_to_python(T const& x) Chris@16: : base(x) Chris@16: {} Chris@16: Chris@16: }}} // namespace boost::python::converter Chris@16: Chris@16: #endif // ARG_TO_PYTHON_DWA200265_HPP