# HG changeset patch # User John W. Eaton # Date 1628178212 14400 # Node ID 029880dbbebb4b18d5fceec32ca2b7e1802f3cc6 # Parent 513c4fd440b1e3e59512615438b429a8f26d54da 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. diff -r 513c4fd440b1 -r 029880dbbebb liboctave/array/dim-vector.cc --- 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; } diff -r 513c4fd440b1 -r 029880dbbebb liboctave/array/dim-vector.h --- 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; }