Mercurial > hg > octave-lyh
changeset 10753:bee1b1a2e29a
yield compatible dims from cell2struct + more fixes. build & tests OK
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 25 Jun 2010 09:50:55 +0200 |
parents | d1b09c44d797 |
children | 92eb5fb58ebc |
files | src/ChangeLog src/oct-map.cc src/oct-map.h src/ov-struct.cc src/ov.cc |
diffstat | 5 files changed, 52 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2010-06-25 Jaroslav Hajek <highegg@gmail.com> + + * oct-map.h (octave_map::octave_map (const dim_vector&, const + octave_fields&)): New internal ctor. + + * oct-map.cc (octave_map::assign): Handle no fields case. + 2010-06-25 Jaroslav Hajek <highegg@gmail.com> * ov-struct.cc (Fcell2struct): Rewrite.
--- a/src/oct-map.cc +++ b/src/oct-map.cc @@ -833,6 +833,12 @@ optimize_dimensions (); } + else if (nfields () == 0) + { + octave_map tmp (dimensions, rhs.xkeys); + tmp.assign (i, rhs); + *this = tmp; + } else { Array<octave_idx_type> perm; @@ -870,6 +876,12 @@ optimize_dimensions (); } + else if (nfields () == 0) + { + octave_map tmp (dimensions, rhs.xkeys); + tmp.assign (i, j, rhs); + *this = tmp; + } else { Array<octave_idx_type> perm; @@ -907,6 +919,12 @@ optimize_dimensions (); } + else if (nfields () == 0) + { + octave_map tmp (dimensions, rhs.xkeys); + tmp.assign (ia, rhs); + *this = tmp; + } else { Array<octave_idx_type> perm;
--- a/src/oct-map.h +++ b/src/oct-map.h @@ -247,6 +247,9 @@ octave_map (const octave_fields& k) : xkeys (k), xvals (k.nfields ()), dimensions () { } + octave_map (const dim_vector& dv, const octave_fields& k) + : xkeys (k), xvals (k.nfields (), Cell (dv)), dimensions (dv) { } + public: octave_map (void) : xkeys (), xvals (), dimensions () { } @@ -257,7 +260,7 @@ : xkeys (k), xvals (k.length ()), dimensions (1, 1) { } octave_map (const dim_vector& dv, const string_vector& k) - : xkeys (k), xvals (k.length ()), dimensions (dv) { } + : xkeys (k), xvals (k.length (), Cell (dv)), dimensions (dv) { } octave_map (const octave_map& m) : xkeys (m.xkeys), xvals (m.xvals), dimensions (m.dimensions) { }
--- a/src/ov-struct.cc +++ b/src/ov-struct.cc @@ -1418,7 +1418,7 @@ bool success = true; octave_idx_type len = 0; - if (extract_keyword (is, "length", len, true) && len >= 0) + if (extract_keyword (is, "length", len) && len >= 0) { if (len > 0) { @@ -2043,14 +2043,31 @@ if (! error_state) { - octave_map map; - Array<idx_vector> ia (std::max (dim+1, vals.ndims ()), 1, - idx_vector::colon); + int nd = std::max (dim+1, vals.ndims ()); + // result dimensions. + dim_vector rdv = vals.dims ().redim (nd); + + assert (ext == rdv(dim)); + if (nd == 2) + { + rdv(0) = rdv(1-dim); + rdv(1) = 1; + } + else + { + for (int i = dim + 1; i < nd; i++) + rdv(i-1) = rdv(i); + + rdv.resize (nd-1); + } + + octave_map map (rdv); + Array<idx_vector> ia (nd, 1, idx_vector::colon); for (octave_idx_type i = 0; i < ext; i++) { ia(dim) = i; - map.setfield (fields(i), vals.index (ia)); + map.setfield (fields(i), vals.index (ia).reshape (rdv)); } retval = map;
--- a/src/ov.cc +++ b/src/ov.cc @@ -2653,6 +2653,7 @@ octave_sparse_matrix::register_type (); octave_sparse_complex_matrix::register_type (); octave_struct::register_type (); + octave_scalar_struct::register_type (); octave_class::register_type (); octave_cs_list::register_type (); octave_magic_colon::register_type ();