24 #ifndef PXR_BASE_TF_PY_IDENTITY_H
25 #define PXR_BASE_TF_PY_IDENTITY_H
40 #include <hboost/python/class.hpp>
41 #include <hboost/python/handle.hpp>
42 #include <hboost/python/object.hpp>
43 #include <hboost/type_traits/is_base_of.hpp>
44 #include <hboost/utility.hpp>
50 namespace hboost {
namespace python {
53 template <
template <
class>
class X,
class Y>
73 static void Set(
void const *
id, PyObject *
obj);
78 static PyObject *
Get(
void const *
id);
81 static void Erase(
void const *
id);
86 static void Acquire(
void const *
id);
91 static void Release(
void const *
id);
128 template <
class Ptr,
typename Enable =
void>
130 template <
typename U>
131 static void Add(U
const &,
const void *, PyObject *) {}
132 template <
typename U>
133 static void Remove(U
const &, PyObject *) {}
136 template <
typename Ptr>
138 typename hboost::enable_if<
139 hboost::mpl::and_<hboost::is_same<TfRefPtr<typename Ptr::DataType>, Ptr>,
140 hboost::is_base_of<TfRefBase, typename Ptr::DataType> > >
::type>
142 struct _RefPtrHolder {
151 if (
TfPyIsNone(TfPyGetClassObject<_RefPtrHolder>())) {
158 hboost::python::class_<_RefPtrHolder>(name.c_str(),
159 hboost::python::no_init);
163 explicit _RefPtrHolder(Ptr
const &refptr) : _refptr(refptr) {}
167 static void Add(Ptr
ptr,
const void *uniqueId, PyObject *
self) {
172 int ret = PyObject_SetAttrString(
self,
"__owner",
173 _RefPtrHolder::Get(ptr).
ptr());
176 TF_WARN(
"Could not set __owner attribute on python object!");
196 if (PyObject_HasAttrString(obj,
"__owner")) {
207 if (PyObject_DelAttrString(obj,
"__owner") == -1) {
209 TF_WARN(
"Undeletable __owner attribute on python object!");
217 #endif // doxygen -- see comment above.
220 template <
typename Ptr>
225 template <
typename T>
232 typename hboost::enable_if<Tf_PyIsRefPtr<Ptr> >
::type
238 typename hboost::disable_if<Tf_PyIsRefPtr<Ptr> >
::type
241 if (ptr.GetUniqueIdentifier()) {
245 ptr.EnableExtraNotification();
270 #endif // PXR_BASE_TF_PY_IDENTITY_H
static void Add(Ptr ptr, const void *uniqueId, PyObject *self)
static void Add(U const &, const void *, PyObject *)
static TF_API void const * Lookup(TfRefBase const *refBase)
ARCH_API std::string ArchGetDemangled(const std::string &typeName)
static hboost::python::object Get(Ptr const &refptr)
hboost::enable_if< Tf_PyIsRefPtr< Ptr > >::type Tf_PySetPythonIdentity(Ptr const &, PyObject *)
GLuint const GLchar * name
static TF_API void Release(void const *id)
Y * get_pointer(TfWeakPtrFacade< X, Y > const &p)
static TF_API void Erase(TfRefBase *refBase)
static void _WrapIfNecessary()
static void Remove(Ptr ptr, PyObject *obj)
TfHashMap< TfRefBase const *, void const *, TfHash > _CacheType
GLsizei const GLchar *const * string
void Tf_PyRemovePythonOwnership(Ptr const &t, PyObject *obj)
static TF_API void Acquire(void const *id)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
static void Remove(U const &, PyObject *)
void Tf_PyReleasePythonIdentity(Ptr const &ptr, PyObject *obj)
void Tf_PyAddPythonOwnership(Ptr const &t, const void *uniqueId, PyObject *obj)
#define PXR_NAMESPACE_CLOSE_SCOPE
static TF_API void Set(void const *id, PyObject *obj)
static TF_API void Erase(void const *id)
PyObject * Tf_PyGetPythonIdentity(Ptr const &ptr)
void Tf_PyOwnershipRefBaseUniqueChanged(TfRefBase const *refBase, bool isNowUnique)
static TF_API PyObject * Get(void const *id)
TF_API bool TfPyIsNone(hboost::python::object const &obj)
Return true iff obj is None.
TF_API std::string TfStringReplace(const std::string &source, const std::string &from, const std::string &to)
static TF_API void Insert(TfRefBase *refBase, void const *uniqueId)