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	Fri Feb 26 12:22:00 2010 +0100
+++ b/liboctave/Array.h	Sat Feb 27 08:37:34 2010 +0100
@@ -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); }