diff liboctave/idx-vector.cc @ 9479:d9716e3ee0dd

supply optimized compiled sub2ind & ind2sub
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 03 Aug 2009 15:52:40 +0200
parents 47f19c11b558
children a9b37bae1802
line wrap: on
line diff
--- a/liboctave/idx-vector.cc
+++ b/liboctave/idx-vector.cc
@@ -540,6 +540,49 @@
   return res;
 }
 
+void
+idx_vector::copy_data (octave_idx_type *data) const
+{
+  octave_idx_type len = rep->length (0);
+
+  switch (rep->idx_class ())
+    {
+    case class_colon:
+      current_liboctave_error_handler ("colon not allowed");
+      break;
+    case class_range:
+        {
+          idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
+          octave_idx_type start = r->get_start (), step = r->get_step ();
+          octave_idx_type i, j;
+          if (step == 1)
+            for (i = start, j = start + len; i < j; i++) *data++ = i;
+          else if (step == -1)
+            for (i = start, j = start - len; i > j; i--) *data++ = i;
+          else
+            for (i = 0, j = start; i < len; i++, j += step) *data++ = j;
+        }
+      break;
+    case class_scalar:
+        {
+          idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
+          *data = r->get_data ();
+        }
+      break;
+    case class_vector:
+        {
+          idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep);
+          const octave_idx_type *rdata = r->get_data ();
+          std::copy (rdata, rdata + len, data);
+        }
+      break;
+    default:
+      assert (false);
+      break;
+    }
+
+}
+
 idx_vector
 idx_vector::complement (octave_idx_type n) const
 {
@@ -596,6 +639,43 @@
   return retval;
 }
 
+void idx_vector::unconvert (idx_class_type& iclass,
+                            double& scalar, Range& range, Array<double>& array) const
+{
+  iclass = idx_class ();
+  switch (iclass)
+    {
+    case class_colon:
+      break;
+    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));
+        }
+      break;
+    case class_scalar:
+        {
+          idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
+          scalar = r->get_data () + 1;
+        }
+      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;
+        }
+      break;
+    default:
+      assert (false);
+      break;
+    }
+}
+
 octave_idx_type 
 idx_vector::freeze (octave_idx_type z_len, const char *, bool resize_ok)
 {