diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 9e626cb30..0a91df685 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -285,6 +285,7 @@ CPP_TEST_CASES += \ multiple_inheritance_abstract \ multiple_inheritance_interfaces \ multiple_inheritance_nspace \ + multiple_inheritance_shared_ptr \ name_cxx \ name_warnings \ namespace_class \ diff --git a/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs b/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs new file mode 100644 index 000000000..13ffc62a4 --- /dev/null +++ b/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs @@ -0,0 +1,329 @@ +using System; +using multiple_inheritance_shared_ptrNamespace; + +public class multiple_inheritance_shared_ptr_runme { + + //Test base class as a parameter in C# + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(bool fail, string msg) { + if (fail) + throw new Exception(msg); + } + + public static void Main() { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in C# + multiple_inheritance_shared_ptr_runme mhar=new multiple_inheritance_shared_ptr_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_shared_ptr.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d2)!=5, "InputSharedPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d3)!=9, "InputSharedPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b2)!=205, "InputSharedPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b3)!=309, "InputSharedPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d1)!=3, "InputSharedPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d2)!=6, "InputSharedPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d3)!=7, "InputSharedPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d3)!=8, "InputSharedPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d1)!=4, "InputSharedPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(cb1)!=1, "InputSharedPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(cb2)!=2, "InputSharedPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b1)!=103, "InputSharedPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b2)!=206, "InputSharedPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b3)!=307, "InputSharedPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b3)!=308, "InputSharedPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b1)!=104, "InputSharedPtrCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d2)!=5, "InputSharedPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d3)!=9, "InputSharedPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b2)!=205, "InputSharedPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b3)!=309, "InputSharedPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d1)!=3, "InputSharedPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d2)!=6, "InputSharedPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d3)!=7, "InputSharedPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d3)!=8, "InputSharedPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d1)!=4, "InputSharedPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(cb1)!=1, "InputSharedPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(cb2)!=2, "InputSharedPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b1)!=103, "InputSharedPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b2)!=206, "InputSharedPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b3)!=307, "InputSharedPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b3)!=308, "InputSharedPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b1)!=104, "InputSharedPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(d1)!=3+4, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(d2)!=6+5, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(d3)!=7+8+9, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(d1)!=3+4, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(d2)!=6+5, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(d3)!=7+8+9, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(b1)!=103+104, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(b2)!=206+205, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(b3)!=307+308+309, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(b1)!=103+104, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(b2)!=206+205, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(b3)!=307+308+309, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_shared_ptr.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom1(b1)!=103+104, "InputSharedPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom2(b2)!=206+205, "InputSharedPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom3(b3)!=307+308+309, "InputSharedPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom1(b1)!=103+104, "InputSharedPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom2(b2)!=206+205, "InputSharedPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom3(b3)!=307+308+309, "InputSharedPtrRefBottom3() failed"); + + // Return pointers + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase2().cbase2()!=4, "MakeSharedPtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_ABase1().abase1()!=5, "MakeSharedPtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_ABase1().abase1()!=9, "MakeSharedPtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase2().cbase2()!=8, "MakeSharedPtrDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase2().cbase2()!=4, "MakeSharedPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_ABase1().abase1()!=5, "MakeSharedPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_ABase1().abase1()!=9, "MakeSharedPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase2().cbase2()!=8, "MakeSharedPtrRefDerived3_CBase2 failed"); + } +} diff --git a/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java new file mode 100644 index 000000000..6472a911e --- /dev/null +++ b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java @@ -0,0 +1,337 @@ +import multiple_inheritance_shared_ptr.*; + +public class multiple_inheritance_shared_ptr_runme { + + static { + try { + System.loadLibrary("multiple_inheritance_shared_ptr"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + //Test base class as a parameter in java + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(boolean fail, String msg) { + if (fail) + throw new RuntimeException(msg); + } + + public static void main(String argv[]) { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in java + multiple_inheritance_shared_ptr_runme mhar=new multiple_inheritance_shared_ptr_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_shared_ptr.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d2)!=5, "InputSharedPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d3)!=9, "InputSharedPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b2)!=205, "InputSharedPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b3)!=309, "InputSharedPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d1)!=3, "InputSharedPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d2)!=6, "InputSharedPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d3)!=7, "InputSharedPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d3)!=8, "InputSharedPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d1)!=4, "InputSharedPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(cb1)!=1, "InputSharedPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(cb2)!=2, "InputSharedPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b1)!=103, "InputSharedPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b2)!=206, "InputSharedPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b3)!=307, "InputSharedPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b3)!=308, "InputSharedPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b1)!=104, "InputSharedPtrCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d2)!=5, "InputSharedPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d3)!=9, "InputSharedPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b2)!=205, "InputSharedPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b3)!=309, "InputSharedPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d1)!=3, "InputSharedPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d2)!=6, "InputSharedPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d3)!=7, "InputSharedPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d3)!=8, "InputSharedPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d1)!=4, "InputSharedPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(cb1)!=1, "InputSharedPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(cb2)!=2, "InputSharedPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b1)!=103, "InputSharedPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b2)!=206, "InputSharedPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b3)!=307, "InputSharedPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b3)!=308, "InputSharedPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b1)!=104, "InputSharedPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(d1)!=3+4, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(d2)!=6+5, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(d3)!=7+8+9, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(d1)!=3+4, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(d2)!=6+5, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(d3)!=7+8+9, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(b1)!=103+104, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(b2)!=206+205, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(b3)!=307+308+309, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(b1)!=103+104, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(b2)!=206+205, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(b3)!=307+308+309, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_shared_ptr.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom1(b1)!=103+104, "InputSharedPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom2(b2)!=206+205, "InputSharedPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom3(b3)!=307+308+309, "InputSharedPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom1(b1)!=103+104, "InputSharedPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom2(b2)!=206+205, "InputSharedPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom3(b3)!=307+308+309, "InputSharedPtrRefBottom3() failed"); + + // Return pointers + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase2().cbase2()!=4, "MakeSharedPtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_ABase1().abase1()!=5, "MakeSharedPtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_ABase1().abase1()!=9, "MakeSharedPtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase2().cbase2()!=8, "MakeSharedPtrDerived3_CBase2 failed"); + + // Return smart pointers references + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase2().cbase2()!=4, "MakeSharedPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_ABase1().abase1()!=5, "MakeSharedPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_ABase1().abase1()!=9, "MakeSharedPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase2().cbase2()!=8, "MakeSharedPtrRefDerived3_CBase2 failed"); + } +} diff --git a/Examples/test-suite/multiple_inheritance_shared_ptr.i b/Examples/test-suite/multiple_inheritance_shared_ptr.i new file mode 100644 index 000000000..5a08e5e6e --- /dev/null +++ b/Examples/test-suite/multiple_inheritance_shared_ptr.i @@ -0,0 +1,499 @@ +// This is a copy of the multiple_inheritance_abstract test and extended for testing %shared_ptr and %interface_impl +%module multiple_inheritance_shared_ptr + +%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, + SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ + +// Typemap changes required to mix %shared_ptr and %interface_impl +// Note we don't have a way to use $javainterfacename/$csinterfacename (yet), +// so we improvise somewhat by adding the SwigImpl suffix +%define SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(CONST, TYPE...) +#if defined(SWIGJAVA) +%typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($javainput == null) ? 0 : $javainput.$typemap(jstype, TYPE)_GetInterfaceCPtr()" +%typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { + long cPtr = $jnicall; + return (cPtr == 0) ? null : ($typemap(jstype, TYPE))new $typemap(jstype, TYPE)SwigImpl(cPtr, true); + } +#elif defined(SWIGCSHARP) +%typemap(csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$csinput == null ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : $csinput.GetInterfaceCPtr()" +%typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { + global::System.IntPtr cPtr = $imcall; + $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)SwigImpl(cPtr, true);$excode + return ret; + } +#endif +%enddef + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%include +%shared_ptr(Space::ABase1) +%shared_ptr(Space::CBase1) +%shared_ptr(Space::CBase2) +%shared_ptr(Space::Derived1) +%shared_ptr(Space::Derived2) +%shared_ptr(Space::Derived3) +%shared_ptr(Space::Bottom1) +%shared_ptr(Space::Bottom2) +%shared_ptr(Space::Bottom3) + +%include "swiginterface.i" +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::ABase1) +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::CBase1) +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::CBase2) +%interface_impl(Space::ABase1) +%interface_impl(Space::CBase1) +%interface_impl(Space::CBase2) +#endif + +#if defined(SWIGD) +// Missing multiple inheritance support results in incorrect use of override +%ignore CBase1; +%ignore CBase2; +#endif + +%inline %{ +#include + +namespace Space { + struct CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 1; + } + int cbase1z() { + return 10; + } + virtual ~CBase1() { + } + }; + + struct CBase2 { + virtual int cbase2() { + return 2; + } + virtual ~CBase2() { + } + }; + + struct ABase1 { + virtual int abase1() = 0; + virtual ~ABase1() { + } + }; + + struct Derived1 : CBase2, CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 3; + } + virtual int cbase2() { + return 4; + } + virtual CBase2 *cloneit() { + return new Derived1(*this); + } + void derived1() { + } + }; + + struct Derived2 : CBase1, ABase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 6; + } + virtual int abase1() { + return 5; + } + virtual CBase1 *cloneit() { + return new Derived2(*this); + } + void derived2() { + } + }; + + struct Derived3 : ABase1, CBase1, CBase2 { + virtual int cbase1y() { + return 7; + } + virtual int cbase2() { + return 8; + } + virtual int abase1() { + return 9; + } + virtual void cbase1x() { + } + virtual ABase1 *cloneit() { + return new Derived3(*this); + } + void derived3() { + } + }; + + struct Bottom1 : Derived1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 103; + } + virtual int cbase2() { + return 104; + } + }; + + struct Bottom2 : Derived2 { + virtual int cbase1y() { + return 206; + } + virtual int abase1() { + return 205; + } + }; + + struct Bottom3 : Derived3 { + virtual int cbase1y() { + return 307; + } + virtual int cbase2() { + return 308; + } + virtual int abase1() { + return 309; + } + }; + + typedef boost::shared_ptr ABase1_SharedPtr; + typedef boost::shared_ptr CBase1_SharedPtr; + typedef boost::shared_ptr CBase2_SharedPtr; + typedef boost::shared_ptr Derived1_SharedPtr; + typedef boost::shared_ptr Derived2_SharedPtr; + typedef boost::shared_ptr Derived3_SharedPtr; + typedef boost::shared_ptr Bottom1_SharedPtr; + typedef boost::shared_ptr Bottom2_SharedPtr; + typedef boost::shared_ptr Bottom3_SharedPtr; + + // Base classes as input + int InputValCBase1(CBase1 cb1) { + return cb1.cbase1y(); + } + int InputValCBase2(CBase2 cb2) { + return cb2.cbase2(); + } + + int InputPtrABase1(ABase1 *pab1) { + return pab1->abase1(); + } + int InputPtrCBase1(CBase1 *pcb1) { + return pcb1->cbase1y(); + } + int InputPtrCBase2(CBase2 *pcb2) { + return pcb2->cbase2(); + } + + int InputRefABase1(ABase1 &rab1) { + return rab1.abase1(); + } + int InputRefCBase1(CBase1 &rcb1) { + return rcb1.cbase1y(); + } + int InputRefCBase2(CBase2 &rcb2) { + 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(); + } + + int InputSharedPtrABase1(ABase1_SharedPtr pab1) { + return pab1->abase1(); + } + int InputSharedPtrCBase1(CBase1_SharedPtr pcb1) { + return pcb1->cbase1y(); + } + int InputSharedPtrCBase2(CBase2_SharedPtr pcb2) { + return pcb2->cbase2(); + } + + int InputSharedPtrRefABase1(ABase1_SharedPtr &pab1) { + return pab1->abase1(); + } + int InputSharedPtrRefCBase1(CBase1_SharedPtr &pcb1) { + return pcb1->cbase1y(); + } + int InputSharedPtrRefCBase2(CBase2_SharedPtr &pcb2) { + return pcb2->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(); + } + + 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(); + } + + int InputSharedPtrDerived1(Derived1_SharedPtr d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrDerived2(Derived2_SharedPtr d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrDerived3(Derived3_SharedPtr d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrRefDerived1(Derived1_SharedPtr &d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrRefDerived2(Derived2_SharedPtr &d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrRefDerived3(Derived3_SharedPtr &d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Bottom classes as input + int InputValBottom1(Bottom1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValBottom2(Bottom2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValBottom3(Bottom3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefBottom1(Bottom1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefBottom2(Bottom2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefBottom3(Bottom3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrBottom1(Bottom1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrBottom2(Bottom2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrBottom3(Bottom3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefBottom1(Bottom1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefBottom2(Bottom2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefBottom3(Bottom3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrBottom1(Bottom1_SharedPtr d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrBottom2(Bottom2_SharedPtr d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrBottom3(Bottom3_SharedPtr d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrRefBottom1(Bottom1_SharedPtr &d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrRefBottom2(Bottom2_SharedPtr &d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrRefBottom3(Bottom3_SharedPtr &d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Return pointers + CBase1 *MakePtrDerived1_CBase1() { + return new Derived1(); + } + CBase2 *MakePtrDerived1_CBase2() { + return new Derived1(); + } + CBase1 *MakePtrDerived2_CBase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived2_ABase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived3_ABase1() { + return new Derived3(); + } + CBase1 *MakePtrDerived3_CBase1() { + return new Derived3(); + } + 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(); + } + + // Return smart pointers + CBase1_SharedPtr MakeSharedPtrDerived1_CBase1() { + return CBase1_SharedPtr(new Derived1()); + } + CBase2_SharedPtr MakeSharedPtrDerived1_CBase2() { + return CBase2_SharedPtr(new Derived1()); + } + CBase1_SharedPtr MakeSharedPtrDerived2_CBase1() { + return CBase1_SharedPtr(new Derived2()); + } + ABase1_SharedPtr MakeSharedPtrDerived2_ABase1() { + return ABase1_SharedPtr(new Derived2()); + } + ABase1_SharedPtr MakeSharedPtrDerived3_ABase1() { + return ABase1_SharedPtr(new Derived3()); + } + CBase1_SharedPtr MakeSharedPtrDerived3_CBase1() { + return CBase1_SharedPtr(new Derived3()); + } + CBase2_SharedPtr MakeSharedPtrDerived3_CBase2() { + return CBase2_SharedPtr(new Derived3()); + } + + // Return smart pointer references + CBase1_SharedPtr MakeSharedPtrRefDerived1_CBase1() { + static CBase1_SharedPtr s(new Derived1()); + return s; + } + CBase2_SharedPtr MakeSharedPtrRefDerived1_CBase2() { + static CBase2_SharedPtr s(new Derived1()); + return s; + } + CBase1_SharedPtr MakeSharedPtrRefDerived2_CBase1() { + static CBase1_SharedPtr s(new Derived2()); + return s; + } + ABase1_SharedPtr MakeSharedPtrRefDerived2_ABase1() { + static ABase1_SharedPtr s(new Derived2()); + return s; + } + ABase1_SharedPtr MakeSharedPtrRefDerived3_ABase1() { + static ABase1_SharedPtr s(new Derived3()); + return s; + } + CBase1_SharedPtr MakeSharedPtrRefDerived3_CBase1() { + static CBase1_SharedPtr s(new Derived3()); + return s; + } + CBase2_SharedPtr MakeSharedPtrRefDerived3_CBase2() { + static CBase2_SharedPtr s(new Derived3()); + return s; + } +} + +%} diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 5e1529325..34e9c5951 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -1686,7 +1686,7 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); @@ -1709,26 +1709,56 @@ public: Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); - String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); - String *wname = Swig_name_wrapper(upcast_method); + String *upcast_method_name = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); - Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); - Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method); - Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); - Printv(upcasts_code, - "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", - " return (", c_baseclass, " *)jarg1;\n" - "}\n", "\n", NIL); - - Delete(interface_code); + Delete(upcast_method_name); Delete(cptr_method_name); - Delete(wname); - Delete(upcast_method); + Delete(interface_code); Delete(c_baseclass); } Delete(keys); } + /* ----------------------------------------------------------------------------- + * upcastsCode() + * + * Add code for C++ casting to base class + * ----------------------------------------------------------------------------- */ + + void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + String *wname = Swig_name_wrapper(upcast_method_name); + + Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); + Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method_name); + + Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); + + if (smart) { + SwigType *bsmart = Copy(smart); + SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); + SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); + Replaceall(bsmart, rclassname, rbaseclass); + Delete(rclassname); + Delete(rbaseclass); + String *smartnamestr = SwigType_namestr(smart); + String *bsmartnamestr = SwigType_namestr(bsmart); + Printv(upcasts_code, + "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", + " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" + "}\n", "\n", NIL); + Delete(bsmartnamestr); + Delete(smartnamestr); + Delete(bsmart); + } else { + Printv(upcasts_code, + "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", + " return (", c_baseclass, " *)jarg1;\n" + "}\n", "\n", NIL); + } + Delete(wname); + } + /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ @@ -1743,6 +1773,7 @@ public: SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); + SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure C# classes Node *attributes = NewHash(); @@ -1777,7 +1808,7 @@ public: } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) - addInterfaceNameAndUpcasts(interface_list, interface_upcasts, interface_bases, c_classname); + addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) @@ -1952,43 +1983,13 @@ public: Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); - // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - SwigType *smart = Swig_cparse_smartptr(n); - String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - String *wname = Swig_name_wrapper(upcast_method); - - Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); - Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method); - - Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); - - if (smart) { - SwigType *bsmart = Copy(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - Replaceall(bsmart, rclassname, rbaseclass); - Delete(rclassname); - Delete(rbaseclass); - String *smartnamestr = SwigType_namestr(smart); - String *bsmartnamestr = SwigType_namestr(bsmart); - Printv(upcasts_code, - "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", - " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" - "}\n", "\n", NIL); - Delete(bsmartnamestr); - Delete(smartnamestr); - Delete(bsmart); - } else { - Printv(upcasts_code, - "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", - " return (", c_baseclass, " *)jarg1;\n" - "}\n", "\n", NIL); - } - Delete(wname); - Delete(upcast_method); - Delete(smart); + String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + Delete(upcast_method_name); } + + Delete(smart); Delete(baseclass); } diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 942bc0319..1fe26dd9a 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1768,7 +1768,7 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); @@ -1791,32 +1791,62 @@ public: Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); - String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); - String *jniname = makeValidJniName(upcast_method); - String *wname = Swig_name_wrapper(jniname); - - Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method); - Replaceall(imclass_cppcasts_code, "$javaclassname", proxy_class_name); - - Printv(upcasts_code, - "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", - " jlong baseptr = 0;\n" - " (void)jenv;\n" - " (void)jcls;\n" - " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" - " return baseptr;\n" - "}\n", "\n", NIL); - - Delete(interface_code); + String *upcast_method_name = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + Delete(upcast_method_name); Delete(cptr_method_name); - Delete(wname); - Delete(jniname); - Delete(upcast_method); + Delete(interface_code); Delete(c_baseclass); } Delete(keys); } + /* ----------------------------------------------------------------------------- + * upcastsCode() + * + * Add code for C++ casting to base class + * ----------------------------------------------------------------------------- */ + + void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + String *jniname = makeValidJniName(upcast_method_name); + String *wname = Swig_name_wrapper(jniname); + Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); + if (smart) { + SwigType *bsmart = Copy(smart); + SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); + SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); + Replaceall(bsmart, rclassname, rbaseclass); + Delete(rclassname); + Delete(rbaseclass); + String *smartnamestr = SwigType_namestr(smart); + String *bsmartnamestr = SwigType_namestr(bsmart); + Printv(upcasts_code, + "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", + " jlong baseptr = 0;\n" + " ", smartnamestr, " *argp1;\n" + " (void)jenv;\n" + " (void)jcls;\n" + " argp1 = *(", smartnamestr, " **)&jarg1;\n" + " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" + " return baseptr;\n" + "}\n", "\n", NIL); + Delete(bsmartnamestr); + Delete(smartnamestr); + Delete(bsmart); + } else { + Printv(upcasts_code, + "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", + " jlong baseptr = 0;\n" + " (void)jenv;\n" + " (void)jcls;\n" + " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" + " return baseptr;\n" + "}\n", "\n", NIL); + } + Delete(wname); + Delete(jniname); + } + /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ @@ -1831,6 +1861,7 @@ public: SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); + SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure Java classes Node *attributes = NewHash(); @@ -1866,7 +1897,7 @@ public: Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) - addInterfaceNameAndUpcasts(interface_list, interface_upcasts, interface_bases, c_classname); + addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) @@ -1974,50 +2005,13 @@ public: Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); - // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - SwigType *smart = Swig_cparse_smartptr(n); - String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - String *jniname = makeValidJniName(upcast_method); - String *wname = Swig_name_wrapper(jniname); - Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method); - if (smart) { - SwigType *bsmart = Copy(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - Replaceall(bsmart, rclassname, rbaseclass); - Delete(rclassname); - Delete(rbaseclass); - String *smartnamestr = SwigType_namestr(smart); - String *bsmartnamestr = SwigType_namestr(bsmart); - Printv(upcasts_code, - "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", - " jlong baseptr = 0;\n" - " ", smartnamestr, " *argp1;\n" - " (void)jenv;\n" - " (void)jcls;\n" - " argp1 = *(", smartnamestr, " **)&jarg1;\n" - " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" - " return baseptr;\n" - "}\n", "\n", NIL); - Delete(bsmartnamestr); - Delete(smartnamestr); - Delete(bsmart); - } else { - Printv(upcasts_code, - "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", - " jlong baseptr = 0;\n" - " (void)jenv;\n" - " (void)jcls;\n" - " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" - " return baseptr;\n" - "}\n", "\n", NIL); - } - Delete(wname); - Delete(jniname); - Delete(upcast_method); - Delete(smart); + String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + Delete(upcast_method_name); } + + Delete(smart); Delete(baseclass); }