diff --git a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java index c96bbc294..0487776c7 100644 --- a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java +++ b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java @@ -118,6 +118,20 @@ public class multiple_inheritance_abstract_runme { 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"); + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed in multiple_inheritance_abstract"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed in multiple_inheritance_abstract"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), 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"); @@ -131,13 +145,34 @@ public class multiple_inheritance_abstract_runme { check(multiple_inheritance_abstract.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); check(multiple_inheritance_abstract.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); - // Factory functions - check(multiple_inheritance_abstract.MakeDerived1_CBase1().cbase1y()!=3, "MakeDerived1_CBase1 failed"); - check(multiple_inheritance_abstract.MakeDerived1_CBase2().cbase2()!=4, "MakeDerived1_CBase2 failed"); - check(multiple_inheritance_abstract.MakeDerived2_CBase1().cbase1y()!=6, "MakeDerived2_CBase1 failed"); - check(multiple_inheritance_abstract.MakeDerived2_ABase1().abase1()!=5, "MakeDerived2_ABase1 failed"); - check(multiple_inheritance_abstract.MakeDerived3_ABase1().abase1()!=9, "MakeDerived3_ABase1 failed"); - check(multiple_inheritance_abstract.MakeDerived3_CBase1().cbase1y()!=7, "MakeDerived3_CBase1 failed"); - check(multiple_inheritance_abstract.MakeDerived3_CBase2().cbase2()!=8, "MakeDerived3_CBase2 failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + // Return pointers + check(multiple_inheritance_abstract.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_abstract.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_abstract.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + } } diff --git a/Examples/test-suite/multiple_inheritance_abstract.i b/Examples/test-suite/multiple_inheritance_abstract.i index ba69cf2dc..a48dab38c 100644 --- a/Examples/test-suite/multiple_inheritance_abstract.i +++ b/Examples/test-suite/multiple_inheritance_abstract.i @@ -111,6 +111,16 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2) return rcb2.cbase2(); } + int InputCPtrRefABase1(ABase1 *const& pab1) { + return pab1->abase1(); + } + int InputCPtrRefCBase1(CBase1 *const& pcb1) { + return pcb1->cbase1y(); + } + int InputCPtrRefCBase2(CBase2 *const& pcb2) { + return pcb2->cbase2(); + } + // Derived classes as input int InputValDerived1(Derived1 d) { return d.cbase1y() + d.cbase2(); @@ -142,26 +152,84 @@ DECLARE_INTERFACE_RENAME(CBase2, CBase2, SWIGTYPE_CBase2) return d->cbase1y() + d->cbase2() + d->abase1(); } - // Factory functions for more return value testing - CBase1 *MakeDerived1_CBase1() { + int InputCPtrRefDerived1(Derived1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefDerived2(Derived2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefDerived3(Derived3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Return pointers + CBase1 *MakePtrDerived1_CBase1() { return new Derived1(); } - CBase2 *MakeDerived1_CBase2() { + CBase2 *MakePtrDerived1_CBase2() { return new Derived1(); } - CBase1 *MakeDerived2_CBase1() { + CBase1 *MakePtrDerived2_CBase1() { return new Derived2(); } - ABase1 *MakeDerived2_ABase1() { + ABase1 *MakePtrDerived2_ABase1() { return new Derived2(); } - ABase1 *MakeDerived3_ABase1() { + ABase1 *MakePtrDerived3_ABase1() { return new Derived3(); } - CBase1 *MakeDerived3_CBase1() { + CBase1 *MakePtrDerived3_CBase1() { return new Derived3(); } - CBase2 *MakeDerived3_CBase2() { + CBase2 *MakePtrDerived3_CBase2() { return new Derived3(); } + + // Return references + CBase1 &MakeRefDerived1_CBase1() { + static Derived1 d; + return d; + } + CBase2 &MakeRefDerived1_CBase2() { + static Derived1 d; + return d; + } + CBase1 &MakeRefDerived2_CBase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived2_ABase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived3_ABase1() { + static Derived3 d; + return d; + } + CBase1 &MakeRefDerived3_CBase1() { + static Derived3 d; + return d; + } + CBase2 &MakeRefDerived3_CBase2() { + static Derived3 d; + return d; + } + + // Return by value (sliced objects) + CBase1 MakeValDerived1_CBase1() { + return Derived1(); + } + CBase2 MakeValDerived1_CBase2() { + return Derived1(); + } + CBase1 MakeValDerived2_CBase1() { + return Derived2(); + } + CBase1 MakeValDerived3_CBase1() { + return Derived3(); + } + CBase2 MakeValDerived3_CBase2() { + return Derived3(); + } + %} diff --git a/Lib/csharp/feature_interface.i b/Lib/csharp/feature_interface.i index 6e7fc4805..a10bfa57d 100644 --- a/Lib/csharp/feature_interface.i +++ b/Lib/csharp/feature_interface.i @@ -1,8 +1,8 @@ %define DECLARE_INTERFACE_(CTYPE, INTERFACE, IMPL) %feature("interface", name = "INTERFACE", cptr = "GetCPtr") CTYPE; -%typemap(cstype) CTYPE, CTYPE *, CTYPE [], CTYPE & "INTERFACE" +%typemap(cstype) CTYPE, CTYPE *, CTYPE [], CTYPE &, CTYPE *const& "INTERFACE" %typemap(csin) CTYPE, CTYPE & "$csinput.GetCPtr()" -%typemap(csin) CTYPE *, CTYPE [] "$csinput == null ? new HandleRef(null, IntPtr.Zero) : $csinput.GetCPtr()" +%typemap(csin) CTYPE *, CTYPE *const&, CTYPE [] "$csinput == null ? new HandleRef(null, IntPtr.Zero) : $csinput.GetCPtr()" %typemap(csout, excode=SWIGEXCODE) CTYPE { IMPL ret = new IMPL($imcall, true);$excode return (INTERFACE)ret; @@ -11,13 +11,14 @@ IMPL ret = new IMPL($imcall, $owner);$excode return (INTERFACE)ret; } -%typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE [] { - IMPL ret = (cPtr == IntPtr.Zero) ? null : new IMPL($imcall, $owner);$excode +%typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE *const&, CTYPE [] { + IntPtr cPtr = $imcall; + IMPL ret = (cPtr == IntPtr.Zero) ? null : new IMPL(cPtr, $owner);$excode return (INTERFACE)ret; } %typemap(csdirectorin) CTYPE, CTYPE & "(INTERFACE)new IMPL($iminput, false)" -%typemap(csdirectorin) CTYPE *, CTYPE [] "($iminput == IntPtr.Zero) ? null : (INTERFACE)new IMPL($iminput, false)" -%typemap(csdirectorout) CTYPE, CTYPE *, CTYPE [], CTYPE & "$cscall.GetCPtr()" +%typemap(csdirectorin) CTYPE *, CTYPE *const&, CTYPE [] "($iminput == IntPtr.Zero) ? null : (INTERFACE)new IMPL($iminput, false)" +%typemap(csdirectorout) CTYPE, CTYPE *, CTYPE *const&, 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 dc3418e9e..41b96e20c 100644 --- a/Lib/java/feature_interface.i +++ b/Lib/java/feature_interface.i @@ -1,22 +1,22 @@ %define DECLARE_INTERFACE_(CTYPE, INTERFACE, IMPL) %feature("interface", name = "INTERFACE", cptr = #INTERFACE ## "_getCPtr") CTYPE; -%typemap(jtype, nopgcpp="1") CTYPE, CTYPE *, CTYPE [], CTYPE & "long" -%typemap(jstype) CTYPE, CTYPE *, CTYPE [], CTYPE & "INTERFACE" +%typemap(jtype, nopgcpp="1") CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "long" +%typemap(jstype) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "INTERFACE" %typemap(javain) CTYPE, CTYPE & "$javainput." ## #INTERFACE ## "_getCPtr()" -%typemap(javain) CTYPE *, CTYPE [] "($javainput == null) ? 0 : $javainput." ## #INTERFACE ## "_getCPtr()" +%typemap(javain) CTYPE *, CTYPE *const&, CTYPE [] "($javainput == null) ? 0 : $javainput." ## #INTERFACE ## "_getCPtr()" %typemap(javaout) CTYPE { - return (INTERFACE)new IMPL(cPtr, true); + return (INTERFACE)new IMPL($jnicall, true); } %typemap(javaout) CTYPE & { - return (INTERFACE)new IMPL(cPtr, $owner); + return (INTERFACE)new IMPL($jnicall, $owner); } -%typemap(javaout) CTYPE *, CTYPE [] { +%typemap(javaout) CTYPE *, CTYPE *const&, 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 *, CTYPE [] "($jniinput == 0) ? null : (INTERFACE)new IMPL($jniinput, false)" -%typemap(javadirectorout) CTYPE, CTYPE *, CTYPE [], CTYPE & "$javacall." ## #INTERFACE ## "_getCPtr()" +%typemap(javadirectorin) CTYPE *, CTYPE *const&, CTYPE [] "($jniinput == 0) ? null : (INTERFACE)new IMPL($jniinput, false)" +%typemap(javadirectorout) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "$javacall." ## #INTERFACE ## "_getCPtr()" SWIG_JAVABODY_PROXY(public, protected, CTYPE) %enddef