%module template_default_class_parms_typedef // Based on template_default_class_parms testcase but using typedefs in template %feature("python:nondynamic"); #ifdef SWIGOCAML %warnfilter(SWIGWARN_PARSE_KEYWORD) method; #endif %inline %{ namespace Space { struct SomeType {}; struct AnotherType {}; template class Bar { public: typedef CC C; typedef DD D; typedef EE E; C CType; D DType; E EType; // Use typedef with no qualifiers Bar(C c, D d, E e) {} C method(C c, D d, E e) { return c; } // Use typedef with classname qualifiers Bar(bool, typename Bar::C c, typename Bar::D d, typename Bar::E e) {} typename Bar::C method_1(typename Bar::C c, typename Bar::D d, typename Bar::E e) { return c; } // Use typedef with classname and full template parameter qualifiers Bar(bool, bool, typename Bar::C c, typename Bar::D d, typename Bar::E e) {} typename Bar::C method_2(typename Bar::C c, typename Bar::D d, typename Bar::E e) { return c; } // Use typedef with namespace and classname and full template parameter qualifiers Bar(bool, bool, bool, typename Space::Bar::C c, typename Space::Bar::D d, typename Space::Bar::E e) {} typename Space::Bar::C method_3(typename Space::Bar::C c, typename Space::Bar::D d, typename Space::Bar::E e) { return c; } }; template class Foo { public: typedef TT T; T TType; // Use typedef with no qualifiers Foo(T t) {} T method(T t) { return t; } // Use typedef with classname qualifiers Foo(const T &, T t) {} typename Foo::T method_A(typename Foo::T t) { return t; } // Use typedef with classname and full template parameter qualifiers Foo(const typename Foo::T &, const typename Foo::T &, typename Foo::T t) {} typename Foo::T method_B(typename Foo::T t) { return t; } // Use typedef with namespace and classname and full template parameter qualifiers Foo(const typename Foo::T &, const typename Foo::T &, const typename Foo::T &, typename Foo::T t) {} typename Foo::T method_C(typename Foo::T t) { return t; } }; template class ATemplate {}; template struct UsesBar { void use_A(typename Bar::C, typename Bar::D, typename Bar::E) {} void use_B(const typename Bar::C &, const typename Bar::D &, const typename Bar::E &) {} void use_C(typename Space::Bar::C, typename Space::Bar::D, typename Space::Bar::E) {} void use_D(const typename Space::Bar::C &, const typename Space::Bar::D &, const typename Space::Bar::E &) {} }; } %} // Use defaults %template(DefaultBar) Space::Bar; %template(DefaultFoo) Space::Foo<>; // Don't use all defaults %template(BarAnotherTypeBool) Space::Bar; %template(FooAnotherType) Space::Foo; %template() Space::ATemplate<>; %template(UsesBarDouble) Space::UsesBar;