mirror of https://github.com/swig/swig
99 lines
2.4 KiB
OpenEdge ABL
99 lines
2.4 KiB
OpenEdge ABL
%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
|
|
|
|
#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>;
|
|
}
|