add extra logic to the octave_swig_type::dims(void) method: it checks if the user has defined a __dims__ method and uses this in stead of returning (1,1) (patch from jgillis, sf 3425993)

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12955 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Xavier Delacour 2012-03-26 15:45:02 +00:00
commit b0ea5581c3
4 changed files with 231 additions and 2 deletions

View file

@ -400,7 +400,57 @@ namespace Swig {
}
dim_vector dims(void) const {
return dim_vector(1,1);
octave_swig_type *nc_this = const_cast < octave_swig_type *>(this);
// Find the __dims__ method of this object
member_value_pair *m = nc_this->find_member("__dims__", false);
if (!m) return dim_vector(1,1);
// Call the __dims__ method of this object
octave_value_list inarg;
inarg.append(nc_this->as_value());
octave_value_list outarg = nc_this->member_invoke(m, inarg, 1);
// __dims__ should return (at least) one output argument
if (outarg.length() < 1) return dim_vector(1,1);
octave_value & out = outarg(0);
// Return value should be cell or matrix of integers
if (out.is_cell()) {
const Cell & c=out.cell_value();
int ndim = c.rows();
if (ndim==1 && c.columns()!=1) ndim = c.columns();
dim_vector d;
d.resize(ndim);
// Fill in dim_vector
for (int k=0;k<ndim;k++) {
const octave_value& obj = c(k);
d.elem(k) = obj.int_value();
// __dims__ should return a cell filled with integers
if (error_state) return dim_vector(1,1);
}
return d;
} else if (out.is_matrix_type() || out.is_real_nd_array() || out.is_numeric_type() ) {
if (out.rows()==1 || out.columns()==1) {
Array<int> a = out.int_vector_value();
if (error_state) return dim_vector(1,1);
dim_vector d;
d.resize(a.numel());
for (int k=0;k<a.numel();k++) {
d.elem(k) = a(k);
}
return d;
} else {
return dim_vector(1,1);
}
} else {
return dim_vector(1,1);
}
}
octave_value as_value() {