| // This is a copy of the multiple_inheritance_abstract test and extended for testing %shared_ptr and %interface_impl | |
| %module(ruby_minherit="1") multiple_inheritance_shared_ptr | |
| %warnfilter(SWIGWARN_D_MULTIPLE_INHERITANCE, | |
| SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance */ | |
| // 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 <boost_shared_ptr.i> | |
| %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(, Space::ABase1) | |
| SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(, Space::CBase1) | |
| SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(, 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 <boost/shared_ptr.hpp> | |
| 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> ABase1_SharedPtr; | |
| typedef boost::shared_ptr<CBase1> CBase1_SharedPtr; | |
| typedef boost::shared_ptr<CBase2> CBase2_SharedPtr; | |
| typedef boost::shared_ptr<Derived1> Derived1_SharedPtr; | |
| typedef boost::shared_ptr<Derived2> Derived2_SharedPtr; | |
| typedef boost::shared_ptr<Derived3> Derived3_SharedPtr; | |
| typedef boost::shared_ptr<Bottom1> Bottom1_SharedPtr; | |
| typedef boost::shared_ptr<Bottom2> Bottom2_SharedPtr; | |
| typedef boost::shared_ptr<Bottom3> 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 const pointer references | |
| CBase1 *const&MakeConstPtrRefDerived1_CBase1() { | |
| static CBase1 *d = new Derived1(); | |
| return d; | |
| } | |
| CBase2 *const&MakeConstPtrRefDerived1_CBase2() { | |
| static CBase2 *const& d = new Derived1(); | |
| return d; | |
| } | |
| CBase1 *const&MakeConstPtrRefDerived2_CBase1() { | |
| static CBase1 *const& d = new Derived2(); | |
| return d; | |
| } | |
| ABase1 *const&MakeConstPtrRefDerived2_ABase1() { | |
| static ABase1 *const& d = new Derived2(); | |
| return d; | |
| } | |
| ABase1 *const&MakeConstPtrRefDerived3_ABase1() { | |
| static ABase1 *const& d = new Derived3(); | |
| return d; | |
| } | |
| CBase1 *const&MakeConstPtrRefDerived3_CBase1() { | |
| static CBase1 *const& d = new Derived3(); | |
| return d; | |
| } | |
| CBase2 *const&MakeConstPtrRefDerived3_CBase2() { | |
| static CBase2 *const& d = new Derived3(); | |
| 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; | |
| } | |
| } | |
| %} |