aboutsummaryrefslogtreecommitdiff
path: root/Examples/test-suite/template_template_parameters.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/template_template_parameters.i')
-rw-r--r--Examples/test-suite/template_template_parameters.i63
1 files changed, 61 insertions, 2 deletions
diff --git a/Examples/test-suite/template_template_parameters.i b/Examples/test-suite/template_template_parameters.i
index 89197229e..068d74443 100644
--- a/Examples/test-suite/template_template_parameters.i
+++ b/Examples/test-suite/template_template_parameters.i
@@ -1,7 +1,9 @@
%module template_template_parameters
-
%inline %{
+
+// part 1
+
namespace pfc {
template<typename t_item, template <typename> class t_alloc> class array_t {};
template<typename t_item> class alloc_fast {
@@ -16,7 +18,7 @@
class list_tt : public list_impl_t<t_item,pfc::array_t<t_item,t_alloc> > {
public:
t_item item;
-// typename t_alloc<t_item>::alloc_type allotype; // SWIG can't handle this yet
+ typename t_alloc<t_item>::alloc_type allotype; // SWIG can handle this now
void xx() {
typename t_alloc<t_item>::alloc_type atype; // this type is the same as t_item type
atype = true;
@@ -29,11 +31,68 @@ void TestInstantiations() {
(void) myArrayInt;
(void) myListImplInt;
}
+
+// part 2
+
+template<class T>
+struct Container1 {
+ T x;
+};
+template<class U>
+struct Container2 {
+ U x;
+};
+template<class BaseT, template<class> class TemplateTemplateT>
+struct TestStruct {
+ TemplateTemplateT<BaseT> x;
+};
+
+TestStruct<int, Container1> TestStructContainer1Method(TestStruct<int, Container1> ts1) {
+ ts1.x.x += 10;
+ return ts1;
+}
%}
+
+// part 1
%template(ListImplFastBool) list_impl_t<bool, pfc::array_t<bool, pfc::alloc_fast> >;
%template(ListFastBool) list_tt<bool, pfc::alloc_fast>;
%template(ListImplFastDouble) list_impl_t<double, pfc::array_t<double, pfc::alloc_fast> >;
%template(ListDefaultDouble) list_tt<double>;
+%template(BoolAllocFast) pfc::alloc_fast<bool>;
+%template(DoubleAllocFast) pfc::alloc_fast<double>;
+
+// part 2
+%template(IntContainer1) Container1<int>;
+%template(FloatContainer2) Container2<float>;
+%template(IntTestStruct) TestStruct<int, Container1>;
+%template(FloatTestStruct) TestStruct<float, Container2>;
+
+
+// part 3 - from #624
+
+#ifdef SWIGJAVASCRIPT
+%rename("addTo") operator+=;
+#else
+%rename("") operator+=; // For Ruby and Octave that ignore operator+=
+#endif
+
+%inline %{
+template<typename T, int dim> struct Foot {
+ template <template <typename, int> class X, typename U>
+ void operator+=(X<U, dim> & ref) {}
+};
+
+void TestInstantiationsPart3() {
+ Foot<int, 99> MyFootInt99;
+ MyFootInt99.operator+=<Foot, int>(MyFootInt99);
+ MyFootInt99 += MyFootInt99;
+}
+%}
+
+%template(MyFootInt99) Foot<int, 99>;
+%extend Foot<int, 99> {
+ %template(OperatorPlusEquals) operator+=<Foot, int>;
+}