%module cpp11_using_constructor

// Note: this testcase is also used by cpp11_director_using_constructor.i

#ifdef SWIGLUA
// Lua does now have a separate integer type, but didn't used to
// and SWIG doesn't yet know about it (see #1918) so for now suppress
// warnings about functions with overloads on int vs double, etc.
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) TemplateConstructor1Base::TemplateConstructor1Base(double,char const *);
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) TemplateConstructor1Derived::TemplateConstructor1Derived(double,char const *);
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) TemplateConstructor1Base::TemplateConstructor1Base(double,char const *);
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) TemplateConstructor1Derived::TemplateConstructor1Derived(double,char const *);
#endif

%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;
};

// Deeper inheritance chain
struct DeepBase1 {
  virtual ~DeepBase1() {}
  DeepBase1(int i) {}
};
struct DeepBase2 : DeepBase1 {
  DeepBase2(int i, int j) : DeepBase1(i+j) {}
  using DeepBase1::DeepBase1;
};
struct DeepBase3 : DeepBase2 {
  DeepBase3(int i, int j, int k) : DeepBase2(i+j+k) {}
  using DeepBase2::DeepBase2;
};

struct DeepProtectedBase1 {
  virtual ~DeepProtectedBase1() {}
protected:
  DeepProtectedBase1(int i) {}
};
struct DeepProtectedBase2 : DeepProtectedBase1 {
protected:
  DeepProtectedBase2(int i, int j) : DeepProtectedBase1(i+j) {}
  using DeepProtectedBase1::DeepProtectedBase1;
};
struct DeepProtectedBase3 : DeepProtectedBase2 {
  DeepProtectedBase3(int i, int j, int k) : DeepProtectedBase2(i+j+k) {}
  using DeepProtectedBase2::DeepProtectedBase2;
};

void cpptester() {
    DeepBase3 db3 = DeepBase3(11);
    db3 = DeepBase3(11, 22);
    db3 = DeepBase3(11, 22, 33);
    DeepProtectedBase3 dbp3 = DeepProtectedBase3(11, 22, 33);
}

%}

// 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;
};
%}

%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 (public)
%inline %{
struct TemplateConstructor1Base {
  virtual ~TemplateConstructor1Base() {}
public:
  // No implicit constructor
  template <typename T> TemplateConstructor1Base(T t, const char *s) {}
  template <typename T> void template_method(T t, const char *s) {}
  virtual void normal_method() {}
};
%}

%template(TemplateConstructor1Base) TemplateConstructor1Base::TemplateConstructor1Base<int>;
%template(TemplateConstructor1Base) TemplateConstructor1Base::TemplateConstructor1Base<const char *>;
%template(TemplateConstructor1Base) TemplateConstructor1Base::TemplateConstructor1Base<double>;
%template(template_method) TemplateConstructor1Base::template_method<int>;
%template(template_method) TemplateConstructor1Base::template_method<const char *>;

%inline %{
struct TemplateConstructor1Derived : TemplateConstructor1Base {
  using TemplateConstructor1Base::normal_method;
 // Note: The two using declarations below automatically introduce the templated names without an explicit %template(), see allocate.cxx
  using TemplateConstructor1Base::TemplateConstructor1Base;
  using TemplateConstructor1Base::template_method;
};
%}

// Templated constructors (protected)
%inline %{
struct TemplateConstructor2Base {
  virtual ~TemplateConstructor2Base() {}
protected:
  // No implicit constructor
  template <typename T> TemplateConstructor2Base(T t, const char *s) {}
  template <typename T> void template_method(T t, const char *s) {}
  virtual void normal_method() {}
};
%}

%template(TemplateConstructor2Base) TemplateConstructor2Base::TemplateConstructor2Base<int>;
%template(TemplateConstructor2Base) TemplateConstructor2Base::TemplateConstructor2Base<const char *>;
%template(TemplateConstructor2Base) TemplateConstructor2Base::TemplateConstructor2Base<double>;
%template(template_method) TemplateConstructor2Base::template_method<int>;
%template(template_method) TemplateConstructor2Base::template_method<const char *>;

%inline %{
struct TemplateConstructor2Derived : TemplateConstructor2Base {
  using TemplateConstructor2Base::normal_method;
  using TemplateConstructor2Base::TemplateConstructor2Base; // introduces protected constructors
  using TemplateConstructor2Base::template_method; // introduces public templated methods
  TemplateConstructor2Derived() : TemplateConstructor2Base(0, "") {} // provide one public constructor for testing
};
%}
