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:
parent
87bf8ae7aa
commit
86cb3a9532
9 changed files with 200 additions and 24 deletions
|
|
@ -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 \
|
||||
|
|
|
|||
33
Examples/test-suite/li_std_containers_overload.i
Normal file
33
Examples/test-suite/li_std_containers_overload.i
Normal 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>";
|
||||
}
|
||||
%}
|
||||
|
|
@ -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>");
|
||||
|
|
@ -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>")
|
||||
44
Examples/test-suite/ruby/li_std_containers_overload_runme.rb
Normal file
44
Examples/test-suite/ruby/li_std_containers_overload_runme.rb
Normal 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>")
|
||||
Loading…
Add table
Add a link
Reference in a new issue