⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arg_to_python.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
// Copyright David Abrahams 2002.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#ifndef ARG_TO_PYTHON_DWA200265_HPP# define ARG_TO_PYTHON_DWA200265_HPP# include <boost/python/ptr.hpp># include <boost/python/tag.hpp># include <boost/python/to_python_indirect.hpp># include <boost/python/converter/registered.hpp># include <boost/python/converter/registered_pointee.hpp># include <boost/python/converter/arg_to_python_base.hpp># include <boost/python/converter/shared_ptr_to_python.hpp>// Bring in specializations# include <boost/python/converter/builtin_converters.hpp># include <boost/python/object/function_handle.hpp># include <boost/python/base_type_traits.hpp># include <boost/python/detail/indirect_traits.hpp># include <boost/python/detail/convertible.hpp># include <boost/python/detail/string_literal.hpp># include <boost/python/detail/value_is_shared_ptr.hpp># include <boost/type_traits/cv_traits.hpp># include <boost/type_traits/composite_traits.hpp># include <boost/type_traits/function_traits.hpp># include <boost/mpl/or.hpp>namespace boost { namespace python { namespace converter { template <class T> struct is_object_manager;namespace detail{  template <class T>  struct function_arg_to_python : handle<>  {      function_arg_to_python(T const& x);  };  template <class T>  struct reference_arg_to_python : handle<>  {      reference_arg_to_python(T& x);   private:      static PyObject* get_object(T& x);  };  template <class T>  struct shared_ptr_arg_to_python : handle<>  {      shared_ptr_arg_to_python(T const& x);   private:      static PyObject* get_object(T& x);  };  template <class T>  struct value_arg_to_python : arg_to_python_base  {      // Throw an exception if the conversion can't succeed      value_arg_to_python(T const&);  };  template <class Ptr>  struct pointer_deep_arg_to_python : arg_to_python_base  {      // Throw an exception if the conversion can't succeed      pointer_deep_arg_to_python(Ptr);  };  template <class Ptr>  struct pointer_shallow_arg_to_python : handle<>  {      // Throw an exception if the conversion can't succeed      pointer_shallow_arg_to_python(Ptr);   private:      static PyObject* get_object(Ptr p);  };  // Convert types that manage a Python object to_python  template <class T>  struct object_manager_arg_to_python  {      object_manager_arg_to_python(T const& x) : m_src(x) {}            PyObject* get() const      {          return python::upcast<PyObject>(get_managed_object(m_src, tag));      }         private:      T const& m_src;  };  template <class T>  struct select_arg_to_python  {      typedef typename unwrap_reference<T>::type unwrapped_referent;      typedef typename unwrap_pointer<T>::type unwrapped_ptr;      typedef typename mpl::if_<          // Special handling for char const[N]; interpret them as char          // const* for the sake of conversion          python::detail::is_string_literal<T const>        , arg_to_python<char const*>        , typename mpl::if_<              python::detail::value_is_shared_ptr<T>            , shared_ptr_arg_to_python<T>                  , typename mpl::if_<                mpl::or_<                    is_function<T>                  , indirect_traits::is_pointer_to_function<T>                  , is_member_function_pointer<T>                >                , function_arg_to_python<T>                , typename mpl::if_<                      is_object_manager<T>                    , object_manager_arg_to_python<T>                    , typename mpl::if_<                          is_pointer<T>                        , pointer_deep_arg_to_python<T>                        , typename mpl::if_<                              is_pointer_wrapper<T>                            , pointer_shallow_arg_to_python<unwrapped_ptr>                            , typename mpl::if_<                                  is_reference_wrapper<T>                                , reference_arg_to_python<unwrapped_referent>                                , value_arg_to_python<T>                              >::type                          >::type                      >::type                  >::type              >::type          >::type      >::type            type;  };}template <class T>struct arg_to_python    : detail::select_arg_to_python<T>::type{    typedef typename detail::select_arg_to_python<T>::type base; public: // member functions    // Throw an exception if the conversion can't succeed    arg_to_python(T const& x);};//// implementations//namespace detail{  // reject_raw_object_ptr -- cause a compile-time error if the user  // should pass a raw Python object pointer  using python::detail::yes_convertible;  using python::detail::no_convertible;  using python::detail::unspecialized;    template <class T> struct cannot_convert_raw_PyObject;  template <class T, class Convertibility>  struct reject_raw_object_helper  {      static void error(Convertibility)      {          cannot_convert_raw_PyObject<T*>::to_python_use_handle_instead();      }      static void error(...) {}  };    template <class T>  inline void reject_raw_object_ptr(T*)  {      reject_raw_object_helper<T,yes_convertible>::error(          python::detail::convertible<PyObject const volatile*>::check((T*)0));            typedef typename remove_cv<T>::type value_type;            reject_raw_object_helper<T,no_convertible>::error(          python::detail::convertible<unspecialized*>::check(              (base_type_traits<value_type>*)0              ));  }  // ---------        template <class T>  inline function_arg_to_python<T>::function_arg_to_python(T const& x)      : handle<>(python::objects::make_function_handle(x))  {  }  template <class T>  inline value_arg_to_python<T>::value_arg_to_python(T const& x)      : arg_to_python_base(&x, registered<T>::converters)  {  }  template <class Ptr>  inline pointer_deep_arg_to_python<Ptr>::pointer_deep_arg_to_python(Ptr x)      : arg_to_python_base(x, registered_pointee<Ptr>::converters)  {      detail::reject_raw_object_ptr((Ptr)0);  }  template <class T>  inline PyObject* reference_arg_to_python<T>::get_object(T& x)  {      to_python_indirect<T&,python::detail::make_reference_holder> convert;      return convert(x);  }  template <class T>  inline reference_arg_to_python<T>::reference_arg_to_python(T& x)      : handle<>(reference_arg_to_python<T>::get_object(x))  {  }  template <class T>  inline shared_ptr_arg_to_python<T>::shared_ptr_arg_to_python(T const& x)      : handle<>(shared_ptr_to_python(x))  {  }  template <class Ptr>  inline pointer_shallow_arg_to_python<Ptr>::pointer_shallow_arg_to_python(Ptr x)      : handle<>(pointer_shallow_arg_to_python<Ptr>::get_object(x))  {      detail::reject_raw_object_ptr((Ptr)0);  }  template <class Ptr>  inline PyObject* pointer_shallow_arg_to_python<Ptr>::get_object(Ptr x)  {      to_python_indirect<Ptr,python::detail::make_reference_holder> convert;      return convert(x);  }}template <class T>inline arg_to_python<T>::arg_to_python(T const& x)    : base(x){}}}} // namespace boost::python::converter#endif // ARG_TO_PYTHON_DWA200265_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -