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

📄 handle.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 HANDLE_DWA200269_HPP# define HANDLE_DWA200269_HPP# include <boost/python/detail/prefix.hpp># include <boost/python/cast.hpp># include <boost/python/errors.hpp># include <boost/python/borrowed.hpp># include <boost/python/handle_fwd.hpp># include <boost/python/refcount.hpp># include <boost/python/tag.hpp># include <boost/python/detail/raw_pyobject.hpp>namespace boost { namespace python { template <class T> struct null_ok;template <class T>inline null_ok<T>* allow_null(T* p){    return (null_ok<T>*)p;}namespace detail{  template <class T>  inline T* manage_ptr(detail::borrowed<null_ok<T> >* p, int)  {      return python::xincref((T*)p);  }    template <class T>  inline T* manage_ptr(null_ok<detail::borrowed<T> >* p, int)  {      return python::xincref((T*)p);  }    template <class T>  inline T* manage_ptr(detail::borrowed<T>* p, long)  {      return python::incref(expect_non_null((T*)p));  }    template <class T>  inline T* manage_ptr(null_ok<T>* p, long)  {      return (T*)p;  }    template <class T>  inline T* manage_ptr(T* p, ...)  {      return expect_non_null(p);  }}template <class T>class handle{    typedef T* (handle::* bool_type )() const; public: // types    typedef T element_type;     public: // member functions    handle();    ~handle();    template <class Y>    explicit handle(Y* p)        : m_p(            python::upcast<T>(                detail::manage_ptr(p, 0)                )            )    {    }    handle& operator=(handle const& r)    {        python::xdecref(m_p);        m_p = python::xincref(r.m_p);        return *this;    }#if !defined(BOOST_MSVC) || (BOOST_MSVC > 1200)    template<typename Y>    handle& operator=(handle<Y> const & r) // never throws    {        python::xdecref(m_p);        m_p = python::xincref(python::upcast<T>(r.get()));        return *this;    }#endif    template <typename Y>    handle(handle<Y> const& r)        : m_p(python::xincref(python::upcast<T>(r.get())))    {    }        handle(handle const& r)        : m_p(python::xincref(r.m_p))    {    }        T* operator-> () const;    T& operator* () const;    T* get() const;    T* release();    void reset();        operator bool_type() const // never throws    {        return m_p ? &handle<T>::get : 0;    }    bool operator! () const; // never throws public: // implementation details -- do not touch    // Defining this in the class body suppresses a VC7 link failure    inline handle(detail::borrowed_reference x)        : m_p(            python::incref(                downcast<T>((PyObject*)x)                ))    {    }     private: // data members    T* m_p;};#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP} // namespace python#endiftemplate<class T> inline T * get_pointer(python::handle<T> const & p){    return p.get();}#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUPnamespace python {#else// We don't want get_pointer above to hide the othersusing boost::get_pointer;#endiftypedef handle<PyTypeObject> type_handle;//// Compile-time introspection//# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATIONtemplate<typename T>class is_handle{ public:    BOOST_STATIC_CONSTANT(bool, value = false); };template<typename T>class is_handle<handle<T> >{ public:    BOOST_STATIC_CONSTANT(bool, value = true);};# elsenamespace detail{  typedef char (&yes_handle_t)[1];  typedef char (&no_handle_t)[2];        no_handle_t is_handle_test(...);  template<typename T>  yes_handle_t is_handle_test(boost::type< handle<T> >);}template<typename T>class is_handle{ public:    BOOST_STATIC_CONSTANT(        bool, value = (            sizeof(detail::is_handle_test(boost::type<T>()))            == sizeof(detail::yes_handle_t)));};# endif//// implementations//template <class T>inline handle<T>::handle()    : m_p(0){}template <class T>inline handle<T>::~handle(){    python::xdecref(m_p);}template <class T>inline T* handle<T>::operator->() const{    return m_p;}template <class T>inline T& handle<T>::operator*() const{    return *m_p;}template <class T>inline T* handle<T>::get() const{    return m_p;}    template <class T>inline bool handle<T>::operator!() const{    return m_p == 0;}template <class T>inline T* handle<T>::release(){    T* result = m_p;    m_p = 0;    return result;}template <class T>inline void handle<T>::reset(){    python::xdecref(m_p);    m_p = 0;}// Because get_managed_object must return a non-null PyObject*, we// return Py_None if the handle is null.template <class T>inline PyObject* get_managed_object(handle<T> const& h, tag_t){    return h.get() ? python::upcast<PyObject>(h.get()) : Py_None;}}} // namespace boost::python#endif // HANDLE_DWA200269_HPP

⌨️ 快捷键说明

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