From: Joris G. <Jor...@me...> - 2011-10-17 13:21:22
|
Dear SWIG developers, Somewhat recently, the following method was added in octrun.swg: dim_vector dims(void) const { return dim_vector(1,1); } (member of octave_swig_type) I would like to propose a smarter version of this method, i.e. one that checks if a custom dims function is available for the specific wrapped type and falls back to (1,1) upon failure. In the project we are working on (CasADi), we have a matrix-like class with the following member: std::vector<int> __dims__() const { std::vector<int> ret(2); ret[0] = $self->size1(); ret[1] = $self->size2(); return ret; } The change proposed below allows us to do proper concatenation ([]) with dimension checking of swig-objects that wrap this matrix class. We have been using a custom patch for this some time now; it may be time to contribute this to SWIG trunk. We would appreciate any comments on this. Best regards, Joris Gillis dim_vector dims(void) const { 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); if (!outarg(0).is_cell()) { const Cell & c=outarg(0).cell_value(); int ndim = c.rows(); dim_vector d; d.resize(ndim); // Fill in dim_vector for (int k=0;k<ndim;k++) { const octave_value& obj = c(k,0); 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 { return dim_vector(1,1); } } |