# HG changeset patch # User Carlo de Falco # Date 1569834342 -7200 # Mon Sep 30 11:05:42 2019 +0200 # Node ID ade846c2cfb5945e6d69d5203a792ff8aa58c5ab # Parent 36b61012208628217985a16273d98e04754407b5 Remove wrapper template class NoAlias (bug #56752) * liboctave/array/Array.h: remove template definition * libinterp/corefcn/cellfun.cc, libinterp/corefcn/data.cc, libinterp/corefcn/xpow.cc, libinterp/octave-value/ov-cell.cc, libinterp/octave-value/ov-cell.cc, libinterp/octave-value/ov-flt-re-mat.cc, libinterp/octave-value/ov-flt-re-mat.cc, liboctave/array/CMatrix.cc, liboctave/array/CRowVector.cc, liboctave/array/CRowVector.cc, liboctave/array/Sparse.cc, liboctave/array/dMatrix.cc, liboctave/array/dRowVector.cc, liboctave/array/fCMatrix.cc, liboctave/array/fCRowVector.cc, liboctave/array/fMatrix.cc, liboctave/array/fRowVector.cc: use xelem method explicit instead of the NoAlias wrapper. diff --git a/libinterp/corefcn/cellfun.cc b/libinterp/corefcn/cellfun.cc --- a/libinterp/corefcn/cellfun.cc +++ b/libinterp/corefcn/cellfun.cc @@ -1941,7 +1941,7 @@ static Cell do_mat2cell_2d (const Array2D& a, const Array *d, int nd) { - NoAlias retval; + Cell retval; assert (nd == 1 || nd == 2); assert (a.ndims () == 2); @@ -1966,7 +1966,7 @@ for (octave_idx_type i = 0; i < nidx; i++) { octave_idx_type u = l + d[ivec](i); - retval(i) = a.index (idx_vector (l, u)); + retval.xelem (i) = a.index (idx_vector (l, u)); l = u; } } @@ -1984,7 +1984,7 @@ { octave_quit (); - retval(i,j) = a.index (ridx[i], cidx[j]); + retval.xelem (i,j) = a.index (ridx[i], cidx[j]); } } @@ -1998,7 +1998,7 @@ Cell do_mat2cell_nd (const ArrayND& a, const Array *d, int nd) { - NoAlias retval; + Cell retval; assert (nd >= 1); if (mat2cell_mismatch (a.dims (), d, nd)) @@ -2027,17 +2027,17 @@ } OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, ridx, nd, 0); - NoAlias< Array> ra_idx + Array ra_idx (dim_vector (1, std::max (nd, a.ndims ())), idx_vector::colon); - + for (octave_idx_type j = 0; j < retval.numel (); j++) { octave_quit (); for (int i = 0; i < nd; i++) - ra_idx(i) = idx[i][ridx[i]]; + ra_idx.xelem (i) = idx[i][ridx[i]]; - retval(j) = a.index (ra_idx); + retval.xelem (j) = a.index (ra_idx); rdv.increment_index (ridx); } @@ -2062,7 +2062,7 @@ Cell do_mat2cell (octave_value& a, const Array *d, int nd) { - NoAlias retval; + Cell retval; assert (nd >= 1); if (mat2cell_mismatch (a.dims (), d, nd)) @@ -2101,7 +2101,7 @@ for (int i = 0; i < nd; i++) ra_idx(i) = idx[i][ridx[i]]; - retval(j) = a.do_index_op (ra_idx); + retval.xelem (j) = a.do_index_op (ra_idx); rdv.increment_index (ridx); } @@ -2301,7 +2301,7 @@ || (dim == 1 && array.rows () == 1))) { for (octave_idx_type i = 0; i < n; i++) - retval(i) = array.index (idx_vector (lb(i) - 1, ub(i))); + retval.xelem (i) = array.index (idx_vector (lb(i) - 1, ub(i))); } else { @@ -2316,7 +2316,7 @@ for (octave_idx_type i = 0; i < n; i++) { idx(dim) = idx_vector (lb(i) - 1, ub(i)); - retval(i) = array.index (idx); + retval.xelem (i) = array.index (idx); } } @@ -2436,7 +2436,7 @@ for (octave_idx_type i = 0; i < n; i++) { idx(dim) = Range (lb(i), ub(i)); - retcell(i) = x.do_index_op (idx); + retcell.xelem (i) = x.do_index_op (idx); } } @@ -2477,7 +2477,7 @@ const Cell x = args(0).xcell_value ("cellindexmat: X must be a cell"); - NoAlias y (x.dims ()); + Cell y (x.dims ()); octave_idx_type nel = x.numel (); octave_value_list idx = args.slice (1, args.length () - 1); @@ -2487,7 +2487,7 @@ octave_value tmp = x(i); - y(i) = tmp.do_index_op (idx); + y.xelem (i) = tmp.do_index_op (idx); } return octave_value (y); diff --git a/libinterp/corefcn/data.cc b/libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc +++ b/libinterp/corefcn/data.cc @@ -2722,10 +2722,10 @@ { int ndims = dimensions.ndims (); - NoAlias m (1, ndims); + Matrix m (1, ndims); for (int i = 0; i < ndims; i++) - m(i) = dimensions(i); + m.xelem (i) = dimensions(i); retval(0) = m; } @@ -7881,7 +7881,7 @@ octave_value x = args(0); - NoAlias< Array> r (rm.dims ()); + Array r (rm.dims ()); for (octave_idx_type i = 0; i < rm.numel (); i++) { @@ -7889,7 +7889,7 @@ if (static_cast (rx) != rm(i)) error ("repelems: R must be a matrix of integers"); - r(i) = rx; + r.xelem (i) = rx; } switch (x.builtin_type ()) diff --git a/libinterp/corefcn/xpow.cc b/libinterp/corefcn/xpow.cc --- a/libinterp/corefcn/xpow.cc +++ b/libinterp/corefcn/xpow.cc @@ -1192,30 +1192,30 @@ } else { - NoAlias result (a.dims ()); + NDArray result (a.dims ()); int ib = static_cast (b); if (ib == 2) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = a(i) * a(i); + result.xelem (i) = a(i) * a(i); } else if (ib == 3) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = a(i) * a(i) * a(i); + result.xelem (i) = a(i) * a(i) * a(i); } else if (ib == -1) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = 1.0 / a(i); + result.xelem (i) = 1.0 / a(i); } else { for (octave_idx_type i = 0; i < a.numel (); i++) { octave_quit (); - result(i) = std::pow (a(i), ib); + result.xelem (i) = std::pow (a(i), ib); } } @@ -2501,30 +2501,30 @@ } else { - NoAlias result (a.dims ()); + FloatNDArray result (a.dims ()); int ib = static_cast (b); if (ib == 2) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = a(i) * a(i); + result.xelem (i) = a(i) * a(i); } else if (ib == 3) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = a(i) * a(i) * a(i); + result.xelem (i) = a(i) * a(i) * a(i); } else if (ib == -1) { for (octave_idx_type i = 0; i < a.numel (); i++) - result(i) = 1.0f / a(i); + result.xelem (i) = 1.0f / a(i); } else { for (octave_idx_type i = 0; i < a.numel (); i++) { octave_quit (); - result(i) = std::pow (a(i), ib); + result.xelem (i) = std::pow (a(i), ib); } } diff --git a/libinterp/octave-value/ov-cell.cc b/libinterp/octave-value/ov-cell.cc --- a/libinterp/octave-value/ov-cell.cc +++ b/libinterp/octave-value/ov-cell.cc @@ -1382,7 +1382,7 @@ for (int i = 1; i < result_dv.ndims (); i++) result_dv(i) = m_dv(i-1); - NoAlias c (result_dv); + Cell c (result_dv); octave_idx_type n_elts = m.numel (); @@ -1390,7 +1390,7 @@ // we don't need a key lookup at all. for (octave_idx_type j = 0; j < n_elts; j++) for (octave_idx_type i = 0; i < num_fields; i++) - c(i,j) = m.contents(i)(j); + c.xelem (i,j) = m.contents(i)(j); return ovl (c); } diff --git a/libinterp/octave-value/ov-flt-re-mat.cc b/libinterp/octave-value/ov-flt-re-mat.cc --- a/libinterp/octave-value/ov-flt-re-mat.cc +++ b/libinterp/octave-value/ov-flt-re-mat.cc @@ -738,7 +738,7 @@ do_rc_map (const FloatNDArray& a, FloatComplex (&fcn) (float)) { octave_idx_type n = a.numel (); - NoAlias rr (a.dims ()); + FloatNDArray rr (a.dims ()); for (octave_idx_type i = 0; i < n; i++) { @@ -746,21 +746,21 @@ FloatComplex tmp = fcn (a(i)); if (tmp.imag () == 0.0) - rr(i) = tmp.real (); + rr.xelem (i) = tmp.real (); else { - NoAlias rc (a.dims ()); + FloatComplexNDArray rc (a.dims ()); for (octave_idx_type j = 0; j < i; j++) - rc(j) = rr(j); + rc.xelem (j) = rr.xelem (j); - rc(i) = tmp; + rc.xelem (i) = tmp; for (octave_idx_type j = i+1; j < n; j++) { octave_quit (); - rc(j) = fcn (a(j)); + rc.xelem (j) = fcn (a(j)); } return new octave_float_complex_matrix (rc); diff --git a/libinterp/octave-value/ov-re-mat.cc b/libinterp/octave-value/ov-re-mat.cc --- a/libinterp/octave-value/ov-re-mat.cc +++ b/libinterp/octave-value/ov-re-mat.cc @@ -865,7 +865,7 @@ do_rc_map (const NDArray& a, Complex (&fcn) (double)) { octave_idx_type n = a.numel (); - NoAlias rr (a.dims ()); + NDArray rr (a.dims ()); for (octave_idx_type i = 0; i < n; i++) { @@ -873,21 +873,21 @@ Complex tmp = fcn (a(i)); if (tmp.imag () == 0.0) - rr(i) = tmp.real (); + rr.xelem (i) = tmp.real (); else { - NoAlias rc (a.dims ()); + ComplexNDArray rc (a.dims ()); for (octave_idx_type j = 0; j < i; j++) - rc(j) = rr(j); + rc.xelem (j) = rr.xelem (j); - rc(i) = tmp; + rc.xelem (i) = tmp; for (octave_idx_type j = i+1; j < n; j++) { octave_quit (); - rc(j) = fcn (a(j)); + rc.xelem (j) = fcn (a(j)); } return new octave_complex_matrix (rc); diff --git a/liboctave/array/Array.h b/liboctave/array/Array.h --- a/liboctave/array/Array.h +++ b/liboctave/array/Array.h @@ -877,30 +877,6 @@ dimensions.chop_trailing_singletons (); } -//! This is a simple wrapper template that will subclass an Array -//! type or any later type derived from it and override the default -//! non-const operator() to not check for the array's uniqueness. It -//! is, however, the user's responsibility to ensure the array is -//! actually unaliased whenever elements are accessed. -template -class NoAlias : public ArrayClass -{ - typedef typename ArrayClass::element_type T; -public: - NoAlias () : ArrayClass () { } - - using ArrayClass::ArrayClass; - - T& operator () (octave_idx_type n) - { return ArrayClass::xelem (n); } - T& operator () (octave_idx_type i, octave_idx_type j) - { return ArrayClass::xelem (i, j); } - T& operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k) - { return ArrayClass::xelem (i, j, k); } - T& operator () (const Array& ra_idx) - { return ArrayClass::xelem (ra_idx); } -}; - template std::ostream& operator << (std::ostream& os, const Array& a); diff --git a/liboctave/array/CMatrix.cc b/liboctave/array/CMatrix.cc --- a/liboctave/array/CMatrix.cc +++ b/liboctave/array/CMatrix.cc @@ -3610,7 +3610,7 @@ (*current_liboctave_error_handler) ("linspace: vectors must be of equal length"); - NoAlias retval; + ComplexMatrix retval; if (n < 1) { @@ -3620,19 +3620,19 @@ retval.clear (m, n); for (octave_idx_type i = 0; i < m; i++) - retval(i, 0) = x1(i); + retval.xelem (i, 0) = x1(i); // The last column is unused so temporarily store delta there - Complex *delta = &retval(0, n-1); + Complex *delta = &retval.xelem (0, n-1); for (octave_idx_type i = 0; i < m; i++) delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0); for (octave_idx_type j = 1; j < n-1; j++) for (octave_idx_type i = 0; i < m; i++) - retval(i, j) = x1(i) + static_cast (j)*delta[i]; + retval.xelem (i, j) = x1(i) + static_cast (j)*delta[i]; for (octave_idx_type i = 0; i < m; i++) - retval(i, n-1) = x2(i); + retval.xelem (i, n-1) = x2(i); return retval; } diff --git a/liboctave/array/CRowVector.cc b/liboctave/array/CRowVector.cc --- a/liboctave/array/CRowVector.cc +++ b/liboctave/array/CRowVector.cc @@ -424,7 +424,7 @@ ComplexRowVector linspace (const Complex& x1, const Complex& x2, octave_idx_type n_in) { - NoAlias retval; + ComplexRowVector retval; if (n_in < 1) return retval; @@ -442,19 +442,19 @@ // Set endpoints, rather than calculate, for maximum accuracy. retval.clear (n); - retval(0) = x1; - retval(n-1) = x2; + retval.xelem (0) = x1; + retval.xelem (n-1) = x2; // Construct linspace symmetrically from both ends. Complex delta = (x2 - x1) / (n - 1.0); unsigned_octave_idx_type n2 = n/2; for (unsigned_octave_idx_type i = 1; i < n2; i++) { - retval(i) = x1 + static_cast (i)*delta; - retval(n-1-i) = x2 - static_cast (i)*delta; + retval.xelem (i) = x1 + static_cast (i)*delta; + retval.xelem (n-1-i) = x2 - static_cast (i)*delta; } if (n % 2 == 1) // Middle element if number of elements is odd. - retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0); + retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0); return retval; } diff --git a/liboctave/array/Sparse.cc b/liboctave/array/Sparse.cc --- a/liboctave/array/Sparse.cc +++ b/liboctave/array/Sparse.cc @@ -1507,9 +1507,9 @@ // Lookup. // FIXME: Could specialize for sorted idx? - NoAlias< Array> lidx (dim_vector (new_nr, new_nc)); + Array lidx (dim_vector (new_nr, new_nc)); for (octave_idx_type i = 0; i < new_nr*new_nc; i++) - lidx(i) = lblookup (ridx (), nz, idxa(i)); + lidx.xelem (i) = lblookup (ridx (), nz, idxa(i)); // Count matches. retval = Sparse (idxa.rows (), idxa.cols ()); @@ -1518,11 +1518,11 @@ octave_idx_type nzj = 0; for (octave_idx_type i = 0; i < new_nr; i++) { - octave_idx_type l = lidx(i, j); + octave_idx_type l = lidx.xelem (i, j); if (l < nz && ridx (l) == idxa(i, j)) nzj++; else - lidx(i, j) = nz; + lidx.xelem (i, j) = nz; } retval.xcidx (j+1) = retval.xcidx (j) + nzj; } @@ -1534,7 +1534,7 @@ for (octave_idx_type j = 0; j < new_nc; j++) for (octave_idx_type i = 0; i < new_nr; i++) { - octave_idx_type l = lidx(i, j); + octave_idx_type l = lidx.xelem (i, j); if (l < nz) { retval.data (k) = data (l); diff --git a/liboctave/array/dMatrix.cc b/liboctave/array/dMatrix.cc --- a/liboctave/array/dMatrix.cc +++ b/liboctave/array/dMatrix.cc @@ -3002,7 +3002,7 @@ (*current_liboctave_error_handler) ("linspace: vectors must be of equal length"); - NoAlias retval; + Matrix retval; if (n < 1) { @@ -3012,19 +3012,19 @@ retval.clear (m, n); for (octave_idx_type i = 0; i < m; i++) - retval(i, 0) = x1(i); + retval.xelem (i, 0) = x1(i); // The last column is unused so temporarily store delta there - double *delta = &retval(0, n-1); + double *delta = &retval.xelem (0, n-1); for (octave_idx_type i = 0; i < m; i++) delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1); for (octave_idx_type j = 1; j < n-1; j++) for (octave_idx_type i = 0; i < m; i++) - retval(i, j) = x1(i) + j*delta[i]; + retval.xelem (i, j) = x1(i) + j*delta[i]; for (octave_idx_type i = 0; i < m; i++) - retval(i, n-1) = x2(i); + retval.xelem (i, n-1) = x2(i); return retval; } diff --git a/liboctave/array/dRowVector.cc b/liboctave/array/dRowVector.cc --- a/liboctave/array/dRowVector.cc +++ b/liboctave/array/dRowVector.cc @@ -267,7 +267,7 @@ RowVector linspace (double x1, double x2, octave_idx_type n_in) { - NoAlias retval; + RowVector retval; if (n_in < 1) return retval; @@ -285,19 +285,19 @@ // Set endpoints, rather than calculate, for maximum accuracy. retval.clear (n); - retval(0) = x1; - retval(n-1) = x2; + retval.xelem (0) = x1; + retval.xelem (n-1) = x2; // Construct linspace symmetrically from both ends. double delta = (x2 - x1) / (n - 1); unsigned_octave_idx_type n2 = n/2; for (unsigned_octave_idx_type i = 1; i < n2; i++) { - retval(i) = x1 + i*delta; - retval(n-1-i) = x2 - i*delta; + retval.xelem (i) = x1 + i*delta; + retval.xelem (n-1-i) = x2 - i*delta; } if (n % 2 == 1) // Middle element if number of elements is odd. - retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2); + retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2); return retval; } diff --git a/liboctave/array/fCMatrix.cc b/liboctave/array/fCMatrix.cc --- a/liboctave/array/fCMatrix.cc +++ b/liboctave/array/fCMatrix.cc @@ -3641,7 +3641,7 @@ (*current_liboctave_error_handler) ("linspace: vectors must be of equal length"); - NoAlias retval; + FloatComplexMatrix retval; if (n < 1) { @@ -3651,19 +3651,19 @@ retval.clear (m, n); for (octave_idx_type i = 0; i < m; i++) - retval(i, 0) = x1(i); + retval.xelem (i, 0) = x1(i); // The last column is unused so temporarily store delta there - FloatComplex *delta = &retval(0, n-1); + FloatComplex *delta = &retval.xelem (0, n-1); for (octave_idx_type i = 0; i < m; i++) delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0f); for (octave_idx_type j = 1; j < n-1; j++) for (octave_idx_type i = 0; i < m; i++) - retval(i, j) = x1(i) + static_cast (j)*delta[i]; + retval.xelem (i, j) = x1(i) + static_cast (j)*delta[i]; for (octave_idx_type i = 0; i < m; i++) - retval(i, n-1) = x2(i); + retval.xelem (i, n-1) = x2(i); return retval; } diff --git a/liboctave/array/fCRowVector.cc b/liboctave/array/fCRowVector.cc --- a/liboctave/array/fCRowVector.cc +++ b/liboctave/array/fCRowVector.cc @@ -426,7 +426,7 @@ FloatComplexRowVector linspace (const FloatComplex& x1, const FloatComplex& x2, octave_idx_type n_in) { - NoAlias retval; + FloatComplexRowVector retval; if (n_in < 1) return retval; @@ -444,19 +444,19 @@ // Set endpoints, rather than calculate, for maximum accuracy. retval.clear (n); - retval(0) = x1; - retval(n-1) = x2; + retval.xelem (0) = x1; + retval.xelem (n-1) = x2; // Construct linspace symmetrically from both ends. FloatComplex delta = (x2 - x1) / (n - 1.0f); unsigned_octave_idx_type n2 = n/2; for (unsigned_octave_idx_type i = 1; i < n2; i++) { - retval(i) = x1 + static_cast (i)*delta; - retval(n-1-i) = x2 - static_cast (i)*delta; + retval.xelem (i) = x1 + static_cast (i)*delta; + retval.xelem (n-1-i) = x2 - static_cast (i)*delta; } if (n % 2 == 1) // Middle element if number of elements is odd. - retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0f); + retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0f); return retval; } diff --git a/liboctave/array/fMatrix.cc b/liboctave/array/fMatrix.cc --- a/liboctave/array/fMatrix.cc +++ b/liboctave/array/fMatrix.cc @@ -3008,7 +3008,7 @@ (*current_liboctave_error_handler) ("linspace: vectors must be of equal length"); - NoAlias retval; + FloatMatrix retval; if (n < 1) { @@ -3018,19 +3018,19 @@ retval.clear (m, n); for (octave_idx_type i = 0; i < m; i++) - retval(i, 0) = x1(i); + retval.xelem (i, 0) = x1(i); // The last column is unused so temporarily store delta there - float *delta = &retval(0, n-1); + float *delta = &retval.xelem (0, n-1); for (octave_idx_type i = 0; i < m; i++) delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1); for (octave_idx_type j = 1; j < n-1; j++) for (octave_idx_type i = 0; i < m; i++) - retval(i, j) = x1(i) + j*delta[i]; + retval.xelem (i, j) = x1(i) + j*delta[i]; for (octave_idx_type i = 0; i < m; i++) - retval(i, n-1) = x2(i); + retval.xelem (i, n-1) = x2(i); return retval; } diff --git a/liboctave/array/fRowVector.cc b/liboctave/array/fRowVector.cc --- a/liboctave/array/fRowVector.cc +++ b/liboctave/array/fRowVector.cc @@ -267,7 +267,7 @@ FloatRowVector linspace (float x1, float x2, octave_idx_type n_in) { - NoAlias retval; + FloatRowVector retval; if (n_in < 1) return retval; @@ -285,19 +285,19 @@ // Set endpoints, rather than calculate, for maximum accuracy. retval.clear (n); - retval(0) = x1; - retval(n-1) = x2; + retval.xelem (0) = x1; + retval.xelem (n-1) = x2; // Construct linspace symmetrically from both ends. float delta = (x2 - x1) / (n - 1); unsigned_octave_idx_type n2 = n/2; for (unsigned_octave_idx_type i = 1; i < n2; i++) { - retval(i) = x1 + i*delta; - retval(n-1-i) = x2 - i*delta; + retval.xelem (i) = x1 + i*delta; + retval.xelem (n-1-i) = x2 - i*delta; } if (n % 2 == 1) // Middle element if number of elements is odd. - retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2); + retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2); return retval; }