Mercurial > hg > octave-lyh
diff liboctave/Array.h @ 10075:84b0725f4b09
return class types by reference in const Array element access functions
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 08 Jan 2010 11:25:08 +0100 |
parents | 7c8392a034e6 |
children | eb8ac0eed9f1 |
line wrap: on
line diff
--- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -111,6 +111,8 @@ typedef T element_type; + typedef typename ref_param<T>::type crefT; + typedef bool (*compare_fcn_type) (typename ref_param<T>::type, typename ref_param<T>::type); @@ -303,33 +305,28 @@ octave_idx_type compute_index (const Array<octave_idx_type>& ra_idx) const; - T range_error (const char *fcn, octave_idx_type n) const; - T& range_error (const char *fcn, octave_idx_type n); - - T range_error (const char *fcn, octave_idx_type i, octave_idx_type j) const; - T& range_error (const char *fcn, octave_idx_type i, octave_idx_type j); - - T range_error (const char *fcn, octave_idx_type i, octave_idx_type j, octave_idx_type k) const; - T& range_error (const char *fcn, octave_idx_type i, octave_idx_type j, octave_idx_type k); - - T range_error (const char *fcn, const Array<octave_idx_type>& ra_idx) const; - T& range_error (const char *fcn, const Array<octave_idx_type>& ra_idx); + T& range_error (const char *fcn, octave_idx_type n) const; + T& range_error (const char *fcn, octave_idx_type i, octave_idx_type j) const; + T& range_error (const char *fcn, octave_idx_type i, octave_idx_type j, octave_idx_type k) const; + T& range_error (const char *fcn, const Array<octave_idx_type>& ra_idx) const; // No checking, even for multiple references, ever. T& xelem (octave_idx_type n) { return slice_data [n]; } - T xelem (octave_idx_type n) const { return slice_data [n]; } + crefT xelem (octave_idx_type n) const { return slice_data [n]; } T& xelem (octave_idx_type i, octave_idx_type j) { return xelem (dim1()*j+i); } - T xelem (octave_idx_type i, octave_idx_type j) const { return xelem (dim1()*j+i); } + crefT xelem (octave_idx_type i, octave_idx_type j) const { return xelem (dim1()*j+i); } - T& xelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) { return xelem (i, dim2()*k+j); } - T xelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return xelem (i, dim2()*k+j); } + T& xelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) + { return xelem (i, dim2()*k+j); } + crefT xelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const + { return xelem (i, dim2()*k+j); } T& xelem (const Array<octave_idx_type>& ra_idx) { return xelem (compute_index (ra_idx)); } - T xelem (const Array<octave_idx_type>& ra_idx) const + crefT xelem (const Array<octave_idx_type>& ra_idx) const { return xelem (compute_index (ra_idx)); } // FIXME -- would be nice to fix this so that we don't @@ -398,7 +395,7 @@ T& operator () (const Array<octave_idx_type>& ra_idx) { return elem (ra_idx); } #endif - T checkelem (octave_idx_type n) const + crefT checkelem (octave_idx_type n) const { if (n < 0 || n >= slice_len) return range_error ("T Array<T>::checkelem", n); @@ -406,7 +403,7 @@ return xelem (n); } - T checkelem (octave_idx_type i, octave_idx_type j) const + crefT checkelem (octave_idx_type i, octave_idx_type j) const { if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ()) return range_error ("T Array<T>::checkelem", i, j); @@ -414,7 +411,7 @@ return elem (dim1()*j+i); } - T checkelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const + crefT checkelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { if (i < 0 || j < 0 || k < 0 || i >= dim1 () || j >= dim2 () || k >= dim3 ()) return range_error ("T Array<T>::checkelem", i, j, k); @@ -422,7 +419,7 @@ return Array<T>::elem (i, Array<T>::dim1()*k+j); } - T checkelem (const Array<octave_idx_type>& ra_idx) const + crefT checkelem (const Array<octave_idx_type>& ra_idx) const { octave_idx_type i = compute_index (ra_idx); @@ -432,25 +429,25 @@ return Array<T>::elem (i); } - T elem (octave_idx_type n) const { return xelem (n); } + crefT elem (octave_idx_type n) const { return xelem (n); } - T elem (octave_idx_type i, octave_idx_type j) const { return elem (dim1()*j+i); } + crefT elem (octave_idx_type i, octave_idx_type j) const { return elem (dim1()*j+i); } - T elem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return elem (i, dim2()*k+j); } + crefT elem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return elem (i, dim2()*k+j); } - T elem (const Array<octave_idx_type>& ra_idx) const + crefT elem (const Array<octave_idx_type>& ra_idx) const { return Array<T>::elem (compute_index (ra_idx)); } #if defined (BOUNDS_CHECKING) - T operator () (octave_idx_type n) const { return checkelem (n); } - T operator () (octave_idx_type i, octave_idx_type j) const { return checkelem (i, j); } - T operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return checkelem (i, j, k); } - T operator () (const Array<octave_idx_type>& ra_idx) const { return checkelem (ra_idx); } + crefT operator () (octave_idx_type n) const { return checkelem (n); } + crefT operator () (octave_idx_type i, octave_idx_type j) const { return checkelem (i, j); } + crefT operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return checkelem (i, j, k); } + crefT operator () (const Array<octave_idx_type>& ra_idx) const { return checkelem (ra_idx); } #else - T operator () (octave_idx_type n) const { return elem (n); } - T operator () (octave_idx_type i, octave_idx_type j) const { return elem (i, j); } - T operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return elem (i, j, k); } - T operator () (const Array<octave_idx_type>& ra_idx) const { return elem (ra_idx); } + crefT operator () (octave_idx_type n) const { return elem (n); } + crefT operator () (octave_idx_type i, octave_idx_type j) const { return elem (i, j); } + crefT operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k) const { return elem (i, j, k); } + crefT operator () (const Array<octave_idx_type>& ra_idx) const { return elem (ra_idx); } #endif // Fast extractors. All of these produce shallow copies.