Mercurial > hg > octave-lyh
changeset 3932:2e2e32198722
[project @ 2002-05-07 18:10:44 by jwe]
author | jwe |
---|---|
date | Tue, 07 May 2002 18:10:44 +0000 |
parents | 311981a9726d |
children | f9ea3dcf58ee |
files | src/ChangeLog src/DLD-FUNCTIONS/time.cc src/oct-map.cc src/oct-map.h src/oct-obj.cc src/oct-obj.h src/ov-struct.cc |
diffstat | 7 files changed, 110 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,18 @@ +2002-05-07 John W. Eaton <jwe@bevo.che.wisc.edu> + + * ov-struct.cc (octave_struct::print_raw): Print scalar struct + arrays more compactly. + + * DLD-FUNCTIONS/time.cc (extract_tm): Handle new struct array def. + + * oct-map.cc (Octave_map::array_len): New data member. + (Octave_map::operator[], Octave_map::contsnts): Return + octave_value_list, not Octave_value. Change callers as necessary. + (Octave_map::assign): New function. + (Octave_map::array_length): New fucntion. + * oct-obj.cc (octave_value_list::assign): New function. + + 2002-05-06 John W. Eaton <jwe@bevo.che.wisc.edu> * TEMPLATE-INST/Map-oct-obj.cc: New file.
--- a/src/DLD-FUNCTIONS/time.cc +++ b/src/DLD-FUNCTIONS/time.cc @@ -60,17 +60,17 @@ { octave_base_tm tm; - tm.usec (static_cast<int> (m ["usec"] . double_value ())); - tm.sec (static_cast<int> (m ["sec"] . double_value ())); - tm.min (static_cast<int> (m ["min"] . double_value ())); - tm.hour (static_cast<int> (m ["hour"] . double_value ())); - tm.mday (static_cast<int> (m ["mday"] . double_value ())); - tm.mon (static_cast<int> (m ["mon"] . double_value ())); - tm.year (static_cast<int> (m ["year"] . double_value ())); - tm.wday (static_cast<int> (m ["wday"] . double_value ())); - tm.yday (static_cast<int> (m ["yday"] . double_value ())); - tm.isdst (static_cast<int> (m ["isdst"] . double_value ())); - tm.zone (m ["zone"] . string_value ()); + tm.usec (static_cast<int> (m ["usec"](0) . double_value ())); + tm.sec (static_cast<int> (m ["sec"](0) . double_value ())); + tm.min (static_cast<int> (m ["min"](0) . double_value ())); + tm.hour (static_cast<int> (m ["hour"](0) . double_value ())); + tm.mday (static_cast<int> (m ["mday"](0) . double_value ())); + tm.mon (static_cast<int> (m ["mon"](0) . double_value ())); + tm.year (static_cast<int> (m ["year"](0) . double_value ())); + tm.wday (static_cast<int> (m ["wday"](0) . double_value ())); + tm.yday (static_cast<int> (m ["yday"](0) . double_value ())); + tm.isdst (static_cast<int> (m ["isdst"](0) . double_value ())); + tm.zone (m ["zone"](0) . string_value ()); return tm; }
--- a/src/oct-map.cc +++ b/src/oct-map.cc @@ -28,6 +28,7 @@ #include <config.h> #endif +#include "error.h" #include "str-vec.h" #include "oct-map.h" @@ -47,6 +48,45 @@ return names; } +int +Octave_map::array_length (void) const +{ + if (array_len == 0 && length () != 0) + { + Pix p = first (); + array_len = contents(p).length (); + } + return array_len; +} + +Octave_map& +Octave_map::assign (const idx_vector& idx, const std::string& key, + const octave_value_list& rhs) +{ + octave_value_list tmp = map[key]; + + tmp.assign (idx, rhs); + + if (! error_state) + { + int n = tmp.length (); + + if (n > array_length ()) + { + octave_value fill_value = Matrix (); + + for (Pix p = first (); p != 0; next (p)) + contents(p).resize (n, fill_value); + + array_len = n; + } + + map[key] = tmp; + } + + return *this; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***
--- a/src/oct-map.h +++ b/src/oct-map.h @@ -37,31 +37,35 @@ Octave_map { public: - Octave_map (void) : map (octave_value_list ()) { } + Octave_map (void) : map (octave_value_list ()), array_len (0) { } Octave_map (const std::string& key, const octave_value& value) - : map (octave_value_list ()) + : map (octave_value_list ()), array_len (1) { map[key] = octave_value_list (value); } - Octave_map (const Octave_map& m) : map (m.map) { } + Octave_map (const Octave_map& m) + : map (m.map), array_len (m.array_len) { } Octave_map& operator = (const Octave_map& m) { if (this != &m) - map = m.map; - + { + map = m.map; + array_len = m.array_len; + } return *this; } ~Octave_map (void) { } + // This is the number of keys. int length (void) const { return map.length (); } int empty (void) const { return map.empty (); } - octave_value& operator [] (const std::string& key) { return map[key](0); } + octave_value_list& operator [] (const std::string& key) { return map[key]; } void del (const std::string& key) { map.del (key); } @@ -70,7 +74,7 @@ std::string key (Pix p) const { return map.key (p); } - octave_value& contents (Pix p) const { return map.contents (p)(0); } + octave_value_list& contents (Pix p) const { return map.contents (p); } Pix seek (const std::string& key) const { return map.seek (key); } @@ -80,10 +84,18 @@ string_vector make_name_list (void); + int array_length () const; + + Octave_map& assign (const idx_vector& idx, const std::string& key, + const octave_value_list& rhs); + private: // The map of names to values. CHMap<octave_value_list> map; + + // The current size of this struct array; + mutable int array_len; }; #endif
--- a/src/oct-obj.cc +++ b/src/oct-obj.cc @@ -142,6 +142,15 @@ return octave_value_list (data.index (i)); } +octave_value_list& +octave_value_list::assign (const idx_vector& i, + const octave_value_list& rhs) +{ + data.set_index (i); + ::assign (data, rhs.data); + return *this; +} + bool octave_value_list::all_strings_p (void) const {
--- a/src/oct-obj.h +++ b/src/oct-obj.h @@ -138,6 +138,9 @@ octave_value_list index (idx_vector& i) const; + octave_value_list& assign (const idx_vector& i, + const octave_value_list& rhs); + bool all_strings_p (void) const; string_vector make_argv (const std::string&) const;
--- a/src/ov-struct.cc +++ b/src/ov-struct.cc @@ -32,6 +32,7 @@ #include "error.h" #include "oct-lvalue.h" +#include "ov-list.h" #include "ov-struct.h" #include "unwind-prot.h" #include "variables.h" @@ -67,7 +68,8 @@ octave_lvalue octave_struct::struct_elt_ref (octave_value *, const std::string& nm) { - return octave_lvalue (&map [nm]); + // XXX FIXME XXX -- struct array + return octave_lvalue (&map[nm](0)); } void @@ -95,12 +97,20 @@ increment_indent_level (); + int n = map.array_length (); + for (Pix p = map.first (); p; map.next (p)) { std::string key = map.key (p); - octave_value val = map.contents (p); + octave_value_list val = map.contents (p); - val.print_with_name (os, key); + if (n == 1) + val(0).print_with_name (os, key); + else + { + octave_list tmp (val); + tmp.print_with_name (os, key); + } } decrement_indent_level ();