From: <vo...@us...> - 2008-01-06 21:46:15
|
Revision: 554 http://opde.svn.sourceforge.net/opde/?rev=554&view=rev Author: volca Date: 2008-01-06 13:46:21 -0800 (Sun, 06 Jan 2008) Log Message: ----------- Class pointer binder (as opposed to class pointer through shared_ptr) Modified Paths: -------------- trunk/src/bindings/bindings.h Modified: trunk/src/bindings/bindings.h =================================================================== --- trunk/src/bindings/bindings.h 2008-01-06 21:45:47 UTC (rev 553) +++ trunk/src/bindings/bindings.h 2008-01-06 21:46:21 UTC (rev 554) @@ -85,7 +85,38 @@ // Finally delete the object PyObject_Del(self); } + }; + + /// A template that binds a pointer to class (simmilar to shared_ptr_binder, but no special handling is used) + template <typename T> class class_ptr_binder { + protected: + /// A python object type + typedef ObjectBase<T*> Object; + /// A sort-of constructor method. To be used to create a new NULL Object* + static Object* construct(PyTypeObject* type) { + Object* object; + + object = PyObject_New(Object, type); + + // At this point, the shared_ptr instance in the object is invalid (I.E. Allocated, but not initialized). + // If we try to assign into it, we'll segfault. Because of that, we have to do placed new to initialize the object + if (object != NULL) { + // Here, tidy! + object->mInstance = NULL; + } + + return object; + } + + /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType + static void dealloc(PyObject *self) { + // cast the object to LinkServiceBinder::Object + Object* o = reinterpret_cast<Object*>(self); + + // delete the object + PyObject_Del(self); + } }; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |