Fix assertion handling defaultargs

Occurs when using %extend for a template class and the extended methods
contain default arguments.

Closes #611
This commit is contained in:
William S Fulton 2016-05-07 12:33:29 +01:00
commit 15ebf3df03
5 changed files with 87 additions and 7 deletions

View file

@ -402,6 +402,7 @@ CPP_TEST_CASES += \
template_default2 \
template_default_arg \
template_default_arg_overloaded \
template_default_arg_overloaded_extend \
template_default_arg_virtual_destructor \
template_default_class_parms \
template_default_class_parms_typedef \

View file

@ -0,0 +1,20 @@
from template_default_arg_overloaded_extend import *
def check(flag):
if not flag:
raise RuntimeError("failed")
rs = ResultSet()
check(rs.go_get(0, SearchPoint()) == -1)
check(rs.go_get(0, SearchPoint(), 100) == 100)
check(rs.go_get_template(0, SearchPoint()) == -2)
check(rs.go_get_template(0, SearchPoint(), 100) == 100)
check(rs.over() == "over(int)")
check(rs.over(10) == "over(int)")
check(rs.over(SearchPoint()) == "over(giai2::SearchPoint, int)")
check(rs.over(SearchPoint(), 10) == "over(giai2::SearchPoint, int)")
check(rs.over(True, SearchPoint()) == "over(bool, gaia2::SearchPoint, int)")
check(rs.over(True, SearchPoint(), 10) == "over(bool, gaia2::SearchPoint, int)")

View file

@ -0,0 +1,44 @@
%module template_default_arg_overloaded_extend
%inline %{
namespace gaia2 {
struct Filter {};
struct SearchPoint {};
struct DataSet {};
template <typename SearchPointType, typename DataSetType>
class BaseSearchSpace {};
template <typename SearchPointType, typename DataSetType>
class BaseResultSet {
public:
const char *over(int i = 0) {
return "over(int)";
}
};
}
%}
// Specialized template extend
%extend gaia2::BaseResultSet<gaia2::SearchPoint, gaia2::DataSet> {
int go_get(int n, gaia2::SearchPoint, int offset = -1) {
return offset;
}
const char *over(gaia2::SearchPoint, int x = 0) {
return "over(giai2::SearchPoint, int)";
}
}
// Generic extend for all template instantiations
%extend gaia2::BaseResultSet {
int go_get_template(int n, SearchPointType sss, int offset = -2) {
return offset;
}
const char *over(bool b, SearchPointType, int x = 0) {
return "over(bool, SearchPointType, int)";
}
}
%template(ResultSet) gaia2::BaseResultSet<gaia2::SearchPoint, gaia2::DataSet>;