mirror of https://github.com/swig/swig
508 lines
13 KiB
OpenEdge ABL
508 lines
13 KiB
OpenEdge ABL
%module cpp11_using_constructor
|
|
|
|
// Note: this testcase is also used by cpp11_director_using_constructor.i
|
|
|
|
%inline %{
|
|
// Public base constructors
|
|
struct PublicBase1 {
|
|
virtual ~PublicBase1() {}
|
|
PublicBase1(int i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
struct PublicDerived1 : PublicBase1 {
|
|
using PublicBase1::PublicBase1;
|
|
using PublicBase1::meth;
|
|
};
|
|
|
|
struct PublicBase2 {
|
|
virtual ~PublicBase2() {}
|
|
PublicBase2(int i, const char* s) {}
|
|
PublicBase2() {}
|
|
virtual void meth() {}
|
|
};
|
|
struct PublicDerived2 : PublicBase2 {
|
|
using PublicBase2::PublicBase2;
|
|
using PublicBase2::meth;
|
|
};
|
|
|
|
struct PublicBase3 {
|
|
virtual ~PublicBase3() {}
|
|
PublicBase3(int i, const char* s) {}
|
|
PublicBase3() = default;
|
|
virtual void meth() {}
|
|
};
|
|
struct PublicDerived3 : PublicBase3 {
|
|
using PublicBase3::PublicBase3;
|
|
using PublicBase3::meth;
|
|
};
|
|
|
|
struct PublicBase4 {
|
|
virtual ~PublicBase4() {}
|
|
PublicBase4() = default;
|
|
virtual void meth() {}
|
|
};
|
|
struct PublicDerived4 : PublicBase4 {
|
|
using PublicBase4::PublicBase4;
|
|
using PublicBase4::meth;
|
|
};
|
|
|
|
struct PublicBase5 {
|
|
virtual ~PublicBase5() {}
|
|
// implicit constructor
|
|
virtual void meth() {}
|
|
};
|
|
struct PublicDerived5 : PublicBase5 {
|
|
using PublicBase5::PublicBase5;
|
|
using PublicBase5::meth;
|
|
};
|
|
|
|
// Protected base constructors
|
|
struct ProtectedBase1 {
|
|
virtual ~ProtectedBase1() {}
|
|
protected:
|
|
ProtectedBase1(int i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
struct ProtectedDerived1 : ProtectedBase1 {
|
|
using ProtectedBase1::ProtectedBase1;
|
|
using ProtectedBase1::meth;
|
|
};
|
|
|
|
struct ProtectedBase2 {
|
|
virtual ~ProtectedBase2() {}
|
|
protected:
|
|
ProtectedBase2(int i, const char* s) {}
|
|
ProtectedBase2() {}
|
|
virtual void meth() {}
|
|
};
|
|
struct ProtectedDerived2 : ProtectedBase2 {
|
|
using ProtectedBase2::ProtectedBase2;
|
|
using ProtectedBase2::meth;
|
|
};
|
|
|
|
struct ProtectedBase3 {
|
|
virtual ~ProtectedBase3() {}
|
|
protected:
|
|
ProtectedBase3(int i, const char* s) {}
|
|
ProtectedBase3() = default;
|
|
virtual void meth() {}
|
|
};
|
|
struct ProtectedDerived3 : ProtectedBase3 {
|
|
using ProtectedBase3::ProtectedBase3;
|
|
using ProtectedBase3::meth;
|
|
};
|
|
|
|
struct ProtectedBase4 {
|
|
virtual ~ProtectedBase4() {}
|
|
protected:
|
|
ProtectedBase4() = default;
|
|
virtual void meth() {}
|
|
};
|
|
struct ProtectedDerived4 : ProtectedBase4 {
|
|
using ProtectedBase4::ProtectedBase4;
|
|
using ProtectedBase4::meth;
|
|
};
|
|
|
|
struct ProtectedBase5 {
|
|
virtual ~ProtectedBase5() {}
|
|
// implicit constructor
|
|
protected:
|
|
virtual void meth() {}
|
|
};
|
|
struct ProtectedDerived5 : ProtectedBase5 {
|
|
using ProtectedBase5::ProtectedBase5;
|
|
using ProtectedBase5::meth;
|
|
};
|
|
|
|
// Mix of public and overloaded constructors
|
|
struct MixedBase1 {
|
|
virtual ~MixedBase1() {}
|
|
MixedBase1(int i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
struct MixedDerived1a : MixedBase1 {
|
|
MixedDerived1a() : MixedBase1(0, 0) {}
|
|
using MixedBase1::MixedBase1;
|
|
using MixedBase1::meth;
|
|
};
|
|
struct MixedDerived1b : MixedBase1 {
|
|
using MixedBase1::MixedBase1;
|
|
MixedDerived1b() : MixedBase1(0, 0) {}
|
|
using MixedBase1::meth;
|
|
};
|
|
|
|
struct MixedBase2 {
|
|
virtual ~MixedBase2() {}
|
|
MixedBase2(int i, const char* s) {}
|
|
MixedBase2() {}
|
|
virtual void meth() {}
|
|
};
|
|
struct MixedDerived2a : MixedBase2 {
|
|
MixedDerived2a(int i, const char* s) {}
|
|
using MixedBase2::MixedBase2;
|
|
using MixedBase2::meth;
|
|
};
|
|
struct MixedDerived2b : MixedBase2 {
|
|
using MixedBase2::MixedBase2;
|
|
MixedDerived2b(int i, const char* s) {}
|
|
using MixedBase2::meth;
|
|
};
|
|
struct MixedDerived2c : MixedBase2 {
|
|
using MixedBase2::MixedBase2;
|
|
MixedDerived2c(int ii) : MixedBase2(ii, 0) {}
|
|
using MixedBase2::meth;
|
|
};
|
|
struct MixedDerived2d : MixedBase2 {
|
|
MixedDerived2d(int ii) : MixedBase2(ii, 0) {}
|
|
using MixedBase2::MixedBase2;
|
|
using MixedBase2::meth;
|
|
};
|
|
|
|
struct MixedBase3 {
|
|
virtual ~MixedBase3() {}
|
|
MixedBase3(int i, const char* s) {}
|
|
MixedBase3() = default;
|
|
virtual void meth() {}
|
|
};
|
|
struct MixedDerived3a : MixedBase3 {
|
|
MixedDerived3a(int i, const char* s) {}
|
|
using MixedBase3::MixedBase3;
|
|
using MixedBase3::meth;
|
|
};
|
|
struct MixedDerived3b : MixedBase3 {
|
|
using MixedBase3::MixedBase3;
|
|
MixedDerived3b(int i, const char* s) {}
|
|
using MixedBase3::meth;
|
|
};
|
|
struct MixedDerived3c : MixedBase3 {
|
|
using MixedBase3::MixedBase3;
|
|
MixedDerived3c(int ii) : MixedBase3(ii, 0) {}
|
|
using MixedBase3::meth;
|
|
};
|
|
struct MixedDerived3d : MixedBase3 {
|
|
MixedDerived3d(int ii) : MixedBase3(ii, 0) {}
|
|
using MixedBase3::MixedBase3;
|
|
using MixedBase3::meth;
|
|
};
|
|
|
|
struct MixedBase4 {
|
|
virtual ~MixedBase4() {}
|
|
virtual void meth() {}
|
|
};
|
|
struct MixedDerived4a : MixedBase4 {
|
|
MixedDerived4a(int i, const char* s) {}
|
|
using MixedBase4::MixedBase4;
|
|
using MixedBase4::meth;
|
|
};
|
|
struct MixedDerived4b : MixedBase4 {
|
|
using MixedBase4::MixedBase4;
|
|
MixedDerived4b(int i, const char* s) {}
|
|
using MixedBase4::meth;
|
|
};
|
|
struct MixedDerived4c : MixedBase4 {
|
|
using MixedBase4::MixedBase4;
|
|
MixedDerived4c(int ii) {}
|
|
using MixedBase4::meth;
|
|
};
|
|
struct MixedDerived4d : MixedBase4 {
|
|
MixedDerived4d(int ii) {}
|
|
using MixedBase4::MixedBase4;
|
|
using MixedBase4::meth;
|
|
};
|
|
struct MixedDerived4e : MixedBase4 {
|
|
MixedDerived4e() {}
|
|
using MixedBase4::MixedBase4;
|
|
using MixedBase4::meth;
|
|
};
|
|
struct MixedDerived4f : MixedBase4 {
|
|
using MixedBase4::MixedBase4;
|
|
MixedDerived4f() {}
|
|
using MixedBase4::meth;
|
|
};
|
|
|
|
// Mix of protected base constructors and overloading
|
|
struct ProotBase1 {
|
|
virtual ~ProotBase1() {}
|
|
ProotBase1() {}
|
|
protected:
|
|
ProotBase1(int i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
struct ProotDerived1a : ProotBase1 {
|
|
using ProotBase1::ProotBase1;
|
|
using ProotBase1::meth;
|
|
};
|
|
struct ProotDerived1b : ProotBase1 {
|
|
using ProotBase1::ProotBase1;
|
|
ProotDerived1b(int i, const char* s) : ProotBase1(i, s) {}
|
|
using ProotBase1::meth;
|
|
};
|
|
struct ProotDerived1c : ProotBase1 {
|
|
ProotDerived1c(int i, const char* s) : ProotBase1(i, s) {}
|
|
using ProotBase1::ProotBase1;
|
|
using ProotBase1::meth;
|
|
};
|
|
struct ProotDerived1d : ProotBase1 {
|
|
using ProotBase1::ProotBase1;
|
|
ProotDerived1d(int ii) : ProotBase1(ii, 0) {}
|
|
using ProotBase1::meth;
|
|
};
|
|
struct ProotDerived1e : ProotBase1 {
|
|
ProotDerived1e(int ii) : ProotBase1(ii, 0) {}
|
|
using ProotBase1::ProotBase1;
|
|
using ProotBase1::meth;
|
|
};
|
|
|
|
struct ProotBase2 {
|
|
virtual ~ProotBase2() {}
|
|
protected:
|
|
ProotBase2(int i, const char* s) {}
|
|
ProotBase2() {}
|
|
virtual void meth() {}
|
|
};
|
|
struct ProotDerived2a : ProotBase2 {
|
|
ProotDerived2a(int i, const char* s) {}
|
|
using ProotBase2::ProotBase2;
|
|
using ProotBase2::meth;
|
|
};
|
|
struct ProotDerived2b : ProotBase2 {
|
|
using ProotBase2::ProotBase2;
|
|
ProotDerived2b(int i, const char* s) {}
|
|
using ProotBase2::meth;
|
|
};
|
|
struct ProotDerived2c : ProotBase2 {
|
|
ProotDerived2c(int i, const char* s) {}
|
|
ProotDerived2c() {}
|
|
using ProotBase2::ProotBase2;
|
|
using ProotBase2::meth;
|
|
};
|
|
struct ProotDerived2d : ProotBase2 {
|
|
ProotDerived2d(int i, const char* s) {}
|
|
using ProotBase2::ProotBase2;
|
|
ProotDerived2d() {}
|
|
using ProotBase2::meth;
|
|
};
|
|
struct ProotDerived2e : ProotBase2 {
|
|
using ProotBase2::ProotBase2;
|
|
ProotDerived2e(int i, const char* s) {}
|
|
ProotDerived2e() {}
|
|
using ProotBase2::meth;
|
|
};
|
|
struct ProotDerived2f : ProotBase2 {
|
|
using ProotBase2::ProotBase2;
|
|
ProotDerived2f(int i, const char* s) {}
|
|
ProotDerived2f() {}
|
|
ProotDerived2f(int) {}
|
|
using ProotBase2::meth;
|
|
};
|
|
%}
|
|
|
|
// Missing base
|
|
%warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS, SWIGWARN_PARSE_USING_UNDEF) HiddenDerived1;
|
|
%{
|
|
struct HiddenBase1 {
|
|
virtual ~HiddenBase1() {}
|
|
HiddenBase1(int i, const char* s) {}
|
|
HiddenBase1() {}
|
|
virtual void meth() {}
|
|
};
|
|
%}
|
|
%inline %{
|
|
struct HiddenDerived1 : HiddenBase1 {
|
|
using HiddenBase1::HiddenBase1;
|
|
using HiddenBase1::meth;
|
|
};
|
|
%}
|
|
|
|
#if 0 // not yet working
|
|
// Typedefs and using declarations
|
|
%inline %{
|
|
struct TypedefBase1 {
|
|
TypedefBase1(int i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
struct TypedefDerived1 : TypedefBase1 {
|
|
typedef TypedefBase1 Superclass;
|
|
using Superclass::TypedefBase1;
|
|
};
|
|
void tester() {
|
|
TypedefDerived1 td(0, "hi");
|
|
td.meth();
|
|
}
|
|
%}
|
|
#endif
|
|
|
|
%inline %{
|
|
// Templates and public base constructors (derive from non-template)
|
|
template<typename T>
|
|
struct TemplatePublicDerived1 : PublicBase1 {
|
|
using PublicBase1::PublicBase1;
|
|
using PublicBase1::meth;
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplatePublicDerived2 : PublicBase2 {
|
|
using PublicBase2::PublicBase2;
|
|
using PublicBase2::meth;
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplatePublicDerived3 : PublicBase3 {
|
|
using PublicBase3::PublicBase3;
|
|
using PublicBase3::meth;
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplatePublicDerived4 : PublicBase4 {
|
|
using PublicBase4::PublicBase4;
|
|
using PublicBase4::meth;
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplatePublicDerived5 : PublicBase5 {
|
|
using PublicBase5::PublicBase5;
|
|
using PublicBase5::meth;
|
|
};
|
|
%}
|
|
%template(TemplatePublicDerived1Int) TemplatePublicDerived1<int>;
|
|
%template(TemplatePublicDerived2Int) TemplatePublicDerived2<int>;
|
|
%template(TemplatePublicDerived3Int) TemplatePublicDerived3<int>;
|
|
%template(TemplatePublicDerived4Int) TemplatePublicDerived4<int>;
|
|
%template(TemplatePublicDerived5Int) TemplatePublicDerived5<int>;
|
|
|
|
%inline %{
|
|
// Templates and public base constructors (derive from template)
|
|
template<typename T>
|
|
struct TemplPublicBase1 {
|
|
virtual ~TemplPublicBase1() {}
|
|
TemplPublicBase1(T i, const char* s) {}
|
|
virtual void meth() {}
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplPublicBase2 {
|
|
virtual ~TemplPublicBase2() {}
|
|
TemplPublicBase2(T i, const char* s) {}
|
|
TemplPublicBase2() {}
|
|
virtual void meth() {}
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplPublicBase3 {
|
|
virtual ~TemplPublicBase3() {}
|
|
TemplPublicBase3(T i, const char* s) {}
|
|
TemplPublicBase3() = default;
|
|
virtual void meth() {}
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplPublicBase4 {
|
|
virtual ~TemplPublicBase4() {}
|
|
TemplPublicBase4() = default;
|
|
virtual void meth() {}
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplPublicBase5 {
|
|
virtual ~TemplPublicBase5() {}
|
|
// implicit constructor
|
|
virtual void meth() {}
|
|
};
|
|
|
|
template<typename T>
|
|
struct TemplPublicBase6 {
|
|
#ifdef SWIG
|
|
// Destructor and constructor declared with template parameters (not allowed in C++20 and later though)
|
|
virtual ~TemplPublicBase6<T>() {}
|
|
TemplPublicBase6<T>(T i, const char* s) {}
|
|
TemplPublicBase6<T>() = default;
|
|
#else
|
|
virtual ~TemplPublicBase6() {}
|
|
TemplPublicBase6(T i, const char* s) {}
|
|
TemplPublicBase6() = default;
|
|
#endif
|
|
virtual void meth() {}
|
|
};
|
|
%}
|
|
|
|
%template(TemplPublicBase1Int) TemplPublicBase1<int>;
|
|
%template(TemplPublicBase2Int) TemplPublicBase2<int>;
|
|
%template(TemplPublicBase3Int) TemplPublicBase3<int>;
|
|
%template(TemplPublicBase4Int) TemplPublicBase4<int>;
|
|
%template(TemplPublicBase5Int) TemplPublicBase5<int>;
|
|
%template(TemplPublicBase6Int) TemplPublicBase6<int>;
|
|
|
|
%inline %{
|
|
template<typename T>
|
|
struct TemplPublicDerived1 : TemplPublicBase1<T> {
|
|
using TemplPublicBase1<T>::TemplPublicBase1;
|
|
using TemplPublicBase1<T>::meth;
|
|
};
|
|
template<typename T>
|
|
struct TemplPublicDerived2 : TemplPublicBase2<T> {
|
|
using TemplPublicBase2<T>::TemplPublicBase2;
|
|
using TemplPublicBase2<T>::meth;
|
|
};
|
|
template<typename T>
|
|
struct TemplPublicDerived3 : TemplPublicBase3<T> {
|
|
using TemplPublicBase3<T>::TemplPublicBase3;
|
|
using TemplPublicBase3<T>::meth;
|
|
};
|
|
template<typename T>
|
|
struct TemplPublicDerived4 : TemplPublicBase4<T> {
|
|
using TemplPublicBase4<T>::TemplPublicBase4;
|
|
using TemplPublicBase4<T>::meth;
|
|
};
|
|
template<typename T>
|
|
struct TemplPublicDerived5 : TemplPublicBase5<T> {
|
|
using TemplPublicBase5<T>::TemplPublicBase5;
|
|
using TemplPublicBase5<T>::meth;
|
|
};
|
|
template<typename T>
|
|
struct TemplPublicDerived6 : TemplPublicBase6<T> {
|
|
using TemplPublicBase6<T>::TemplPublicBase6;
|
|
using TemplPublicBase6<T>::meth;
|
|
};
|
|
%}
|
|
|
|
%template(TemplPublicDerived1Int) TemplPublicDerived1<int>;
|
|
%template(TemplPublicDerived2Int) TemplPublicDerived2<int>;
|
|
%template(TemplPublicDerived3Int) TemplPublicDerived3<int>;
|
|
%template(TemplPublicDerived4Int) TemplPublicDerived4<int>;
|
|
%template(TemplPublicDerived5Int) TemplPublicDerived5<int>;
|
|
%template(TemplPublicDerived6Int) TemplPublicDerived6<int>;
|
|
|
|
|
|
// Templated constructors
|
|
%inline %{
|
|
struct TemplateConstructor1Base {
|
|
virtual ~TemplateConstructor1Base() {}
|
|
// No implicit constructor
|
|
template <typename T> TemplateConstructor1Base(const T &t, const char *s) {}
|
|
virtual void meth() {}
|
|
};
|
|
%}
|
|
|
|
%template(TemplateConstructor1Base) TemplateConstructor1Base::TemplateConstructor1Base<int>;
|
|
|
|
%inline %{
|
|
struct TemplateConstructor1Derived : TemplateConstructor1Base {
|
|
using TemplateConstructor1Base::TemplateConstructor1Base;
|
|
using TemplateConstructor1Base::meth;
|
|
};
|
|
%}
|
|
|
|
// TODO: Missing constructors, below probably ought to work using instantiation as follows:
|
|
//%template(TemplateConstructor1Derived) TemplateConstructor1Derived::TemplateConstructor1Derived<int>;
|
|
|
|
%{
|
|
void tester() {
|
|
TemplateConstructor1Derived tc = TemplateConstructor1Derived(123, "hi");
|
|
tc.meth();
|
|
// Note not valid c++:
|
|
// TemplateConstructor1Derived tc2 = TemplateConstructor1Derived::TemplateConstructor1Derived<int>(123, "hi");
|
|
}
|
|
%}
|
|
|
|
// Note that templated methods also not working with using declarations for inheriting from base templated methods
|