changeset 29944:029880dbbebb

prefer xelem over indexing m_rep in dim_vector class If handle low-dimensional dim_vector objects with special case code, it will help to have fewer direct references to the arrays of dimensions. * dim-vector.h, dim-vector.cc: Use xelem methods to refer to elements of the dimension array m_rep.
author John W. Eaton <jwe@octave.org>
date Thu, 05 Aug 2021 11:43:32 -0400
parents 513c4fd440b1
children 13e9e244284e
files liboctave/array/dim-vector.cc liboctave/array/dim-vector.h
diffstat 2 files changed, 20 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/dim-vector.cc	Wed Aug 04 00:39:27 2021 -0400
+++ b/liboctave/array/dim-vector.cc	Thu Aug 05 11:43:32 2021 -0400
@@ -54,12 +54,12 @@
 
   for (int i = 0; i < nd; i++)
     {
-      if (m_rep[i] != 1)
-        m_rep[j++] = m_rep[i];
+      if (xelem(i) != 1)
+        xelem(j++) = xelem(i);
     }
 
   if (j == 1)
-    m_rep[1] = 1;
+    xelem(1) = 1;
 
   m_ndims = (j > 2 ? j : 2);
 }
@@ -103,9 +103,9 @@
 
   for (int i = 0; i < n_dims; i++)
     {
-      n *= m_rep[i];
-      if (m_rep[i] != 0)
-        idx_max /= m_rep[i];
+      n *= xelem(i);
+      if (xelem(i) != 0)
+        idx_max /= xelem(i);
       if (idx_max <= 0)
         throw std::bad_alloc ();
     }
@@ -151,7 +151,7 @@
 
   for (int i = 0; i < ndb; i++)
     {
-      if (i != dim && m_rep[i] != dvb(i))
+      if (i != dim && xelem(i) != dvb(i))
         {
           match = false;
           break;
@@ -160,7 +160,7 @@
 
   for (int i = ndb; i < new_nd; i++)
     {
-      if (i != dim && m_rep[i] != 1)
+      if (i != dim && xelem(i) != 1)
         {
           match = false;
           break;
@@ -168,13 +168,13 @@
     }
 
   if (match)
-    m_rep[dim] += (dim < ndb ? dvb(dim) : 1);
+    xelem(dim) += (dim < ndb ? dvb(dim) : 1);
   else
     {
       // Dimensions don't match.  The only allowed fix is to omit 0x0.
       if (ndb == 2 && dvb(0) == 0 && dvb(1) == 0)
         match = true;
-      else if (orig_nd == 2 && m_rep[0] == 0 && m_rep[1] == 0)
+      else if (orig_nd == 2 && xelem(0) == 0 && xelem(1) == 0)
         {
           *this = dvb;
           match = true;
@@ -204,7 +204,7 @@
     return true;
   else if (ndims () == 2 && dvb.ndims () == 2)
     {
-      bool e2dv = m_rep[0] + m_rep[1] == 1;
+      bool e2dv = xelem(0) + xelem(1) == 1;
       bool e2dvb = dvb(0) + dvb(1) == 1;
       if (e2dvb)
         {
@@ -248,15 +248,15 @@
       std::copy_n (m_rep, n-1, retval.m_rep);
 
       // Accumulate overflow dimensions into last remaining dimension
-      int k = m_rep[n-1];
+      int k = xelem(n-1);
       for (int i = n; i < n_dims; i++)
-        k *= m_rep[i];
+        k *= xelem(i);
 
-      retval.m_rep[n-1] = k;
+      retval.xelem(n-1) = k;
 
       // All dim_vectors are at least 2-D.  Make Nx1 if necessary.
       if (n == 1)
-        retval.m_rep[1] = 1;
+        retval.xelem(1) = 1;
 
       return retval;
     }
--- a/liboctave/array/dim-vector.h	Wed Aug 04 00:39:27 2021 -0400
+++ b/liboctave/array/dim-vector.h	Thu Aug 05 11:43:32 2021 -0400
@@ -164,7 +164,7 @@
 
   void chop_trailing_singletons (void)
   {
-    while (m_ndims > 2 && m_rep[m_ndims-1] == 1)
+    while (m_ndims > 2 && xelem(m_ndims-1) == 1)
       m_ndims--;
   }
 
@@ -471,7 +471,7 @@
   {
     octave_idx_type k = 0;
     for (int i = nidx - 1; i >= 0; i--)
-      k = m_rep[i] * k + idx[i];
+      k = xelem(i) * k + idx[i];
 
     return k;
   }
@@ -485,7 +485,7 @@
     int i;
     for (i = start; i < ndims (); i++)
       {
-        if (++(*idx) == m_rep[i])
+        if (++(*idx) == xelem(i))
           *idx++ = 0;
         else
           break;
@@ -502,7 +502,7 @@
 
     octave_idx_type k = 1;
     for (int i = 0; i < nd; i++)
-      retval.m_rep[i] = (k *= m_rep[i]);
+      retval.xelem(i) = (k *= xelem(i));
 
     return retval;
   }
@@ -515,7 +515,7 @@
     octave_idx_type k = idx[0];
 
     for (int i = 1; i < ndims (); i++)
-      k += m_rep[i-1] * idx[i];
+      k += xelem(i-1) * idx[i];
 
     return k;
   }