diff --git a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java index 7cc8f3be3..5e9cbe7ba 100644 --- a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java +++ b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java @@ -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"); } } diff --git a/Examples/test-suite/multiple_inheritance_abstract.i b/Examples/test-suite/multiple_inheritance_abstract.i index b8cb63363..cfebb7a47 100644 --- a/Examples/test-suite/multiple_inheritance_abstract.i +++ b/Examples/test-suite/multiple_inheritance_abstract.i @@ -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(); + } %} diff --git a/Lib/csharp/feature_interface.i b/Lib/csharp/feature_interface.i index 43c545a49..cd1e71f49 100644 --- a/Lib/csharp/feature_interface.i +++ b/Lib/csharp/feature_interface.i @@ -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) diff --git a/Lib/java/feature_interface.i b/Lib/java/feature_interface.i index 052e35abf..6abbd904f 100644 --- a/Lib/java/feature_interface.i +++ b/Lib/java/feature_interface.i @@ -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