/* This testcase checks whether SWIG correctly handles alias templates. */ %module cpp11_template_typedefs %inline %{ template using ptr_t = T*; namespace ns { template class SomeType { public: using type1_t = T1; using type2_t = T2; T1 a; T2 b; constexpr int get_n() const { return N; } }; // Specialization for T1=const char*, T2=bool template class SomeType { public: using type1_t = const char*; using type2_t = bool; type1_t a; type2_t b; constexpr int get_n() const { return 3 * N; } }; // alias templates template using TypedefName = SomeType; template using TypedefNamePtr = ptr_t>; // alias template that returns T2 for a SomeType class template using T2_of = typename T::type2_t; T2_of> get_SomeType_b(const SomeType& x) { return x.b; } template T2_of> get_SomeType_b2(const TypedefName& x) { return x.b; } } // namespace ns ns::TypedefName create_TypedefName() { return { "hello", 10}; } ns::TypedefName create_TypedefNameBool() { return { "hello", true}; } ns::TypedefNamePtr identity(ns::TypedefNamePtr a = nullptr) { return a; } typedef double Val; template struct ListBucket { }; namespace Alloc { template struct rebind { using other = int; }; } using BucketAllocator1 = typename Alloc::template rebind>::other; using BucketAllocator2 = typename Alloc::template rebind<::template ListBucket>::other; BucketAllocator1 get_bucket_allocator1() { return 1; } BucketAllocator2 get_bucket_allocator2() { return 2; } %} %immutable ns::SomeType::a; // %template() directives %template(SomeTypeInt5) ns::SomeType; %template(SomeTypeInt4) ns::SomeType; %template(SomeTypeBool5) ns::SomeType; %template(ListBucketDouble) ListBucket; %template(RebindListBucketDouble) Alloc::rebind>; %template() ptr_t>; %template() ns::TypedefName; %template() ns::TypedefName; %template() ns::TypedefNamePtr; %template() ns::T2_of>; %template(get_SomeType_b2) ns::get_SomeType_b2;