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.