mirror of https://github.com/swig/swig
529 lines
14 KiB
OpenEdge ABL
529 lines
14 KiB
OpenEdge ABL
// 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;
|
|
}
|
|
}
|
|
|
|
%}
|