%module template_nested #if !defined(SWIGCSHARP) && !defined(SWIGJAVA) %feature ("flatnested"); #endif // Test nested templates - that is template classes and template methods within a class. namespace ns { template struct ForwardTemplate; } %{ namespace ns { template struct ForwardTemplate { void tmethod(T t) {} }; } %} %inline %{ namespace ns { class NormalClass { public: NormalClass() {} ~NormalClass() {} }; template struct NormalTemplate { void tmethod(T t) {} }; } %} %template(T_NormalTemplateNormalClass) ns::NormalTemplate; %template(T_NormalTemplateInt) ns::NormalTemplate; %template(T_NormalTemplateDouble) ns::NormalTemplate; %inline %{ namespace ns { class OuterClass { public: template struct Inner1 { template struct SuperInner1 { void method1(U t) {} }; template struct SuperInner2 { void method1(V t) {} }; template void tmethod(W w) {} template void tmethodAgain(X x) {} template struct SuperBase : public SuperInner1 { void method1(Y y) {} }; }; Inner1 useInner1(const Inner1& inner) { return inner; } template void InnerTMethod(Z z) {} template class Inner2 : public NormalTemplate { public: template class SuperInner1 { public: SuperInner1() {} void method1(U t) {} }; template struct SuperInner2 { void method1(V t) {} }; int embeddedVar; template void tmethod(X x) {} template struct SuperBase : public SuperInner1 { void method1(Y y) {} }; }; Inner2 useInner2(const Inner2& inner) { return inner; } Inner2 useInner2Again(const Inner2& inner) { return inner; } #ifdef SWIG %template(T_OuterClassInner1Double) Inner1; #endif int iii; }; struct ABC { ABC() {} ~ABC() {} }; struct TemplateFuncs { template X templateMethod1(X x) { return x; } template X templateMethod2(X x) { return x; } }; template struct OuterTemplate { template struct NestedInnerTemplate1 { template void NestedInnerInnerTMethod(Z z) {} void hohum() {} }; template void NestedInnerTMethod(UU u, W w) {} template struct NestedInnerTemplate2 { void hohum() {} }; UU hohum(UU u) { return u; } template struct NestedInnerTemplate3 : public NestedInnerTemplate2 { void hohum() {} }; struct NestedStruct { NestedStruct() {} void hohum() {} }; NestedInnerTemplate1 useNestedInnerTemplate1(const NestedInnerTemplate1& inner) { return inner; } NestedInnerTemplate2 useNestedInnerTemplate2(const NestedInnerTemplate2& inner) { return inner; } NestedInnerTemplate3 useNestedInnerTemplate3(const NestedInnerTemplate3& inner) { return inner; } NestedStruct useNestedStruct(const NestedStruct& inner) { return inner; } }; } %} #if !defined(SWIGSCILAB) %extend ns::OuterClass { %template(T_OuterClassInner2Double) Inner2; } %template(T_OuterTMethodNormalClass) ns::OuterClass::InnerTMethod; %template(T_TemplateFuncs1Int) ns::TemplateFuncs::templateMethod1; %template(T_TemplateFuncs2Double) ns::TemplateFuncs::templateMethod2; %template(T_NestedOuterTemplateDouble) ns::OuterTemplate; %template(T_OuterClassInner1Int) ns::OuterClass::Inner1; %template(T_OuterClassInner2NormalClass) ns::OuterClass::Inner2; %template(T_OuterClassInner2Int) ns::OuterClass::Inner2; #else %extend ns::OuterClass { %template(T_OutClsIn2Dbl) Inner2; } %template(T_OutClsIn1Int) ns::OuterClass::Inner1; %template(T_OutClsIn2NormCls) ns::OuterClass::Inner2; %template(T_OutClsIn2Int) ns::OuterClass::Inner2; #endif