Mercurial > hg > octave-lyh
diff src/ov-struct.cc @ 9851:1fac51c5f83f
save dims for empty structs
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 23 Nov 2009 08:43:42 +0100 |
parents | f786dca09f79 |
children | 43a7adf62534 |
line wrap: on
line diff
--- a/src/ov-struct.cc +++ b/src/ov-struct.cc @@ -1247,6 +1247,14 @@ octave_idx_type nf = m.nfields (); + const dim_vector dv = dims (); + + os << "# ndims: " << dv.length () << "\n"; + + for (int i = 0; i < dv.length (); i++) + os << " " << dv (i); + os << "\n"; + os << "# length: " << nf << "\n"; // Iterating over the list of keys will preserve the order of the @@ -1272,13 +1280,39 @@ octave_struct::load_ascii (std::istream& is) { octave_idx_type len = 0; + dim_vector dv (1, 1); bool success = true; - if (extract_keyword (is, "length", len) && len >= 0) + // KLUGE: earlier Octave versions did not save extra dimensions with struct, + // and as a result did not preserve dimensions for empty structs. + // The default dimensions were 1x1, which we want to preserve. + string_vector keywords(2); + + keywords[0] = "ndims"; + keywords[1] = "length"; + + std::string kw; + + if (extract_keyword (is, keywords, kw, len, true)) + { + if (kw == keywords[0]) + { + int mdims = std::max (len, 2); + dv.resize (mdims); + for (int i = 0; i < mdims; i++) + is >> dv(i); + + success = extract_keyword (is, keywords[1], len); + } + } + else + success = false; + + if (success && len >= 0) { if (len > 0) { - Octave_map m (map); + Octave_map m (dv); for (octave_idx_type j = 0; j < len; j++) { @@ -1312,7 +1346,7 @@ } } else if (len == 0 ) - map = Octave_map (dim_vector (1, 1)); + map = Octave_map (dv); else panic_impossible (); }