| /* This testcase checks whether SWIG correctly parses and generates the code | |
| for variadic templates. This covers the variadic number of arguments inside | |
| the template brackets, new functions sizeof... and multiple inheritance | |
| using variadic number of classes. | |
| */ | |
| %module cpp11_variadic_templates | |
| %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE, | |
| SWIGWARN_CSHARP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_D_MULTIPLE_INHERITANCE, | |
| SWIGWARN_PHP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_RUBY_MULTIPLE_INHERITANCE) MultiInherit; | |
| %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE, | |
| SWIGWARN_CSHARP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_D_MULTIPLE_INHERITANCE, | |
| SWIGWARN_PHP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_RUBY_MULTIPLE_INHERITANCE) NumerousInherit; | |
| %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE, | |
| SWIGWARN_CSHARP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_D_MULTIPLE_INHERITANCE, | |
| SWIGWARN_PHP_MULTIPLE_INHERITANCE, | |
| SWIGWARN_RUBY_MULTIPLE_INHERITANCE) LotsInherit; | |
| //////////////////////// | |
| // Variadic templates // | |
| //////////////////////// | |
| %inline %{ | |
| #include <vector> | |
| #include <string> | |
| #include <map> | |
| template<typename... Values> | |
| class MultiArgs { | |
| }; | |
| class MultiArgs<int, std::vector<int>, std::map<std::string, std::vector<int>>> multiArgs; | |
| %} | |
| %template (MultiArgs1) MultiArgs<int, std::vector<int>, std::map<std::string, std::vector<int>>>; | |
| //////////////////////// | |
| // Variadic sizeof... // | |
| //////////////////////// | |
| %inline %{ | |
| template<typename... Args> struct SizeOf { | |
| static const int size = sizeof...(Args); | |
| }; | |
| %} | |
| %template (SizeOf0) SizeOf<>; | |
| %template (SizeOf1) SizeOf<int>; | |
| %template (SizeOf2) SizeOf<int, int>; | |
| %template (SizeOf3) SizeOf<int, int, int>; | |
| ////////////////////////// | |
| // Variadic inheritance // | |
| ////////////////////////// | |
| %inline %{ | |
| class A { | |
| public: | |
| A() { | |
| a = 100; | |
| } | |
| virtual ~A() {} | |
| int a; | |
| }; | |
| class B { | |
| public: | |
| B() { | |
| b = 200; | |
| } | |
| virtual ~B() {} | |
| int b; | |
| }; | |
| class C { | |
| public: | |
| C() { | |
| c = 300; | |
| } | |
| virtual ~C() {} | |
| int c; | |
| }; | |
| class D { | |
| public: | |
| D() { | |
| d = 400; | |
| } | |
| virtual ~D() {} | |
| int d; | |
| }; | |
| template <typename... BaseClasses> class MultiInherit : public BaseClasses... { | |
| public: | |
| MultiInherit(BaseClasses&... baseClasses) : BaseClasses(baseClasses)... {} | |
| void MultiInstanceMethod(BaseClasses&... baseClasses) {} | |
| static void MultiStaticMethod(BaseClasses&... baseClasses) {} | |
| int InstanceMethod() { return 123; } | |
| static int StaticMethod() { return 456; } | |
| }; | |
| %} | |
| %template (MultiInherit0) MultiInherit<>; | |
| %template (MultiInherit1) MultiInherit<A>; | |
| %template (MultiInherit2) MultiInherit<A,B>; | |
| %template (MultiInherit3) MultiInherit<A,B,C>; | |
| %inline %{ | |
| template <typename... BaseClasses> class NumerousInherit : public BaseClasses... { | |
| public: | |
| NumerousInherit(int i, BaseClasses&... baseClasses) : BaseClasses(baseClasses)... {} | |
| void NumerousInstanceMethod(int i, BaseClasses&... baseClasses) {} | |
| static void NumerousStaticMethod(int i, BaseClasses&... baseClasses) {} | |
| int InstanceMethod() { return 123; } | |
| static int StaticMethod() { return 456; } | |
| }; | |
| %} | |
| %template (NumerousInherit0) NumerousInherit<>; | |
| %template (NumerousInherit1) NumerousInherit<A>; | |
| %template (NumerousInherit2) NumerousInherit<A,B>; | |
| %template (NumerousInherit3) NumerousInherit<A,B,C>; | |
| %inline %{ | |
| template <typename T, typename... BaseClasses> class LotsInherit : public T, public BaseClasses... { | |
| public: | |
| LotsInherit(T t, BaseClasses&... baseClasses) : BaseClasses(baseClasses)... {} | |
| void LotsInstanceMethod(T t, BaseClasses&... baseClasses) {} | |
| static void LotsStaticMethod(T t, BaseClasses&... baseClasses) {} | |
| int InstanceMethod() { return 123; } | |
| static int StaticMethod() { return 456; } | |
| }; | |
| %} | |
| %template (LotsInherit1) LotsInherit<A>; | |
| %template (LotsInherit2) LotsInherit<A,B>; | |
| %template (LotsInherit3) LotsInherit<A,B,C>; | |
| %template (LotsInherit4) LotsInherit<A,B,C,D>; | |
| %inline %{ | |
| struct KlassMemFuncs { | |
| int memfunc0() { return 0; } | |
| int memfunc1() { return 1; } | |
| int memfunc2() { return 2; } | |
| int memfunc3() { return 3; } | |
| }; | |
| template <typename... V> struct VariadicParms { | |
| void ParmsVal(V... vparms_v) {} | |
| void ParmsPtr(V*... vparms_p) {} | |
| void ParmsPtrRef(V*&... vparms_pr) {} | |
| void ParmsPtrRValueRef(V*&&... vparms_rvr) {} | |
| void ParmsRef(V&... vparms_r) {} | |
| void ParmsRValueRef(V&&... vparms_r) {} | |
| void ParmsConstRef(const V&... vparms_cr) {} | |
| // Conventional unnamed parameter function ptr | |
| void ParmsFuncPtrVal(int (*)(V...)) {} | |
| void ParmsFuncPtrPtr(int (*)(V*...)) {} | |
| void ParmsFuncPtrPtrRef(int (*)(V*&...)) {} | |
| void ParmsFuncPtrPtrRValueRef(int (*)(V*&&...)) {} | |
| void ParmsFuncPtrRef(int (*)(V&...)) {} | |
| void ParmsFuncPtrRValueRef(int (*)(V&&...)) {} | |
| void ParmsFuncPtrConstRef(int (*)(const V&...)) {} | |
| // Unconventional unnamed parameter function ptr | |
| void ParmsFuncUnnamedVal(int (V...)) {} | |
| void ParmsFuncUnnamedPtr(int (V*...)) {} | |
| void ParmsFuncUnnamedPtrRef(int (V*&...)) {} | |
| void ParmsFuncUnnamedPtrRValueRef(int (V*&&...)) {} | |
| void ParmsFuncUnnamedRef(int (V&...)) {} | |
| void ParmsFuncUnnamedRValueRef(int (V&&...)) {} | |
| void ParmsFuncUnnamedConstRef(int (const V&...)) {} | |
| // Unconventional named parameter function ptr | |
| void ParmsFuncNamedVal(int fn(V...)) {} | |
| void ParmsFuncNamedPtr(int fn(V*...)) {} | |
| void ParmsFuncNamedPtrRef(int fn(V*&...)) {} | |
| void ParmsFuncNamedPtrRValueRef(int fn(V*&&...)) {} | |
| void ParmsFuncNamedRef(int fn(V&...)) {} | |
| void ParmsFuncNamedRValueRef(int fn(V&&...)) {} | |
| void ParmsFuncNamedConstRef(int fn(const V&...)) {} | |
| // Conventional unnamed parameter member function ptr | |
| void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {} | |
| void ParmsMemFuncPtrPtr(int (KlassMemFuncs::*)(V*...)) {} | |
| void ParmsMemFuncPtrPtrRef(int (KlassMemFuncs::*)(V*&...)) {} | |
| void ParmsMemFuncPtrPtrRValueRef(int (KlassMemFuncs::*)(V*&&...)) {} | |
| void ParmsMemFuncPtrRef(int (KlassMemFuncs::*)(V&...)) {} | |
| void ParmsMemFuncPtrRValueRef(int (KlassMemFuncs::*)(V&&...)) {} | |
| void ParmsMemFuncPtrConstRef(int (KlassMemFuncs::*)(const V&...)) {} | |
| }; | |
| %} | |
| %template(VariadicParms0) VariadicParms<>; | |
| %template(VariadicParms1) VariadicParms<A>; | |
| %template(VariadicParms2) VariadicParms<A,B>; | |
| %template(VariadicParms3) VariadicParms<A,B,C>; | |
| %inline %{ | |
| template <typename... V> struct FixedAndVariadicParms { | |
| public: | |
| void ParmsVal(short samename1, V... samename) {} | |
| void ParmsPtr(short shortvar, V*... vparms_p) {} | |
| void ParmsPtrRef(short shortvar, V*&... vparms_pr) {} | |
| void ParmsPtrRValueRef(short shortvar, V*&&... vparms_rvr) {} | |
| void ParmsRef(short shortvar, V&... vparms_r) {} | |
| void ParmsRValueRef(short shortvar, V&&... vparms_r) {} | |
| void ParmsConstRef(short shortvar, const V&... vparms_cr) {} | |
| void ParmsFuncPtrVal(short shortvar, int (*)(short, V...)) {} | |
| void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {} | |
| }; | |
| %} | |
| %template(FixedAndVariadicParms0) FixedAndVariadicParms<>; | |
| %template(FixedAndVariadicParms1) FixedAndVariadicParms<A>; | |
| %template(FixedAndVariadicParms2) FixedAndVariadicParms<A,B>; | |
| %template(FixedAndVariadicParms3) FixedAndVariadicParms<A,B,C>; | |
| %inline %{ | |
| struct PlainStruct { | |
| template<typename ... VVV> void ParmsPlainStructVariadic(const VVV& ... args) {} | |
| }; | |
| %} | |
| %template(PlainStructParms0) PlainStruct::ParmsPlainStructVariadic<>; | |
| %template(PlainStructParms1) PlainStruct::ParmsPlainStructVariadic<A>; | |
| %template(PlainStructParms2) PlainStruct::ParmsPlainStructVariadic<A,B>; | |
| %template(PlainStructParms3) PlainStruct::ParmsPlainStructVariadic<A,B,C>; | |
| // A pack argument with the same name as an earlier template parameter | |
| %inline %{ | |
| template <typename B, typename... Bs> struct NamedLikePack { | |
| int pack_size(B, Bs...) { return (int)sizeof...(Bs); } | |
| }; | |
| %} | |
| %template(NamedLikePackIntB) NamedLikePack<int, B>; |