[PyQt] sip: how to disable copy constructor, assignment operator for mapped types
Nathan Cournia
cournia at gmail.com
Mon May 10 23:53:50 BST 2010
Hi,
I'm currently trying to use %MappedType to allow my QT code to
interact with C++ objects that have been wrapped using SWIG. My .sip
file currently looks like:
%MappedType Node /NoDefaultCtors/
{
%TypeHeaderCode
#include <foo/Node.h>
using namespace foo;
%End
%ConvertFromTypeCode
return sipCpp->getPyObject();
%End
%ConvertToTypeCode
if (!sipIsErr) {
return foo::Node::isNode(sipPy);
}
*sipCppPtr = foo::Node::asNode(sipPy);
if (!*sipCppPtr) {
*sipIsErr = 1;
return 0;
} else {
return SIP_TEMPORARY;
}
%End
};
Can %MappedType be used to tell SIP about Python objects that have
been wrapped with SWIG? Is this a good idea?
The following code is generated:
extern "C" {static void assign_Node(void *, SIP_SSIZE_T, const void *);}
static void assign_Node(void *sipDst, SIP_SSIZE_T sipDstIdx, const void *sipSrc)
{
reinterpret_cast<Node *>(sipDst)[sipDstIdx] =
*reinterpret_cast<const Node *>(sipSrc);
}
extern "C" {static void *array_Node(SIP_SSIZE_T);}
static void *array_Node(SIP_SSIZE_T sipNrElem)
{
return new Node[sipNrElem];
}
extern "C" {static void *copy_Node(const void *, SIP_SSIZE_T);}
static void *copy_Node(const void *sipSrc, SIP_SSIZE_T sipSrcIdx)
{
return new Node(reinterpret_cast<const Node *>(sipSrc)[sipSrcIdx]);
}
/* Call the mapped type's destructor. */
extern "C" {static void release_Node(void *, int);}
static void release_Node(void *ptr, int)
{
Py_BEGIN_ALLOW_THREADS
delete reinterpret_cast<Node *>(ptr);
Py_END_ALLOW_THREADS
}
#endif
This poses several problems. First, foo::Node's assignment and copy
constructors have been hidden/disabled. This means assign_Node and
copy_Node do not work. Is there a way to disable the generation of
assign_Node and copy_Node?
Second, I do not want SIP to call delete on the Node in release_Node.
foo::Node is internally reference counted, The SWIG bindings are aware
of this and should decrement foo::Node's reference count when the
PyObject is released. Can I disabled the generation of release_Node?
Thanks,
nathan
More information about the PyQt
mailing list