add extended support for smart pointers
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8708 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
4f4e31460f
commit
336844d502
3 changed files with 60 additions and 1 deletions
|
|
@ -13,3 +13,20 @@ if a.ref_count() != 3:
|
||||||
print "This program will crash... now"
|
print "This program will crash... now"
|
||||||
|
|
||||||
|
|
||||||
|
rca = b2.get_rca()
|
||||||
|
b3 = B.create(rca)
|
||||||
|
|
||||||
|
if a.ref_count() != 5:
|
||||||
|
print "This program will crash... now"
|
||||||
|
|
||||||
|
|
||||||
|
v = vector_A(2)
|
||||||
|
v[0] = a
|
||||||
|
v[1] = a
|
||||||
|
|
||||||
|
x = v[0]
|
||||||
|
del v
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
%module refcount
|
%module refcount
|
||||||
|
|
||||||
%warnfilter(362);
|
%warnfilter(SWIGWARN_IGNORE_OPERATOR_EQ,SWIGWARN_LANG_IDENTIFIER);
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
@ -20,6 +20,8 @@
|
||||||
%newobject B::create(A* a);
|
%newobject B::create(A* a);
|
||||||
%newobject B::cloner();
|
%newobject B::cloner();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
|
|
||||||
struct A : RCObj
|
struct A : RCObj
|
||||||
|
|
@ -50,6 +52,15 @@
|
||||||
struct A3 : A1, private A2
|
struct A3 : A1, private A2
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
%extend_smart_pointer(RCPtr<A>);
|
||||||
|
%template(RCPtr_A) RCPtr<A>;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
|
||||||
struct B : RCObj
|
struct B : RCObj
|
||||||
{
|
{
|
||||||
|
|
@ -75,8 +86,19 @@
|
||||||
// std::cout << "deleting b" << std::endl;
|
// std::cout << "deleting b" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RCPtr<A> get_rca() {
|
||||||
|
return _a;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RCPtr<A> _a;
|
RCPtr<A> _a;
|
||||||
};
|
};
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
|
||||||
|
%include <std_vector.i>
|
||||||
|
%template(vector_A) std::vector<RCPtr<A> >;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,26 @@
|
||||||
%typemap(constcode) SWIGTYPE ((*)(ANY)) "";
|
%typemap(constcode) SWIGTYPE ((*)(ANY)) "";
|
||||||
|
|
||||||
|
|
||||||
|
/* Smart Pointers */
|
||||||
|
%typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER {
|
||||||
|
$result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
%typemap(ret,noblock=1) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER {
|
||||||
|
if ($result) {
|
||||||
|
PyObject *robj = PyObject_CallMethod($result, "__deref__", NULL);
|
||||||
|
if (robj && !PyErr_Occurred()) {
|
||||||
|
PySwigObject_append((PyObject *) SWIG_Python_GetSwigThis($result),
|
||||||
|
(PyObject *) SWIG_Python_GetSwigThis(robj));
|
||||||
|
Py_DECREF(robj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use this macro to extend the smart pointer support */
|
||||||
|
%define %extend_smart_pointer(Type...)
|
||||||
|
%implicitconv Type;
|
||||||
|
%apply const SWIGTYPE& SMARTPOINTER { const Type& };
|
||||||
|
%apply SWIGTYPE SMARTPOINTER { Type };
|
||||||
|
%enddef
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue