# HG changeset patch # User Jaroslav Hajek # Date 1277452255 -7200 # Node ID bee1b1a2e29a1d1cb10ddcda4feef323edd2bf26 # Parent d1b09c44d797cfd267fe3669d336fe19747abbf6 yield compatible dims from cell2struct + more fixes. build & tests OK diff -r d1b09c44d797 -r bee1b1a2e29a src/ChangeLog --- a/src/ChangeLog Fri Jun 25 08:47:26 2010 +0200 +++ b/src/ChangeLog Fri Jun 25 09:50:55 2010 +0200 @@ -1,3 +1,10 @@ +2010-06-25 Jaroslav Hajek + + * 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 * ov-struct.cc (Fcell2struct): Rewrite. diff -r d1b09c44d797 -r bee1b1a2e29a src/oct-map.cc --- a/src/oct-map.cc Fri Jun 25 08:47:26 2010 +0200 +++ b/src/oct-map.cc Fri Jun 25 09:50:55 2010 +0200 @@ -833,6 +833,12 @@ optimize_dimensions (); } + else if (nfields () == 0) + { + octave_map tmp (dimensions, rhs.xkeys); + tmp.assign (i, rhs); + *this = tmp; + } else { Array 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 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 perm; diff -r d1b09c44d797 -r bee1b1a2e29a src/oct-map.h --- a/src/oct-map.h Fri Jun 25 08:47:26 2010 +0200 +++ b/src/oct-map.h Fri Jun 25 09:50:55 2010 +0200 @@ -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) { } diff -r d1b09c44d797 -r bee1b1a2e29a src/ov-struct.cc --- a/src/ov-struct.cc Fri Jun 25 08:47:26 2010 +0200 +++ b/src/ov-struct.cc Fri Jun 25 09:50:55 2010 +0200 @@ -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 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 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; diff -r d1b09c44d797 -r bee1b1a2e29a src/ov.cc --- a/src/ov.cc Fri Jun 25 08:47:26 2010 +0200 +++ b/src/ov.cc Fri Jun 25 09:50:55 2010 +0200 @@ -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 ();