Python STL container method overloading fix

Fix method overloading of methods that take STL containers of different types.
Due to some error handling that was not cleared during typehecking.
This commit is contained in:
William S Fulton 2019-08-06 19:36:14 +01:00
commit 86cb3a9532
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>")