# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1335994180 14400 # Node ID 6250e1232c9cc017fe3d0d87172a3b3a9c873aa0 # Parent 89504d0a5c5b069c0add097cf7bb0b270e185734 Implement proper op() indexing for diagonal matrices (bug #36368) * DiagArray2.h (DiagArray2::check_idx): New function. (DiagArray2::checkelem): Deleted. (DiagArray2::operator()): New non-const version, returns references. Conditionally call check_idx. * DiagArray2.cc (DiagArray2::check_idx): Contents copied over from checkelem. (DiagArray2::checkelem): Deleted. * ov-base-diag.cc (octave_base_diag::do_index_op): Replace call to now-inaccessible checkelem() with elem(). * ov-cx-diag.cc: Add a test for this bug. diff -r 89504d0a5c5b -r 6250e1232c9c liboctave/DiagArray2.cc --- a/liboctave/DiagArray2.cc Mon Apr 30 22:19:14 2012 -0400 +++ b/liboctave/DiagArray2.cc Wed May 02 17:29:40 2012 -0400 @@ -82,16 +82,14 @@ // A two-dimensional array with diagonal elements only. -template -T -DiagArray2::checkelem (octave_idx_type r, octave_idx_type c) const +template +void +DiagArray2::check_idx (octave_idx_type r, octave_idx_type c) const { if (r < 0 || r >= dim1 ()) gripe_index_out_of_range (2, 1, r+1, dim1 ()); if (c < 0 || c >= dim2 ()) gripe_index_out_of_range (2, 2, c+1, dim2 ()); - - return elem (r, c); } template diff -r 89504d0a5c5b -r 6250e1232c9c liboctave/DiagArray2.h --- a/liboctave/DiagArray2.h Mon Apr 30 22:19:14 2012 -0400 +++ b/liboctave/DiagArray2.h Wed May 02 17:29:40 2012 -0400 @@ -119,15 +119,22 @@ T& dgelem (octave_idx_type i) { return Array::elem (i); } - T checkelem (octave_idx_type r, octave_idx_type c) const; + void check_idx (octave_idx_type r, octave_idx_type c) const; T operator () (octave_idx_type r, octave_idx_type c) const { #if defined (BOUNDS_CHECKING) - return checkelem (r, c); -#else + check_idx (r, c); +#endif return elem (r, c); + } + + T& operator () (octave_idx_type r, octave_idx_type c) + { +#if defined (BOUNDS_CHECKING) + check_idx (r, c); #endif + return elem (r, c); } // No checking. diff -r 89504d0a5c5b -r 6250e1232c9c src/ov-base-diag.cc --- a/src/ov-base-diag.cc Mon Apr 30 22:19:14 2012 -0400 +++ b/src/ov-base-diag.cc Wed May 02 17:29:40 2012 -0400 @@ -82,7 +82,7 @@ if (idx0.is_scalar () && idx1.is_scalar ()) { - retval = matrix.checkelem (idx0(0), idx1(0)); + retval = matrix.elem (idx0(0), idx1(0)); } else { diff -r 89504d0a5c5b -r 6250e1232c9c src/ov-cx-diag.cc --- a/src/ov-cx-diag.cc Mon Apr 30 22:19:14 2012 -0400 +++ b/src/ov-cx-diag.cc Wed May 02 17:29:40 2012 -0400 @@ -229,3 +229,10 @@ x = val.complex_value (); return retval; } + +/* + +%% bug #36368 +%!assert (diag ([1+i, 1-i])^2 , diag ([2i, -2i]), 4*eps); + +*/