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

📄 obj_mgr_arg_from_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 OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP# define OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP# include <boost/python/detail/prefix.hpp># include <boost/python/detail/referent_storage.hpp># include <boost/python/detail/destroy.hpp># include <boost/python/detail/construct.hpp># include <boost/python/converter/object_manager.hpp># include <boost/python/detail/raw_pyobject.hpp># include <boost/python/tag.hpp>//// arg_from_python converters for Python type wrappers, to be used as// base classes for specializations.//namespace boost { namespace python { namespace converter { template <class T>struct object_manager_value_arg_from_python{    typedef T result_type;        object_manager_value_arg_from_python(PyObject*);    bool convertible() const;    T operator()() const; private:    PyObject* m_source;};// Used for converting reference-to-object-manager arguments from// python. The process used here is a little bit odd. Upon// construction, we build the object manager object in the m_result// object, *forcing* it to accept the source Python object by casting// its pointer to detail::borrowed_reference. This is supposed to// bypass any type checking of the source object. The convertible// check then extracts the owned object and checks it. If the check// fails, nothing else in the program ever gets to touch this strange// "forced" object.template <class Ref>struct object_manager_ref_arg_from_python{    typedef Ref result_type;        object_manager_ref_arg_from_python(PyObject*);    bool convertible() const;    Ref operator()() const;    ~object_manager_ref_arg_from_python(); private:    typename python::detail::referent_storage<Ref>::type m_result;};//// implementations//template <class T>inline object_manager_value_arg_from_python<T>::object_manager_value_arg_from_python(PyObject* x)    : m_source(x){}    template <class T>inline bool object_manager_value_arg_from_python<T>::convertible() const{    return object_manager_traits<T>::check(m_source);}template <class T>inline T object_manager_value_arg_from_python<T>::operator()() const{    return T(python::detail::borrowed_reference(m_source));}template <class Ref>inline object_manager_ref_arg_from_python<Ref>::object_manager_ref_arg_from_python(PyObject* x){# if defined(__EDG_VERSION__) && __EDG_VERSION__ <= 243    // needed for warning suppression    python::detail::borrowed_reference x_ = python::detail::borrowed_reference(x);    python::detail::construct_referent<Ref>(&m_result.bytes, x_);# else     python::detail::construct_referent<Ref>(&m_result.bytes, (python::detail::borrowed_reference)x);# endif }template <class Ref>inline object_manager_ref_arg_from_python<Ref>::~object_manager_ref_arg_from_python(){    python::detail::destroy_referent<Ref>(this->m_result.bytes);}namespace detail{  template <class T>  inline bool object_manager_ref_check(T const& x)  {      return object_manager_traits<T>::check(get_managed_object(x, tag));  }}template <class Ref>inline bool object_manager_ref_arg_from_python<Ref>::convertible() const{    return detail::object_manager_ref_check(        python::detail::void_ptr_to_reference(this->m_result.bytes, (Ref(*)())0));}template <class Ref>inline Ref object_manager_ref_arg_from_python<Ref>::operator()() const{    return python::detail::void_ptr_to_reference(        this->m_result.bytes, (Ref(*)())0);}}}} // namespace boost::python::converter#endif // OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP

⌨️ 快捷键说明

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