interface feature support for passing by value
Also add in missing $owner for governing ownership when returning pointers and references
This commit is contained in:
parent
3eec3e2ea5
commit
a1f2d60535
4 changed files with 92 additions and 24 deletions
|
|
@ -80,6 +80,16 @@ public class multiple_inheritance_abstract_runme {
|
|||
check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed in multiple_inheritance_abstract");
|
||||
check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed in multiple_inheritance_abstract");
|
||||
|
||||
//Value parameters
|
||||
//Test CBase1 CBase2 as parameters (note slicing for Derived1, Derived2 and Derived3)
|
||||
check(multiple_inheritance_abstract.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed in multiple_inheritance_abstract");
|
||||
|
||||
//Pointer parameters
|
||||
//Test ABase1 as a parameter
|
||||
check(multiple_inheritance_abstract.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed in multiple_inheritance_abstract");
|
||||
|
|
@ -107,5 +117,18 @@ public class multiple_inheritance_abstract_runme {
|
|||
check(multiple_inheritance_abstract.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed in multiple_inheritance_abstract");
|
||||
check(multiple_inheritance_abstract.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed in multiple_inheritance_abstract");
|
||||
|
||||
//Derived classes as parameters
|
||||
check(multiple_inheritance_abstract.InputValDerived1(d1)!=3+4, "InputValDerived1() failed");
|
||||
check(multiple_inheritance_abstract.InputValDerived2(d2)!=6+5, "InputValDerived2() failed");
|
||||
check(multiple_inheritance_abstract.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed");
|
||||
|
||||
check(multiple_inheritance_abstract.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed");
|
||||
check(multiple_inheritance_abstract.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed");
|
||||
check(multiple_inheritance_abstract.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed");
|
||||
|
||||
check(multiple_inheritance_abstract.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed");
|
||||
check(multiple_inheritance_abstract.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed");
|
||||
check(multiple_inheritance_abstract.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,12 +37,12 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2)
|
|||
};
|
||||
|
||||
struct Derived1 : CBase2, CBase1 {
|
||||
virtual int cbase1y() {
|
||||
return 3;
|
||||
}
|
||||
virtual void cbase1x() {
|
||||
return;
|
||||
}
|
||||
virtual int cbase1y() {
|
||||
return 3;
|
||||
}
|
||||
virtual int cbase2() {
|
||||
return 4;
|
||||
}
|
||||
|
|
@ -52,15 +52,15 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2)
|
|||
};
|
||||
|
||||
struct Derived2 : CBase1, ABase1 {
|
||||
virtual int abase1() {
|
||||
return 5;
|
||||
}
|
||||
virtual void cbase1x() {
|
||||
return;
|
||||
}
|
||||
virtual int cbase1y() {
|
||||
return 6;
|
||||
}
|
||||
virtual int abase1() {
|
||||
return 5;
|
||||
}
|
||||
virtual CBase1 *clone() {
|
||||
return new Derived2(*this);
|
||||
}
|
||||
|
|
@ -83,13 +83,11 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2)
|
|||
}
|
||||
};
|
||||
|
||||
ABase1 *InputDerived3(Derived3 d) {
|
||||
return d.clone();
|
||||
}
|
||||
int InputValueCBase1(CBase1 cb1) {
|
||||
// Base classes as input
|
||||
int InputValCBase1(CBase1 cb1) {
|
||||
return cb1.cbase1y();
|
||||
}
|
||||
int InputValueCBase2(CBase2 cb2) {
|
||||
int InputValCBase2(CBase2 cb2) {
|
||||
return cb2.cbase2();
|
||||
}
|
||||
|
||||
|
|
@ -112,4 +110,35 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2)
|
|||
int InputRefCBase2(CBase2 &rcb2) {
|
||||
return rcb2.cbase2();
|
||||
}
|
||||
|
||||
// Derived classes as input
|
||||
int InputValDerived1(Derived1 d) {
|
||||
return d.cbase1y() + d.cbase2();
|
||||
}
|
||||
int InputValDerived2(Derived2 d) {
|
||||
return d.cbase1y() + d.abase1();
|
||||
}
|
||||
int InputValDerived3(Derived3 d) {
|
||||
return d.cbase1y() + d.cbase2() + d.abase1();
|
||||
}
|
||||
|
||||
int InputRefDerived1(Derived1 &d) {
|
||||
return d.cbase1y() + d.cbase2();
|
||||
}
|
||||
int InputRefDerived2(Derived2 &d) {
|
||||
return d.cbase1y() + d.abase1();
|
||||
}
|
||||
int InputRefDerived3(Derived3 &d) {
|
||||
return d.cbase1y() + d.cbase2() + d.abase1();
|
||||
}
|
||||
|
||||
int InputPtrDerived1(Derived1 *d) {
|
||||
return d->cbase1y() + d->cbase2();
|
||||
}
|
||||
int InputPtrDerived2(Derived2 *d) {
|
||||
return d->cbase1y() + d->abase1();
|
||||
}
|
||||
int InputPtrDerived3(Derived3 *d) {
|
||||
return d->cbase1y() + d->cbase2() + d->abase1();
|
||||
}
|
||||
%}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,23 @@
|
|||
%define DECLARE_INTERFACE_(CTYPE, INTERFACE, IMPL)
|
||||
%feature("interface", name = "INTERFACE", cptr = "GetCPtr") CTYPE;
|
||||
%typemap(cstype) CTYPE *, CTYPE & "INTERFACE"
|
||||
%typemap(csdirectorout) CTYPE *, CTYPE & "$cscall.GetCPtr()"
|
||||
%typemap(csdirectorin) CTYPE *, CTYPE & "(INTERFACE)new IMPL($iminput, false)"
|
||||
%typemap(cstype) CTYPE, CTYPE *, CTYPE & "INTERFACE"
|
||||
%typemap(csin) CTYPE, CTYPE & "$csinput.GetCPtr()"
|
||||
%typemap(csin) CTYPE * "$csinput == null ? new HandleRef(null, IntPtr.Zero) : $csinput.GetCPtr()"
|
||||
%typemap(csin) CTYPE & "$csinput.GetCPtr()"
|
||||
%typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE & {
|
||||
%typemap(csout, excode=SWIGEXCODE) CTYPE {
|
||||
IMPL ret = new IMPL($imcall, true);$excode
|
||||
return (INTERFACE)ret;
|
||||
}
|
||||
%typemap(csout, excode=SWIGEXCODE) CTYPE & {
|
||||
IMPL ret = new IMPL($imcall, $owner);$excode
|
||||
return (INTERFACE)ret;
|
||||
}
|
||||
%typemap(csout, excode=SWIGEXCODE) CTYPE * {
|
||||
IMPL ret = (cPtr == IntPtr.Zero) ? null : new IMPL($imcall, $owner);$excode
|
||||
return (INTERFACE)ret;
|
||||
}
|
||||
%typemap(csdirectorin) CTYPE, CTYPE & "(INTERFACE)new IMPL($iminput, false)"
|
||||
%typemap(csdirectorin) CTYPE * "($iminput == IntPtr.Zero) ? null : (INTERFACE)new IMPL($iminput, false)"
|
||||
%typemap(csdirectorout) CTYPE, CTYPE *, CTYPE & "$cscall.GetCPtr()"
|
||||
%enddef
|
||||
|
||||
%define DECLARE_INTERFACE_RENAME(CTYPE, INTERFACE, IMPL)
|
||||
|
|
|
|||
|
|
@ -1,15 +1,22 @@
|
|||
%define DECLARE_INTERFACE_(CTYPE, INTERFACE, IMPL)
|
||||
%feature("interface", name = "INTERFACE", cptr = #INTERFACE ## "_getCPtr") CTYPE;
|
||||
%typemap(jstype) CTYPE *, CTYPE & "INTERFACE"
|
||||
%typemap(jtype, nopgcpp="1") CTYPE *, CTYPE & "long"
|
||||
%typemap(javadirectorout) CTYPE *, CTYPE & "$javacall." ## #INTERFACE ## "_getCPtr()"
|
||||
%typemap(javadirectorin) CTYPE *, CTYPE & "($jniinput == 0) ? null : (INTERFACE)new IMPL($jniinput, false)"
|
||||
%typemap(jtype, nopgcpp="1") CTYPE, CTYPE *, CTYPE & "long"
|
||||
%typemap(jstype) CTYPE, CTYPE *, CTYPE & "INTERFACE"
|
||||
%typemap(javain) CTYPE, CTYPE & "$javainput." ## #INTERFACE ## "_getCPtr()"
|
||||
%typemap(javain) CTYPE * "($javainput == null) ? 0 : $javainput." ## #INTERFACE ## "_getCPtr()"
|
||||
%typemap(javain) CTYPE & "$javainput." ## #INTERFACE ## "_getCPtr()"
|
||||
%typemap(javaout) CTYPE *, CTYPE & {
|
||||
long cPtr = $jnicall;
|
||||
return (cPtr == 0) ? null : (INTERFACE)new IMPL(cPtr, true);
|
||||
%typemap(javaout) CTYPE {
|
||||
return (INTERFACE)new IMPL(cPtr, true);
|
||||
}
|
||||
%typemap(javaout) CTYPE & {
|
||||
return (INTERFACE)new IMPL(cPtr, $owner);
|
||||
}
|
||||
%typemap(javaout) CTYPE * {
|
||||
long cPtr = $jnicall;
|
||||
return (cPtr == 0) ? null : (INTERFACE)new IMPL(cPtr, $owner);
|
||||
}
|
||||
%typemap(javadirectorin) CTYPE, CTYPE & "(INTERFACE)new IMPL($jniinput, false)"
|
||||
%typemap(javadirectorin) CTYPE * "($jniinput == 0) ? null : (INTERFACE)new IMPL($jniinput, false)"
|
||||
%typemap(javadirectorout) CTYPE, CTYPE *, CTYPE & "$javacall." ## #INTERFACE ## "_getCPtr()"
|
||||
SWIG_JAVABODY_PROXY(public, protected, CTYPE)
|
||||
%enddef
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue