blob: 748b23cbbb72919ae919c5444462d8a79ea58e9c [file] [log] [blame]
%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<typename CC, typename DD = SomeType, typename EE = int> 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<CC, DD, EE>::C c, typename Bar<CC, DD, EE>::D d, typename Bar<CC, DD, EE>::E e) {}
typename Bar<CC, DD, EE>::C method_2(typename Bar<CC, DD, EE>::C c, typename Bar<CC, DD, EE>::D d, typename Bar<CC, DD, EE>::E e) { return c; }
// Use typedef with namespace and classname and full template parameter qualifiers
Bar(bool, bool, bool, typename Space::Bar<CC, DD, EE>::C c, typename Space::Bar<CC, DD, EE>::D d, typename Space::Bar<CC, DD, EE>::E e) {}
typename Space::Bar<CC, DD, EE>::C method_3(typename Space::Bar<CC, DD, EE>::C c, typename Space::Bar<CC, DD, EE>::D d, typename Space::Bar<CC, DD, EE>::E e) { return c; }
};
template<typename TT = SomeType> 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<TT>::T &, const typename Foo<TT>::T &, typename Foo<TT>::T t) {}
typename Foo<TT>::T method_B(typename Foo<TT>::T t) { return t; }
// Use typedef with namespace and classname and full template parameter qualifiers
Foo(const typename Foo<TT>::T &, const typename Foo<TT>::T &, const typename Foo<TT>::T &, typename Foo<TT>::T t) {}
typename Foo<TT>::T method_C(typename Foo<TT>::T t) { return t; }
};
template<typename T = int> class ATemplate {};
template<typename T> struct UsesBar {
void use_A(typename Bar<T>::C, typename Bar<T>::D, typename Bar<T>::E) {}
void use_B(const typename Bar<T>::C &, const typename Bar<T>::D &, const typename Bar<T>::E &) {}
void use_C(typename Space::Bar<T>::C, typename Space::Bar<T>::D, typename Space::Bar<T>::E) {}
void use_D(const typename Space::Bar<T>::C &, const typename Space::Bar<T>::D &, const typename Space::Bar<T>::E &) {}
};
}
%}
// Use defaults
%template(DefaultBar) Space::Bar<double>;
%template(DefaultFoo) Space::Foo<>;
// Don't use all defaults
%template(BarAnotherTypeBool) Space::Bar<Space::AnotherType, bool>;
%template(FooAnotherType) Space::Foo<Space::AnotherType>;
%template() Space::ATemplate<>;
%template(UsesBarDouble) Space::UsesBar<double>;