changeset 23392:77a7f2fecd74

New xelem function for fast access to dim_vector internals. * dim-vector.h: Declare xelem inline functions for fast access to dim_vector elements with no checking. Replace elem with xelem in cases where input is guaranteed to be valid. * dim-vector.cc: Replace elem with xelem in cases where input is guaranteed to be valid.
author Rik <rik@octave.org>
date Wed, 12 Apr 2017 16:55:19 -0700
parents 209e749363a2
children 675ad11b5c05
files liboctave/array/dim-vector.cc liboctave/array/dim-vector.h
diffstat 2 files changed, 25 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/dim-vector.cc	Wed Apr 12 16:29:50 2017 -0400
+++ b/liboctave/array/dim-vector.cc	Wed Apr 12 16:55:19 2017 -0700
@@ -76,7 +76,7 @@
 
   for (int i = 0; i < ndims (); i++)
     {
-      buf << elem (i);
+      buf << xelem (i);
 
       if (i < ndims () - 1)
         buf << sep;
@@ -93,7 +93,7 @@
   int retval = 0;
 
   for (int i = 0; i < ndims (); i++)
-    if (elem (i) == 1)
+    if (xelem (i) == 1)
       retval++;
 
   return retval;
@@ -129,10 +129,10 @@
 
   for (int i = 0; i < ndims (); i++)
     {
-      if (elem (i) == 1)
+      if (xelem (i) == 1)
         dims_changed = true;
       else
-        new_dims(k++) = elem (i);
+        new_dims(k++) = xelem (i);
     }
 
   if (dims_changed)
--- a/liboctave/array/dim-vector.h	Wed Apr 12 16:29:50 2017 -0400
+++ b/liboctave/array/dim-vector.h	Wed Apr 12 16:55:19 2017 -0700
@@ -211,13 +211,21 @@
     rep -= all_lengths.size ();
   }
 
+  // Fast access with absolutely no checking
+
+  octave_idx_type& xelem (int i) { return rep[i]; }
+    
+  octave_idx_type xelem (int i) const { return rep[i]; }
+
+  // Safe access to to elements
+
   octave_idx_type& elem (int i)
   {
 #if defined (OCTAVE_ENABLE_BOUNDS_CHECK)
     assert (i >= 0 && i < ndims ());
 #endif
     make_unique ();
-    return rep[i];
+    return xelem (i);
   }
 
   octave_idx_type elem (int i) const
@@ -225,7 +233,7 @@
 #if defined (OCTAVE_ENABLE_BOUNDS_CHECK)
     assert (i >= 0 && i < ndims ());
 #endif
-    return rep[i];
+    return xelem (i);
   }
 
   void chop_trailing_singletons (void)
@@ -294,7 +302,7 @@
   //! Number of dimensions.
   /*!
       Returns the number of dimensions of the dim_vector.  This is number of
-      elements in the dim_vector including trailing singetons.  It is also
+      elements in the dim_vector including trailing singletons.  It is also
       the number of dimensions an Array with this dim_vector would have.
   */
   octave_idx_type ndims (void) const { return rep[-1]; }
@@ -335,7 +343,7 @@
 
     for (int i = 0; i < ndims (); i++)
       {
-        if (elem (i) != 0)
+        if (xelem (i) != 0)
           {
             retval = false;
             break;
@@ -347,12 +355,12 @@
 
   bool empty_2d (void) const
   {
-    return ndims () == 2 && (elem (0) == 0 || elem (1) == 0);
+    return ndims () == 2 && (xelem (0) == 0 || xelem (1) == 0);
   }
 
   bool zero_by_zero (void) const
   {
-    return ndims () == 2 && elem (0) == 0 && elem (1) == 0;
+    return ndims () == 2 && xelem (0) == 0 && xelem (1) == 0;
   }
 
   bool any_zero (void) const
@@ -361,7 +369,7 @@
 
     for (int i = 0; i < ndims (); i++)
       {
-        if (elem (i) == 0)
+        if (xelem (i) == 0)
           {
             retval = true;
             break;
@@ -415,7 +423,7 @@
     int i;
 
     for (i = 0; i < n_dims; i++)
-      if (elem (i) < 0)
+      if (xelem (i) < 0)
         break;
 
     return i < n_dims;
@@ -440,7 +448,7 @@
 
   dim_vector as_column (void) const
   {
-    if (ndims () == 2 && elem (1) == 1)
+    if (ndims () == 2 && xelem (1) == 1)
       return *this;
     else
       return dim_vector (numel (), 1);
@@ -448,7 +456,7 @@
 
   dim_vector as_row (void) const
   {
-    if (ndims () == 2 && elem (0) == 1)
+    if (ndims () == 2 && xelem (0) == 1)
       return *this;
     else
       return dim_vector (1, numel ());
@@ -456,7 +464,7 @@
 
   bool is_vector (void) const
   {
-    return (ndims () == 2 && (elem (0) == 1 || elem (1) == 1));
+    return (ndims () == 2 && (xelem (0) == 1 || xelem (1) == 1));
   }
 
   bool is_nd_vector (void) const
@@ -465,7 +473,7 @@
 
     for (int i = 0; i < ndims (); i++)
       {
-        if (elem (i) != 1)
+        if (xelem (i) != 1)
           {
             num_non_one++;
 
@@ -507,7 +515,7 @@
   {
     for (int i = 0; i < ndims (); i++)
       {
-        if (elem (i) != 1)
+        if (xelem (i) != 1)
           return i;
       }