diff liboctave/array/Array-util.h @ 19009:8d47ce2053f2 draft

Added safety checks to Array::xelem There's no reason to have a method which never checks invariants, ever. Added debugging checks to Array::xelem to help catch and debug out-of-bounds errors and reference overlap * configure.ac: Added configuration option for uniqueness-checking with xelem * jit-typeinfo.cc (octave_jit_paren_scalar): Call const Array::xelem rather than Array::xelem * Array-util.h, Array-util.cc (check_out_of_range): Extract common pattern to method (check_index): Methods to check index is in-bounds (compute_index): Added bool parameter check. does not check bounds when check is false and BOUNDS_CHECKING is off * Array.h, Array.cc (xelem): Use methods from Array-util.h to compute indices (is_unique): Check if this is the only reference to data * CmplxQR.cc, dbleQR.cc, fCmplxQR.cc, floatQR.cc (form): Move second assignment to after the call to xelem * lo-array-gripes.h, lo-array-gripes.cc (gripe_modifying_nonunique): Added error message for when non-const xelem is called on non-unique array
author David Spies <dnspies@gmail.com>
date Mon, 14 Jul 2014 13:07:59 -0600
parents 49a5a4be04a1
children
line wrap: on
line diff
--- a/liboctave/array/Array-util.h	Sat Jun 21 13:13:05 2014 -0600
+++ b/liboctave/array/Array-util.h	Mon Jul 14 13:07:59 2014 -0600
@@ -23,11 +23,13 @@
 #if !defined (octave_Array_util_h)
 #define octave_Array_util_h 1
 
-#include "Array.h"
 #include "dim-vector.h"
 #include "idx-vector.h"
 #include "lo-array-gripes.h"
 
+template <typename T>
+class Array;
+
 extern OCTAVE_API bool index_in_bounds (const Array<octave_idx_type>& ra_idx,
                                         const dim_vector& dimensions);
 
@@ -47,20 +49,59 @@
 
 extern OCTAVE_API bool any_ones (const Array<octave_idx_type>& arr);
 
+extern OCTAVE_API void
+check_index_bounds (int nd, int dim, octave_idx_type i, octave_idx_type size);
+
+extern OCTAVE_API void
+check_index (octave_idx_type n, const dim_vector& dims);
+
+extern OCTAVE_API void
+check_index (octave_idx_type i, octave_idx_type j, const dim_vector& dims);
+
+extern OCTAVE_API void
+check_index (octave_idx_type i, octave_idx_type j, octave_idx_type k,
+               const dim_vector& dims);
+
+extern OCTAVE_API void
+check_index (const Array<octave_idx_type>& ra_idx, const dim_vector& dims);
+
+#if defined(BOUNDS_CHECKING)
+#define BOUNDS_CHECKING_DEFINED true
+#else
+#define BOUNDS_CHECKING_DEFINED false
+#endif
+
 // These four compute a linear index for given dimensions, throwing
-// exceptions on invalid indices.
-extern OCTAVE_API octave_idx_type
-compute_index (octave_idx_type n, const dim_vector& dims);
+// exceptions on invalid indices if check is true or BOUNDS_CHECKING is defined.
+inline octave_idx_type
+compute_index (octave_idx_type n, const dim_vector& dims, bool check = true)
+{
+  if (BOUNDS_CHECKING_DEFINED || check)
+    check_index (n, dims);
+  return n;
+}
+
+inline octave_idx_type
+compute_index (octave_idx_type i, octave_idx_type j, const dim_vector& dims,
+               bool check = true)
+{
+  if (BOUNDS_CHECKING_DEFINED || check)
+    check_index (i, j, dims);
+  return j * dims(0) + i;
+}
+
+inline octave_idx_type
+compute_index (octave_idx_type i, octave_idx_type j, octave_idx_type k,
+               const dim_vector& dims, bool check = true)
+{
+  if (BOUNDS_CHECKING_DEFINED || check)
+    check_index (i, j, k, dims);
+  return (k * dims (1) + j) * dims(0) + i;
+}
 
 extern OCTAVE_API octave_idx_type
-compute_index (octave_idx_type i, octave_idx_type j, const dim_vector& dims);
-
-extern OCTAVE_API octave_idx_type
-compute_index (octave_idx_type i, octave_idx_type j, octave_idx_type k,
-               const dim_vector& dims);
-
-extern OCTAVE_API octave_idx_type
-compute_index (const Array<octave_idx_type>& ra_idx, const dim_vector& dims);
+compute_index (const Array<octave_idx_type>& ra_idx, const dim_vector& dims,
+               bool check = true);
 
 extern OCTAVE_API Array<octave_idx_type>
 conv_to_int_array (const Array<idx_vector>& a);