summaryrefslogtreecommitdiff
path: root/Examples/test-suite/template_template_parameters.i
blob: 68c26bebe11814a91d71a05f8967f7be1a551229 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
%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 {
      public:
        typedef t_item alloc_type;
    };
  }

  template<typename t_item, typename t2> class list_impl_t {};

  template<typename t_item, template<typename> class t_alloc = pfc::alloc_fast >
    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 handle this now
    void xx() {
      typename t_alloc<t_item>::alloc_type atype; // this type is the same as t_item type
      atype = true;
    }
  };

void TestInstantiations() {
  pfc::array_t<int, pfc::alloc_fast> myArrayInt;
  list_impl_t<int, pfc::array_t<int, pfc::alloc_fast> > myListImplInt;
  (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

%rename("") operator+=; // For Ruby and Octave that ignore operator+=

%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>;
}