diff liboctave/idx-vector.cc @ 9894:83bd7f34f9da

improve idx_vector->octave_value conversion
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 01 Dec 2009 10:41:52 +0100
parents 034677ab6865
children b7915ebe8acf
line wrap: on
line diff
--- a/liboctave/idx-vector.cc
+++ b/liboctave/idx-vector.cc
@@ -168,6 +168,13 @@
   return os;
 }
 
+Range
+idx_vector::idx_range_rep::unconvert (void) const
+{
+  return Range (static_cast<double> (start+1), 
+                static_cast<double> (step), len);
+}
+
 inline octave_idx_type
 convert_index (octave_idx_type i, bool& conv_error, 
                octave_idx_type& ext)
@@ -235,6 +242,12 @@
   return os << data;
 }
 
+double
+idx_vector::idx_scalar_rep::unconvert (void) const
+{
+  return data + 1;
+}
+
 DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_vector_rep);
 
 template <class T>
@@ -394,6 +407,15 @@
   return os;
 }
 
+Array<double>
+idx_vector::idx_vector_rep::unconvert (void) const
+{
+  Array<double> retval (orig_dims);
+  for (octave_idx_type i = 0; i < len; i++)
+    retval.xelem (i) = data[i] + 1;
+  return retval;
+}
+
 DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_mask_rep);
 
 idx_vector::idx_mask_rep::idx_mask_rep (bool b)
@@ -481,6 +503,20 @@
   return os;
 }
 
+Array<bool>
+idx_vector::idx_mask_rep::unconvert (void) const
+{
+  if (aowner)
+    return *aowner;
+  else
+    {
+      Array<bool> retval (orig_dims);
+      for (octave_idx_type i = 0; i < len; i++)
+        retval.xelem (i) = data[i];
+      return retval;
+    }
+}
+
 const idx_vector idx_vector::colon (new idx_vector::idx_colon_rep ());
 
 idx_vector::idx_vector (const Array<bool>& bnda)
@@ -833,7 +869,8 @@
 }
 
 void idx_vector::unconvert (idx_class_type& iclass,
-                            double& scalar, Range& range, Array<double>& array)
+                            double& scalar, Range& range, 
+                            Array<double>& array, Array<bool>& mask) const
 {
   iclass = idx_class ();
   switch (iclass)
@@ -843,32 +880,25 @@
     case class_range:
         {
           idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
-          double start = r->get_start (), step = r->get_step ();
-          range = Range (start+1, step, r->length (0));
+          range = r->unconvert ();
         }
       break;
     case class_scalar:
         {
           idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
-          scalar = r->get_data () + 1;
+          scalar = r->unconvert ();
         }
       break;
     case class_vector:
         {
           idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep);
-          const octave_idx_type *data = r->get_data ();
-          array = Array<double> (r->orig_dimensions ());
-          octave_idx_type len = r->length (0);
-          for (octave_idx_type i = 0; i < len; i++)
-            array.xelem (i) = data[i] + 1;
+          array = r->unconvert ();
         }
       break;
     case class_mask:
         {
-          // This is done because we don't want a logical index be cached for a
-          // numeric array.
-          *this = unmask ();
-          unconvert (iclass, scalar, range, array);
+          idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep);
+          mask = r->unconvert ();
         }
       break;
     default: