// (C) Copyright David Abrahams 2000. Permission to copy, use, modify, sell and // distribute this software is granted provided this copyright notice appears // in all copies. This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // The author gratefully acknowleges the support of Dragon Systems, Inc., in // producing this work. #ifndef PYPTR_DWA050400_H_ # define PYPTR_DWA050400_H_ # include "pyconfig.h" # include # include "wrap_python.h" # include "cast.h" # include # include "signatures.h" # include "errors.h" namespace py { template class PyPtr : public boost::dereferenceable, T*> // supplies op-> { public: PyPtr(const PyPtr& rhs) : m_p(rhs.m_p) { Py_XINCREF(object()); } #if !defined(PY_MSVC6_OR_EARLIER) template PyPtr(const PyPtr& rhs) : m_p(rhs.object()) { Py_XINCREF(object()); } #endif PyPtr() : m_p(0) {} // These are two ways of spelling the same thing, that we need to increment // the reference count on the pointer when we're initialized. enum NewRef { new_ref, borrowed = new_ref }; enum AllowNull { null_ok }; template explicit PyPtr(T2* x) : m_p(expect_non_null(x)) {} template PyPtr(T2* x, NewRef) : m_p(expect_non_null(x)) { Py_INCREF(object()); } template PyPtr(T2* x, AllowNull) : m_p(x) {} template PyPtr(T2* x, AllowNull, NewRef) : m_p(x) { Py_XINCREF(object()); } template PyPtr(T2* x, NewRef, AllowNull) : m_p(x) { Py_XINCREF(object()); } #if !defined(PY_MSVC6_OR_EARLIER) template PyPtr& operator=(const PyPtr& rhs) { Py_XDECREF(object()); m_p = rhs.m_p; Py_XINCREF(object()); return *this; } #endif PyPtr& operator=(const PyPtr& rhs) { Py_XINCREF(static_cast(rhs.m_p)); Py_XDECREF(object()); m_p = rhs.m_p; return *this; } ~PyPtr() { Py_XDECREF(m_p); } T& operator*() const { return *m_p; } T* get() const { return m_p; } T* release() { T* p = m_p; m_p = 0; return p; } void reset() { Py_XDECREF(m_p); m_p = 0; } template void reset(T2* x) { Py_XDECREF(m_p); m_p = expect_non_null(x);} template void reset(T2* x, NewRef) { Py_XDECREF(m_p); m_p = expect_non_null(x); Py_INCREF(object()); } template void reset(T2* x, AllowNull) { Py_XDECREF(m_p); m_p = x;} template void reset(T2* x, AllowNull, NewRef) { Py_XDECREF(m_p); m_p = x; Py_XINCREF(object()); } template void reset(T2* x, NewRef, AllowNull) { Py_XDECREF(m_p); m_p = x; Py_XINCREF(object()); } #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) private: template friend class shared_ptr; #endif inline PyObject* object() const { return as_object(m_p); } T* m_p; }; typedef PyPtr Ptr; } #endif // PYPTR_DWA050400_H_