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); } } |
From: Karl W. <kar...@gm...> - 2011-10-18 17:09:02
|
Hi Joris, I was confused by the following code: > if (!outarg(0).is_cell()) { > const Cell & c=outarg(0).cell_value(); which seems to test if the returned octave_value is NOT a cell, but then tries to convert to a cell anyway! Should the "!" be in the "if" conditional? It might also be useful to have the code work with matrices of integers, as well as cells. Cheers, Karl On 17 October 2011 14:55, Joris Gillis <Jor...@me...> wrote: > 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); > } > } > > ------------------------------------------------------------------------------ > All the data continuously generated in your IT infrastructure contains a > definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2d-oct > _______________________________________________ > Swig-devel mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-devel > |
From: Joris G. <Jor...@me...> - 2011-10-19 08:27:47
|
Hello Karl, Thanks for looking into this. You spotted a mistake indeed; I had manually reworked the patch a bit without testing it. I will try to add your suggestion and make some tests for the SWIG test suite. Best regards, Joris Gillis > -----Original Message----- > From: Karl Wette [mailto:kar...@gm...] > Sent: dinsdag 18 oktober 2011 19:08 > To: Joris Gillis > Cc: swig-devel > Subject: Re: [Swig-devel] octave: a smarter dims(void) > > Hi Joris, > > I was confused by the following code: > > if (!outarg(0).is_cell()) { > > const Cell & c=outarg(0).cell_value(); > which seems to test if the returned octave_value is NOT a cell, but > then tries to convert to a cell anyway! Should the "!" be in the "if" > conditional? > > It might also be useful to have the code work with matrices of > integers, as well as cells. > > Cheers, > Karl > > On 17 October 2011 14:55, Joris Gillis <Jor...@me...> > wrote: > > 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); > > } > > } > > > > --------------------------------------------------------------------- > --------- > > All the data continuously generated in your IT infrastructure > contains a > > definitive record of customers, application performance, security > > threats, fraudulent activity and more. Splunk takes this data and > makes > > sense of it. Business sense. IT sense. Common sense. > > http://p.sf.net/sfu/splunk-d2d-oct > > _______________________________________________ > > Swig-devel mailing list > > Swi...@li... > > https://lists.sourceforge.net/lists/listinfo/swig-devel > > |