# HG changeset patch # User jwe # Date 830867490 0 # Node ID 356f70c8fcbdcb2b0a75954b55a0c28f251f5809 # Parent 2b67abb63030db7811a207f357751c3c62e1f116 [project @ 1996-04-30 12:31:30 by jwe] diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -169,20 +169,19 @@ } return rep->data; } - template T -Array::range_error (void) const +Array::range_error (const char *fcn, int n) const { - (*current_liboctave_error_handler) ("range error"); + (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); return T (); } template T& -Array::range_error (void) +Array::range_error (const char *fcn, int n) { - (*current_liboctave_error_handler) ("range error"); + (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); static T foo; return foo; } diff --git a/liboctave/Array.h b/liboctave/Array.h --- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -31,8 +31,6 @@ #include #include -#include "lo-error.h" - class idx_vector; // For now, define this here if it is not already defined. Not doing @@ -176,11 +174,7 @@ T& Array::checkelem (int n) { if (n < 0 || n >= rep->length ()) - { - (*current_liboctave_error_handler) ("range error"); - static T foo; - return foo; - } + return range_error ("T& Array::checkelem", n); else { make_unique (); @@ -194,7 +188,7 @@ T& elem (int n) { make_unique (); - return xelem (); + return xelem (n); } #endif @@ -203,7 +197,7 @@ T Array::checkelem (int n) const { if (n < 0 || n >= rep->length ()) - return range_error (); + return range_error ("T Array::checkelem", n); else return xelem (n); } @@ -236,8 +230,8 @@ return *this; } - T range_error (void) const; - T& range_error (void); + T range_error (const char *fcn, int n) const; + T& range_error (const char *fcn, int n); #ifdef HEAVYWEIGHT_INDEXING void set_max_indices (int mi) { max_indices = mi; } diff --git a/liboctave/Array2.cc b/liboctave/Array2.cc --- a/liboctave/Array2.cc +++ b/liboctave/Array2.cc @@ -42,6 +42,25 @@ #include "lo-error.h" +template +T +Array2::range_error (const char *fcn, int i, int j) const +{ + (*current_liboctave_error_handler) + ("%s (%d, %d): range error", fcn, i, j); + return T (); +} + +template +T& +Array2::range_error (const char *fcn, int i, int j) +{ + (*current_liboctave_error_handler) + ("%s (%d, %d): range error", fcn, i, j); + static T foo; + return foo; +} + // Two dimensional array class. template @@ -50,7 +69,8 @@ { if (r < 0 || c < 0) { - (*current_liboctave_error_handler) ("can't resize to negative dimension"); + (*current_liboctave_error_handler) + ("can't resize to negative dimension"); return; } @@ -89,7 +109,8 @@ { if (r < 0 || c < 0) { - (*current_liboctave_error_handler) ("can't resize to negative dimension"); + (*current_liboctave_error_handler) + ("can't resize to negative dimension"); return; } diff --git a/liboctave/Array2.h b/liboctave/Array2.h --- a/liboctave/Array2.h +++ b/liboctave/Array2.h @@ -115,51 +115,60 @@ int cols (void) const { return d2; } int columns (void) const { return d2; } - T& elem (int i, int j) { return Array::elem (d1*j+i); } + // No checking of any kind, ever. + + T& xelem (int i, int j) { return Array::xelem (d1*j+i); } + T xelem (int i, int j) const { return Array::xelem (d1*j+i); } + + // Note that the following element references don't use + // Array2::xelem() because they still need to make use of the + // code in Array that checks the reference count. T& checkelem (int i, int j) { if (i < 0 || j < 0 || i >= d1 || j >= d2) { - (*current_liboctave_error_handler) ("range error"); + (*current_liboctave_error_handler) + ("T& Array2::checkelem (%d, %d): range error", i, j); static T foo; return foo; } else - return elem (i, j); + return Array::elem (d1*j+i); } -#if defined (NO_BOUNDS_CHECKING) - T& operator () (int i, int j) { return elem (i, j); } +#if defined (BOUNDS_CHECKING) + T& elem (int i, int j) { return checkelem (i, j); } #else - T& operator () (int i, int j) { return checkelem (i, j); } + T& elem (int i, int j) { return Array::elem (d1*j+i); } #endif - T elem (int i, int j) const { return Array::elem (d1*j+i); } + T& operator () (int i, int j) { return elem (i, j); } T checkelem (int i, int j) const { if (i < 0 || j < 0 || i >= d1 || j >= d2) { - (*current_liboctave_error_handler) ("range error"); + (*current_liboctave_error_handler) + ("T Array2::checkelem (%d, %d): range error", i, j); T foo; static T *bar = &foo; return foo; } else - return elem (i, j); + return Array::elem (d1*j+i); } -#if defined (NO_BOUNDS_CHECKING) - T operator () (int i, int j) const { return elem (i, j); } +#if defined (BOUNDS_CHECKING) + T elem (int i, int j) const { return checkelem (i, j); } #else - T operator () (int i, int j) const { return checkelem (i, j); } + T elem (int i, int j) const { return Array::elem (d1*j+i); } #endif - // No checking of any kind, ever. + T operator () (int i, int j) const { return elem (i, j); } - T& xelem (int i, int j) { return Array::xelem (d1*j+i); } - T xelem (int i, int j) const { return Array::xelem (d1*j+i); } + T range_error (const char *fcn, int i, int j) const; + T& range_error (const char *fcn, int i, int j); void resize (int n, int m); void resize (int n, int m, const T& val);