blob: d771ef09e3013c9c31aa926071e716adda98f281 [file] [log] [blame]
%module template_default
%warnfilter(SWIGWARN_RUBY_WRONG_NAME) ns1::Traits::c; /* Ruby, wrong constant name */
namespace ns1 {
namespace ns2 {
%feature("hello") A<int>;
%feature("hello") A<double,double>;
%feature("hi") A<int,int>;
%feature("hi") A<double>;
%extend A<int>
{
int foo() { return 1; }
}
%extend A<double,double>
{
int foo() { return 1; }
}
%extend A<int,int>
{
int bar() { return 1; }
}
%extend A<double>
{
int bar() { return 1; }
}
%extend N<double>
{
int bar() { return 1; }
}
}
}
%inline %{
namespace ns1 {
namespace ns2 {
struct Parm
{
};
template <class T1, class T2 = T1>
class A
{
#ifdef SWIG
%typemap(in) A * { /* in A */ }
#ifdef SWIGCSHARP
%typemap(out) A * { /* out A */ $result=0; }
#else
%typemap(out) A * { /* out A */ }
#endif
#endif
};
typedef unsigned int category;
const category one = 1;
const category two = 1;
template <class T1, category C = one, class T2 = Parm>
class N
{
#ifdef SWIG
%typemap(in) N * { /* in N */ }
#ifdef SWIGCSHARP
%typemap(out) N * { /* out N */ $result=0; }
#else
%typemap(out) N * { /* out N */ }
#endif
#endif
};
}
}
%}
%template(A_p) ns1::ns2::A<double,ns1::ns2::Parm>;
%template(N_1p) ns1::ns2::N<int>;
namespace ns1 {
namespace ns2 {
%template(A_ii) A<int, int>;
%template(A_d) A<double>;
%template(N_d) N<double>;
}
}
%inline %{
namespace ns1 {
namespace ns2 {
namespace ns3 {
struct B : A<int>
{
};
struct C : N<double,ns1::ns2::one>
{
};
A<int> *get_a1(A<int> *a) {
return a;
}
A<int,int> *get_a2(A<int,int> *a) {
return a;
}
}
}
}
%}
%inline %{
namespace ns1 {
struct Traits
{
static const ns2::category c = ns2::one;
};
namespace ns4 {
template <class T>
struct D : ns2::N<double,T::c>
{
D()
{
}
};
template <class T1, class T2 = D<T1> >
struct Base : T2
{
};
}
}
%}
%template(Doo) ns1::ns4::D<ns1::Traits>;
%template(Boo) ns1::ns4::Base<ns1::Traits, ns1::ns4::D<ns1::Traits> >;
%inline %{
namespace ns1 {
namespace ns5 {
struct Der : ns4::Base<Traits>
{
};
}
}
%}
%inline %{
namespace hi
{
class CFoo
{
};
template<class T1, class T2 = T1> class CTemplate
{
};
typedef CTemplate<CFoo> TBla; // OK
typedef void (*TFunc1)(CFoo arg); // OK
typedef void (*TFunc2)(CTemplate<CFoo> arg); // OK
typedef void (*TFunc3)(CTemplate<CFoo>* arg); // OK
int foo(TFunc1 a, TFunc2 b, TFunc3 c)
{
return 0;
}
}
%}
#ifndef SWIGCHICKEN
%include std_vector.i
%{
#include <vector>
%}
%inline %{
void g(std::vector<double>* s = 0) {}
void q(double = 0) {}
%}
%constant void (*Bf)(std::vector<double> *p = 0) = g;
%constant void (*Cf)(double = 0) = q;
#endif