Enhance %extend to extend a class with template methods

This commit is contained in:
William S Fulton 2017-01-22 10:29:34 +00:00
commit b538070016
7 changed files with 207 additions and 1 deletions

View file

@ -227,6 +227,7 @@ CPP_TEST_CASES += \
extend_placement \
extend_special_variables \
extend_template \
extend_template_method \
extend_template_ns \
extend_typedef_class \
extern_c \

View file

@ -0,0 +1,62 @@
%module extend_template_method
%include <std_string.i>
%inline %{
class ExtendMe {
public:
template <typename T>
T do_stuff_impl(int a, T b, double d) {
return b;
}
};
%}
%extend ExtendMe {
template<typename T>
T do_stuff(int a, T b) {
return $self->do_stuff_impl(a, b, 4.0);
}
template<typename T>
T do_overloaded_stuff(T b) {
return $self->do_stuff_impl(0, b, 4.0);
}
}
%template(do_stuff_double) ExtendMe::do_stuff<double>;
%template(do_stuff_string) ExtendMe::do_stuff<std::string>;
%template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
%template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
%inline %{
template<typename X>
class TemplateExtendMe {
public:
template <typename T>
T template_stuff_impl(X a, T b, double d) {
return b;
}
};
%}
%extend TemplateExtendMe {
template<typename T>
T do_template_stuff(int a, T b) {
return $self->template_stuff_impl(a, b, 4.0);
}
template<typename T>
T do_template_overloaded_stuff(T b) {
return $self->template_stuff_impl(0, b, 4.0);
}
%template(do_template_stuff_double) do_template_stuff<double>;
%template(do_template_stuff_string) do_template_stuff<std::string>;
%template(do_template_overloaded_stuff) do_template_overloaded_stuff<std::string>;
%template(do_template_overloaded_stuff) do_template_overloaded_stuff<double>;
}
%template(TemplateExtend) TemplateExtendMe<int>;

View file

@ -0,0 +1,57 @@
import extend_template_method.*;
public class extend_template_method_runme {
static {
try {
System.loadLibrary("extend_template_method");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
System.exit(1);
}
}
public static void main(String argv[]) {
{
ExtendMe em = new ExtendMe();
{
double ret_double = em.do_stuff_double(1, 1.1);
if (ret_double != 1.1)
throw new RuntimeException("double failed " + ret_double);
String ret_string = em.do_stuff_string(1, "hello there");
if (!ret_string.equals("hello there"))
throw new RuntimeException("string failed " + ret_string);
}
{
double ret_double = em.do_overloaded_stuff(1.1);
if (ret_double != 1.1)
throw new RuntimeException("double failed " + ret_double);
String ret_string = em.do_overloaded_stuff("hello there");
if (!ret_string.equals("hello there"))
throw new RuntimeException("string failed " + ret_string);
}
}
{
TemplateExtend em = new TemplateExtend();
{
double ret_double = em.do_template_stuff_double(1, 1.1);
if (ret_double != 1.1)
throw new RuntimeException("double failed " + ret_double);
String ret_string = em.do_template_stuff_string(1, "hello there");
if (!ret_string.equals("hello there"))
throw new RuntimeException("string failed " + ret_string);
}
{
double ret_double = em.do_template_overloaded_stuff(1.1);
if (ret_double != 1.1)
throw new RuntimeException("double failed " + ret_double);
String ret_string = em.do_template_overloaded_stuff("hello there");
if (!ret_string.equals("hello there"))
throw new RuntimeException("string failed " + ret_string);
}
}
}
}

View file

@ -0,0 +1,36 @@
from extend_template_method import *
em = ExtendMe()
ret_double = em.do_stuff_double(1, 1.1)
if ret_double != 1.1:
raise RuntimeError("double failed " + ret_double)
ret_string = em.do_stuff_string(1, "hello there")
if ret_string != "hello there":
raise RuntimeError("string failed " + ret_string)
ret_double = em.do_overloaded_stuff(1.1)
if ret_double != 1.1:
raise RuntimeError("double failed " + ret_double)
ret_string = em.do_overloaded_stuff("hello there")
if ret_string != "hello there":
raise RuntimeError("string failed " + ret_string)
em = TemplateExtend()
ret_double = em.do_template_stuff_double(1, 1.1)
if ret_double != 1.1:
raise RuntimeError("double failed " + ret_double)
ret_string = em.do_template_stuff_string(1, "hello there")
if ret_string != "hello there":
raise RuntimeError("string failed " + ret_string)
ret_double = em.do_template_overloaded_stuff(1.1)
if ret_double != 1.1:
raise RuntimeError("double failed " + ret_double)
ret_string = em.do_template_overloaded_stuff("hello there")
if ret_string != "hello there":
raise RuntimeError("string failed " + ret_string)