Merge branch 'python-stl-overloading'

* python-stl-overloading:
  Python STL container method overloading fix
This commit is contained in:
William S Fulton 2019-08-08 18:58:49 +01:00
commit 5e2b8f3ec9
9 changed files with 200 additions and 24 deletions

View file

@ -643,6 +643,7 @@ CPP_STD_TEST_CASES += \
director_string \
ignore_template_constructor \
li_std_combinations \
li_std_containers_overload \
li_std_deque \
li_std_except \
li_std_except_as_class \

View file

@ -0,0 +1,33 @@
%module li_std_containers_overload
// Suppress warning that ought not to appear, but there is no easy fix
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) VectorOverload;
%include <std_string.i>
%include <std_vector.i>
%inline %{
struct X {};
struct Y {};
%}
%template(VectorX) std::vector<X>;
%template(VectorY) std::vector<Y>;
%template(VectorString) std::vector<std::string>;
%template(VectorInt) std::vector<int>;
%inline %{
using namespace std;
string VectorOverload(vector<X> v) {
return "vector<X>";
}
string VectorOverload(vector<Y> v) {
return "vector<Y>";
}
string VectorOverload(vector<string> v) {
return "vector<string>";
}
string VectorOverload(vector<int> v) {
return "vector<int>";
}
%}

View file

@ -0,0 +1,37 @@
# do not dump Octave core
if exist("crash_dumps_octave_core", "builtin")
crash_dumps_octave_core(0);
endif
li_std_containers_overload
function check(got, expected)
if (!strcmp(got, expected))
error("Failed check. '%s' != '%s'", got, expected)
endif
end
v = VectorX();
check(VectorOverload(v), "vector<X>");
v = VectorY();
check(VectorOverload(v), "vector<Y>");
v = VectorInt();
check(VectorOverload(v), "vector<int>");
v = VectorString();
check(VectorOverload(v), "vector<string>");
# TODO: Conversion from an Octave sequence not implemented yet
# v = {X()};
# check(VectorOverload(v), "vector<X>");
# v = {Y()};
# check(VectorOverload(v), "vector<Y>");
# v = {1, 2, 3};
# check(VectorOverload(v), "vector<int>");
# v = {"aaa", "bbb", "ccc"};
# check(VectorOverload(v), "vector<string>");

View file

@ -0,0 +1,29 @@
from li_std_containers_overload import *
def check(got, expected):
if got != expected:
raise RuntimeError("Failed check. '{}' != '{}'".format(got, expected))
v = VectorX()
check(VectorOverload(v), "vector<X>")
v = VectorY()
check(VectorOverload(v), "vector<Y>")
v = VectorInt()
check(VectorOverload(v), "vector<int>")
v = VectorString()
check(VectorOverload(v), "vector<string>")
v = [X()]
check(VectorOverload(v), "vector<X>")
v = [Y()]
check(VectorOverload(v), "vector<Y>")
v = [1, 2, 3]
check(VectorOverload(v), "vector<int>")
v = ["aaa", "bbb", "ccc"]
check(VectorOverload(v), "vector<string>")

View file

@ -0,0 +1,44 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'swig_assert'
require 'li_std_containers_overload'
include Li_std_containers_overload
def check(got, expected)
if (got != expected)
raise RuntimeError, "Failed check. '#{got}' != '#{expected}'"
end
end
v = VectorX.new()
check(VectorOverload(v), "vector<X>")
v = VectorY.new()
check(VectorOverload(v), "vector<Y>")
v = VectorInt.new()
check(VectorOverload(v), "vector<int>")
v = VectorString.new()
check(VectorOverload(v), "vector<string>")
v = [X.new()]
check(VectorOverload(v), "vector<X>")
v = [Y.new()]
check(VectorOverload(v), "vector<Y>")
v = [1, 2, 3]
check(VectorOverload(v), "vector<int>")
v = ["aaa", "bbb", "ccc"]
check(VectorOverload(v), "vector<string>")