Mercurial > hg > octave-nkf
diff liboctave/Array.h @ 10366:e5ae13b8b2c2
improve Array indexing error messages
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sat, 27 Feb 2010 08:37:34 +0100 |
parents | 96ed7c629bbd |
children | 4d1fc073fbb7 |
line wrap: on
line diff
--- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -331,13 +331,10 @@ void chop_trailing_singletons (void) GCC_ATTR_DEPRECATED { dimensions.chop_trailing_singletons (); } + octave_idx_type compute_index (octave_idx_type i, octave_idx_type j) const; + octave_idx_type compute_index (octave_idx_type i, octave_idx_type j, octave_idx_type k) const; 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 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]; } @@ -361,42 +358,10 @@ // unnecessarily force a copy, but that is not so easy, and I see no // clean way to do it. - T& checkelem (octave_idx_type n) - { - if (n < 0 || n >= slice_len) - return range_error ("T& Array<T>::checkelem", n); - else - { - make_unique (); - return xelem (n); - } - } - - T& checkelem (octave_idx_type i, octave_idx_type j) - { - if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ()) - return range_error ("T& Array<T>::checkelem", i, j); - else - return elem (dim1()*j+i); - } - - T& checkelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) - { - if (i < 0 || j < 0 || k < 0 || i >= dim1 () || j >= dim2 () || k >= dim3 ()) - return range_error ("T& Array<T>::checkelem", i, j, k); - else - return elem (i, dim2()*k+j); - } - - T& checkelem (const Array<octave_idx_type>& ra_idx) - { - octave_idx_type i = compute_index (ra_idx); - - if (i < 0) - return range_error ("T& Array<T>::checkelem", ra_idx); - else - return elem (i); - } + T& checkelem (octave_idx_type n); + T& checkelem (octave_idx_type i, octave_idx_type j); + T& checkelem (octave_idx_type i, octave_idx_type j, octave_idx_type k); + T& checkelem (const Array<octave_idx_type>& ra_idx); T& elem (octave_idx_type n) { @@ -423,48 +388,19 @@ T& operator () (const Array<octave_idx_type>& ra_idx) { return elem (ra_idx); } #endif - crefT checkelem (octave_idx_type n) const - { - if (n < 0 || n >= slice_len) - return range_error ("T Array<T>::checkelem", n); - else - return xelem (n); - } - - 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); - else - return elem (dim1()*j+i); - } - - 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); - else - return Array<T>::elem (i, Array<T>::dim1()*k+j); - } - - crefT checkelem (const Array<octave_idx_type>& ra_idx) const - { - octave_idx_type i = compute_index (ra_idx); - - if (i < 0) - return range_error ("T Array<T>::checkelem", ra_idx); - else - return Array<T>::elem (i); - } + crefT checkelem (octave_idx_type n) const; + crefT checkelem (octave_idx_type i, octave_idx_type j) const; + crefT checkelem (octave_idx_type i, octave_idx_type j, octave_idx_type k) const; + crefT checkelem (const Array<octave_idx_type>& ra_idx) const; crefT elem (octave_idx_type n) const { return xelem (n); } - crefT 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 xelem (i, j); } - crefT 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 xelem (i, j, k); } crefT elem (const Array<octave_idx_type>& ra_idx) const - { return Array<T>::elem (compute_index (ra_idx)); } + { return Array<T>::xelem (compute_index (ra_idx)); } #if defined (BOUNDS_CHECKING) crefT operator () (octave_idx_type n) const { return checkelem (n); }