Document extern template functions support. Extern templates result in new warning to differentiate from template explicit instantiation definition warning.
64 lines
1.8 KiB
OpenEdge ABL
64 lines
1.8 KiB
OpenEdge ABL
/* This unit tests whether SWIG correctly parses the code and makes wrappers
|
|
for the new C++11 extern templates (explicit template instantiation without
|
|
using the translation unit).
|
|
*/
|
|
%module cpp11_template_explicit
|
|
|
|
/* Suppress SWIG warnings related to explicit template instantiation and extern templates */
|
|
#pragma SWIG nowarn=SWIGWARN_PARSE_EXPLICIT_TEMPLATE
|
|
#pragma SWIG nowarn=SWIGWARN_PARSE_EXTERN_TEMPLATE
|
|
|
|
%inline %{
|
|
|
|
template<typename T> class Temper {
|
|
public:
|
|
T val;
|
|
};
|
|
|
|
class A {
|
|
public:
|
|
int member;
|
|
int memberFunction() { return 100; }
|
|
};
|
|
|
|
class B {
|
|
public:
|
|
short member;
|
|
short memberFunction() { return 100; }
|
|
};
|
|
|
|
template class Temper<A>;
|
|
extern template class Temper<B>;
|
|
|
|
template class Temper<A*>;
|
|
extern template class Temper<B*>;
|
|
|
|
template class Temper<int>;
|
|
extern template class Temper<short>;
|
|
|
|
/* Templated function to check support for extern template functions */
|
|
template <typename T>
|
|
T my_templated_function(int a, double b)
|
|
{
|
|
return T();
|
|
}
|
|
|
|
/* Explicit extern function template instantiation with simple type */
|
|
extern template int my_templated_function<int>(int, double);
|
|
template int my_templated_function<int>(int, double);
|
|
|
|
/* Explicit extern function template instantiation with more complex types */
|
|
extern template A my_templated_function<A>(int, double);
|
|
template A my_templated_function<A>(int, double);
|
|
|
|
extern template Temper<int> my_templated_function<Temper<int>>(int, double);
|
|
template Temper<int> my_templated_function<Temper<int>>(int, double);
|
|
|
|
%}
|
|
|
|
%template(TemperInt) Temper<int>;
|
|
|
|
/* Enable several versions of the templated function */
|
|
%template(my_templated_function_int ) my_templated_function<int>;
|
|
%template(my_templated_function_A ) my_templated_function<A>;
|
|
%template(my_templated_function_TemperInt) my_templated_function<Temper<int>>;
|