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	Tue May 07 04:49:53 2002 +0000
+++ b/src/ChangeLog	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/DLD-FUNCTIONS/time.cc	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/oct-map.cc	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/oct-map.h	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/oct-obj.cc	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/oct-obj.h	Tue May 07 18:10:44 2002 +0000
@@ -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	Tue May 07 04:49:53 2002 +0000
+++ b/src/ov-struct.cc	Tue May 07 18:10:44 2002 +0000
@@ -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 ();