# HG changeset patch # User jwe # Date 1037904985 0 # Node ID 40f76ce7a0514416767c1e63496af1d3463a7b58 # Parent f874c6c6884532a77b67aeb4f1ad87335c9373a6 [project @ 2002-11-21 18:56:25 by jwe] diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2002-11-21 John W. Eaton + + * oct-map.h (Octave_map::operator[]): New const version. + * oct-map.cc (equiv_keys): New function. + (assign (const idx_vector&, const Octave_map&)): New function. + * ov-struct.cc (octave_struct::subsasgn): Use it. + 2002-11-20 John W. Eaton * version.h (OCTAVE_VERSION): Now 2.1.40. diff --git a/src/DLD-FUNCTIONS/fsolve.cc b/src/DLD-FUNCTIONS/fsolve.cc --- a/src/DLD-FUNCTIONS/fsolve.cc +++ b/src/DLD-FUNCTIONS/fsolve.cc @@ -229,9 +229,9 @@ @ifinfo\n\ \n\ @example\n\ - df_i -jac = ---- - dx_j + df_i\n\ +jac(i,j) = ----\n\ + dx_j\n\ @end example\n\ @end ifinfo\n\ \n\ diff --git a/src/oct-map.cc b/src/oct-map.cc --- a/src/oct-map.cc +++ b/src/oct-map.cc @@ -34,6 +34,14 @@ #include "oct-map.h" #include "utils.h" +octave_value_list +Octave_map::operator [] (const std::string& key) const +{ + Pix p = map.seek (key); + + return p ? map.contents (p) : octave_value_list (); +} + string_vector Octave_map::keys (void) const { @@ -60,6 +68,58 @@ return array_len; } +static string_vector +equiv_keys (const Octave_map& a, const Octave_map& b) +{ + string_vector retval; + + string_vector a_keys = a.keys().qsort (); + string_vector b_keys = b.keys().qsort (); + + int a_len = a_keys.length (); + int b_len = b_keys.length (); + + if (a_len == b_len) + { + for (int i = 0; i < a_len; i++) + { + if (a_keys[i] != b_keys[i]) + return retval; + } + + retval = a_keys; + } + + return retval; +} + +Octave_map& +Octave_map::assign (const idx_vector& idx, const Octave_map& rhs) +{ + string_vector t_keys = empty () ? rhs.keys () : equiv_keys (*this, rhs); + + if (! t_keys.empty ()) + { + int len = t_keys.length (); + + for (int i = 0; i < len; i++) + { + std::string key = t_keys[i]; + + octave_value_list t_rhs = rhs[key]; + + assign (idx, key, t_rhs); + + if (error_state) + break; + } + } + else + error ("field name mismatch in structure assignment"); + + return *this; +} + Octave_map& Octave_map::assign (const idx_vector& idx, const std::string& key, const octave_value_list& rhs) diff --git a/src/oct-map.h b/src/oct-map.h --- a/src/oct-map.h +++ b/src/oct-map.h @@ -67,6 +67,8 @@ octave_value_list& operator [] (const std::string& key) { return map[key]; } + octave_value_list operator [] (const std::string& key) const; + void del (const std::string& key) { map.del (key); } Pix first (void) const { return map.first (); } @@ -86,6 +88,8 @@ int array_length () const; + Octave_map& assign (const idx_vector& idx, const Octave_map& rhs); + Octave_map& assign (const idx_vector& idx, const std::string& key, const octave_value_list& rhs); diff --git a/src/ov-struct.cc b/src/ov-struct.cc --- a/src/ov-struct.cc +++ b/src/ov-struct.cc @@ -331,7 +331,28 @@ gripe_failed_assignment (); } else - gripe_invalid_index_for_assignment (); + { + octave_value_list t_idx = idx.front (); + + if (t_idx.length () == 1) + { + idx_vector i = t_idx(0).index_vector (); + + Octave_map rhs_map = t_rhs.map_value (); + + if (! error_state) + { + map.assign (i, rhs_map); + + if (! error_state) + retval = octave_value (this, count + 1); + else + gripe_failed_assignment (); + } + else + error ("invalid structure assignment"); + } + } } break;