summaryrefslogtreecommitdiff
path: root/Examples/test-suite/template_partial_specialization_typedef.i
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2009-10-20 17:50:36 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2009-10-20 17:50:36 +0000
commit4b2ced5095ea8ee40d9d13d36c939374d820e52b (patch)
tree4b1752df8bfb2d4516e5c37a8e96978c69b92c88 /Examples/test-suite/template_partial_specialization_typedef.i
parent123f4931cd9efd04f5375553a05cbeeb086b58aa (diff)
downloadswig-4b2ced5095ea8ee40d9d13d36c939374d820e52b.tar.gz
Fix partial specialization and explicit specialization lookup
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11703 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Examples/test-suite/template_partial_specialization_typedef.i')
-rw-r--r--Examples/test-suite/template_partial_specialization_typedef.i130
1 files changed, 130 insertions, 0 deletions
diff --git a/Examples/test-suite/template_partial_specialization_typedef.i b/Examples/test-suite/template_partial_specialization_typedef.i
new file mode 100644
index 000000000..6fdbf99aa
--- /dev/null
+++ b/Examples/test-suite/template_partial_specialization_typedef.i
@@ -0,0 +1,130 @@
+// This testcase is almost identical to template_partial_specialization but uses typedefs for %template
+
+%module template_partial_specialization_typedef
+
+%inline %{
+namespace TypeDef {
+ typedef double Double;
+ typedef int * IntPtr;
+ typedef double * DoublePtr;
+ typedef double & DoubleRef;
+ typedef const double & ConstDoubleRef;
+ typedef double * const & DoublePtrConstRef;
+
+ typedef int Int;
+ typedef int * const & IntPtrConstRef;
+ typedef int ** IntPtrPtr;
+ typedef float Float;
+ typedef float * FloatPtr;
+ typedef float ** FloatPtrPtr;
+ typedef float *** FloatPtrPtrPtr;
+
+ typedef bool * BoolPtr;
+ typedef char * CharPtr;
+ typedef short * ShortPtr;
+ typedef long * LongPtr;
+ typedef unsigned int ** UnsignedIntPtrPtr;
+ typedef unsigned int *** UnsignedIntPtrPtrPtr;
+ typedef const unsigned int ** ConstUnsignedIntPtr;
+ typedef const unsigned int *** ConstUnsignedIntPtrPtr;
+}
+namespace One {
+ template <typename T> struct OneParm { void a() {} };
+ template <typename T> struct OneParm<T *> { void b() {} };
+ template <typename T> struct OneParm<T &> { void c() {} };
+ template <typename T> struct OneParm<T const &> { void d() {} };
+ template <typename T> struct OneParm<T * const &> { void e() {} };
+
+ template <> struct OneParm<int> { void f() {} };
+ template <> struct OneParm<int * const &> { void g() {} };
+ template <> struct OneParm<int **> { void h() {} };
+
+ template <> struct OneParm<float> { void i() {} };
+ template <> struct OneParm<float *> { void j() {} };
+ template <> struct OneParm<float **> { void k() {} };
+ template <> struct OneParm<float ***> { void l() {} };
+}
+%}
+
+// partial specializations
+%template(A) One::OneParm<TypeDef::Double>;
+%template(B) One::OneParm<TypeDef::DoublePtr>;
+%template(C) One::OneParm<TypeDef::DoubleRef>;
+%template(D) One::OneParm<TypeDef::ConstDoubleRef>;
+%template(E) One::OneParm<TypeDef::DoublePtrConstRef>;
+
+// explicit specializations
+%template(F) One::OneParm<TypeDef::Int>;
+%template(G) One::OneParm<TypeDef::IntPtrConstRef>;
+%template(H) One::OneParm<TypeDef::IntPtrPtr>;
+
+// %template scope explicit specializations
+namespace ONE {
+ %template(I) One::OneParm<TypeDef::Float>;
+ %template(J) ::One::OneParm<TypeDef::FloatPtr>;
+}
+%template(K) ::One::OneParm<TypeDef::FloatPtrPtr>;
+namespace One {
+ %template(L) OneParm<TypeDef::FloatPtrPtrPtr>;
+}
+
+// %template scope partial specializations
+namespace ONE {
+ %template(BB) One::OneParm<TypeDef::BoolPtr>;
+ %template(BBB) ::One::OneParm<TypeDef::CharPtr>;
+}
+%template(BBBB) ::One::OneParm<TypeDef::ShortPtr>;
+namespace One {
+ %template(BBBBB) OneParm<TypeDef::LongPtr>;
+}
+
+// non-exact match
+%template(B1) One::OneParm<TypeDef::UnsignedIntPtrPtr>;
+%template(B2) One::OneParm<TypeDef::UnsignedIntPtrPtrPtr>;
+%template(B3) One::OneParm<TypeDef::ConstUnsignedIntPtr>;
+%template(B4) One::OneParm<TypeDef::ConstUnsignedIntPtrPtr>;
+
+
+// Two parameter specialization tests
+%inline %{
+struct Concrete {};
+namespace Two {
+ template <typename T1, typename T2> struct TwoParm { void a() {} };
+ template <typename T1, typename T2> struct TwoParm<T1 *, T2 *> { void b() {} };
+ template <typename T1, typename T2> struct TwoParm<T1 *, const T2 *> { void c() {} };
+ template <typename T1, typename T2> struct TwoParm<const T1 *, const T2 *> { void d() {} };
+ template <typename T1> struct TwoParm<T1 *, int *> { void e() {} };
+ template <typename T1> struct TwoParm<T1, int> { void f() {} };
+ template <> struct TwoParm<int *, const int *> { void g() {} };
+}
+%}
+
+%inline %{
+namespace TypeDef {
+ typedef const double * ConstDoublePtr;
+ typedef const int * ConstIntPtr;
+ typedef int * IntPtr;
+ typedef Concrete * ConcretePtr;
+ typedef const Concrete * ConstConcretePtr;
+ typedef void * VoidPtr;
+}
+%}
+namespace Two {
+ %template(A_) TwoParm<TypeDef::Double, TypeDef::Double>;
+ %template(B_) TwoParm<TypeDef::DoublePtr, TypeDef::DoublePtr>;
+ %template(C_) TwoParm<TypeDef::DoublePtr, TypeDef::ConstDoublePtr>;
+ %template(D_) TwoParm<TypeDef::ConstIntPtr, TypeDef::ConstIntPtr>;
+ %template(E_) TwoParm<TypeDef::IntPtr, TypeDef::IntPtr>;
+ %template(F_) TwoParm<TypeDef::IntPtr, TypeDef::Int>;
+ %template(G_) TwoParm<TypeDef::IntPtr, TypeDef::ConstIntPtr>;
+
+ %template(C1_) TwoParm<TypeDef::ConcretePtr, TypeDef::ConstConcretePtr>;
+ %template(C2_) TwoParm<TypeDef::IntPtr, TypeDef::ConstConcretePtr>;
+}
+
+%template(C3_) Two::TwoParm<TypeDef::DoublePtr, TypeDef::ConstConcretePtr>;
+%template(C4_) ::Two::TwoParm<TypeDef::VoidPtr, TypeDef::ConstConcretePtr>;
+%template(B1_) ::Two::TwoParm<TypeDef::CharPtr, TypeDef::ConcretePtr>;
+%template(E1_) Two::TwoParm<TypeDef::ConstIntPtr, TypeDef::IntPtr>;
+%template(E2_) Two::TwoParm<TypeDef::IntPtrPtr, TypeDef::IntPtr>;
+