# HG changeset patch # User Carnë Draug # Date 1415356878 0 # Node ID 3746b92739f748a4a9eb63376206c7c76f395d97 # Parent d0c73e23a5056f8b1e0eba8fb16c5e375738acf0 Replace some duplicated code and count on methods implemented on base classes. * liboctave/array/CMatrix.cc, liboctave/array/CMatrix.h, liboctave/array/dMatrix.cc, liboctave/array/dMatrix.h, liboctave/array/fCMatrix.cc, liboctave/array/fCMatrix.h, liboctave/array/fMatrix.cc, liboctave/array/fMatrix.h: remove a lot of duplicate code from Matrix type classes now that these classes inherit from their NDArrays counterpart. These mostly include operator ! and =, any_element_is_nan, any_element_is_inf_or_nan, all_elements_are_real, all_integers, too_large_for_float, all, any, cumprod, cumsum, prod, sum, sumsq, and abs. In some cases these need to still appear on the Matrix definition to avoid slicing. diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/CMatrix.cc --- a/liboctave/array/CMatrix.cc Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/CMatrix.cc Fri Nov 07 10:41:18 2014 +0000 @@ -3102,148 +3102,54 @@ return *this; } -// unary operations - -boolMatrix -ComplexMatrix::operator ! (void) const -{ - if (any_element_is_nan ()) - gripe_nan_to_logical_conversion (); - - return do_mx_unary_op (*this, mx_inline_not); -} - // other operations -bool -ComplexMatrix::any_element_is_nan (void) const -{ - return do_mx_check (*this, mx_inline_any_nan); -} - -bool -ComplexMatrix::any_element_is_inf_or_nan (void) const -{ - return ! do_mx_check (*this, mx_inline_all_finite); -} - -// Return true if no elements have imaginary components. - -bool -ComplexMatrix::all_elements_are_real (void) const -{ - return do_mx_check (*this, mx_inline_all_real); -} - -// Return nonzero if any element of CM has a non-integer real or -// imaginary part. Also extract the largest and smallest (real or -// imaginary) values and return them in MAX_VAL and MIN_VAL. - -bool -ComplexMatrix::all_integers (double& max_val, double& min_val) const -{ - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - - if (nr > 0 && nc > 0) - { - Complex val = elem (0, 0); - - double r_val = std::real (val); - double i_val = std::imag (val); - - max_val = r_val; - min_val = r_val; - - if (i_val > max_val) - max_val = i_val; - - if (i_val < max_val) - min_val = i_val; - } - else - return false; - - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - Complex val = elem (i, j); - - double r_val = std::real (val); - double i_val = std::imag (val); - - if (r_val > max_val) - max_val = r_val; - - if (i_val > max_val) - max_val = i_val; - - if (r_val < min_val) - min_val = r_val; - - if (i_val < min_val) - min_val = i_val; - - if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val) - return false; - } - - return true; -} - -bool -ComplexMatrix::too_large_for_float (void) const -{ - return test_any (xtoo_large_for_float); -} - -// FIXME: Do these really belong here? Maybe they should be in a base class? - boolMatrix ComplexMatrix::all (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_all); + return ComplexNDArray::all (dim); } boolMatrix ComplexMatrix::any (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_any); + return ComplexNDArray::any (dim); } ComplexMatrix ComplexMatrix::cumprod (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumprod); + return ComplexNDArray::cumprod (dim); } ComplexMatrix ComplexMatrix::cumsum (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumsum); + return ComplexNDArray::cumsum (dim); } ComplexMatrix ComplexMatrix::prod (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_prod); + return ComplexNDArray::prod (dim); } ComplexMatrix ComplexMatrix::sum (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sum); + return ComplexNDArray::sum (dim); } ComplexMatrix ComplexMatrix::sumsq (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sumsq); + return ComplexNDArray::sumsq (dim); } -Matrix ComplexMatrix::abs (void) const +Matrix +ComplexMatrix::abs (void) const { - return do_mx_unary_map (*this); + return ComplexNDArray::abs (); } ComplexMatrix diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/CMatrix.h --- a/liboctave/array/CMatrix.h Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/CMatrix.h Fri Nov 07 10:41:18 2014 +0000 @@ -85,12 +85,6 @@ explicit ComplexMatrix (const charMatrix& a); - ComplexMatrix& operator = (const ComplexMatrix& a) - { - ComplexNDArray::operator = (a); - return *this; - } - bool operator == (const ComplexMatrix& a) const; bool operator != (const ComplexMatrix& a) const; @@ -357,18 +351,8 @@ ComplexMatrix& operator += (const Matrix& a); ComplexMatrix& operator -= (const Matrix& a); - // unary operations - - boolMatrix operator ! (void) const; - // other operations - bool any_element_is_nan (void) const; - bool any_element_is_inf_or_nan (void) const; - bool all_elements_are_real (void) const; - bool all_integers (double& max_val, double& min_val) const; - bool too_large_for_float (void) const; - boolMatrix all (int dim = -1) const; boolMatrix any (int dim = -1) const; diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/dMatrix.cc --- a/liboctave/array/dMatrix.cc Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/dMatrix.cc Fri Nov 07 10:41:18 2014 +0000 @@ -2632,15 +2632,6 @@ // unary operations -boolMatrix -Matrix::operator ! (void) const -{ - if (any_element_is_nan ()) - gripe_nan_to_logical_conversion (); - - return do_mx_unary_op (*this, mx_inline_not); -} - // column vector by row vector -> matrix operations Matrix @@ -2670,131 +2661,54 @@ // other operations. -bool -Matrix::any_element_is_negative (bool neg_zero) const -{ - return (neg_zero ? test_all (xnegative_sign) - : do_mx_check (*this, mx_inline_any_negative)); -} - -bool -Matrix::any_element_is_positive (bool neg_zero) const -{ - return (neg_zero ? test_all (xpositive_sign) - : do_mx_check (*this, mx_inline_any_positive)); -} - -bool -Matrix::any_element_is_nan (void) const -{ - return do_mx_check (*this, mx_inline_any_nan); -} - -bool -Matrix::any_element_is_inf_or_nan (void) const -{ - return ! do_mx_check (*this, mx_inline_all_finite); -} - -bool -Matrix::any_element_not_one_or_zero (void) const -{ - return ! test_all (xis_one_or_zero); -} - -bool -Matrix::all_elements_are_int_or_inf_or_nan (void) const -{ - return test_all (xis_int_or_inf_or_nan); -} - -// Return nonzero if any element of M is not an integer. Also extract -// the largest and smallest values and return them in MAX_VAL and MIN_VAL. - -bool -Matrix::all_integers (double& max_val, double& min_val) const -{ - octave_idx_type nel = nelem (); - - if (nel > 0) - { - max_val = elem (0); - min_val = elem (0); - } - else - return false; - - for (octave_idx_type i = 0; i < nel; i++) - { - double val = elem (i); - - if (val > max_val) - max_val = val; - - if (val < min_val) - min_val = val; - - if (! xisinteger (val)) - return false; - } - - return true; -} - -bool -Matrix::too_large_for_float (void) const -{ - return test_any (xtoo_large_for_float); -} - // FIXME: Do these really belong here? Maybe they should be in a base class? boolMatrix Matrix::all (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_all); + return NDArray::all (dim); } boolMatrix Matrix::any (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_any); + return NDArray::any (dim); } Matrix Matrix::cumprod (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumprod); + return NDArray::cumprod (dim); } Matrix Matrix::cumsum (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumsum); + return NDArray::cumsum (dim); } Matrix Matrix::prod (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_prod); + return NDArray::prod (dim); } Matrix Matrix::sum (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sum); + return NDArray::sum (dim); } Matrix Matrix::sumsq (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sumsq); + return NDArray::sumsq (dim); } Matrix Matrix::abs (void) const { - return do_mx_unary_map (*this); + return NDArray::abs (); } Matrix diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/dMatrix.h --- a/liboctave/array/dMatrix.h Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/dMatrix.h Fri Nov 07 10:41:18 2014 +0000 @@ -76,12 +76,6 @@ explicit Matrix (const charMatrix& a); - Matrix& operator = (const Matrix& a) - { - MArray::operator = (a); - return *this; - } - bool operator == (const Matrix& a) const; bool operator != (const Matrix& a) const; @@ -304,19 +298,8 @@ // unary operations - boolMatrix operator ! (void) const; - // other operations - bool any_element_is_negative (bool = false) const; - bool any_element_is_positive (bool = false) const; - bool any_element_is_nan (void) const; - bool any_element_is_inf_or_nan (void) const; - bool any_element_not_one_or_zero (void) const; - bool all_elements_are_int_or_inf_or_nan (void) const; - bool all_integers (double& max_val, double& min_val) const; - bool too_large_for_float (void) const; - boolMatrix all (int dim = -1) const; boolMatrix any (int dim = -1) const; diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/fCMatrix.cc --- a/liboctave/array/fCMatrix.cc Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/fCMatrix.cc Fri Nov 07 10:41:18 2014 +0000 @@ -3123,154 +3123,56 @@ // unary operations boolMatrix -FloatComplexMatrix::operator ! (void) const -{ - if (any_element_is_nan ()) - gripe_nan_to_logical_conversion (); - - return do_mx_unary_op (*this, mx_inline_not); -} - -// other operations - -bool -FloatComplexMatrix::any_element_is_nan (void) const -{ - return do_mx_check (*this, mx_inline_any_nan); -} - -bool -FloatComplexMatrix::any_element_is_inf_or_nan (void) const -{ - return ! do_mx_check (*this, mx_inline_all_finite); -} - -// Return true if no elements have imaginary components. - -bool -FloatComplexMatrix::all_elements_are_real (void) const -{ - return do_mx_check (*this, mx_inline_all_real); -} - -// Return nonzero if any element of CM has a non-integer real or -// imaginary part. Also extract the largest and smallest (real or -// imaginary) values and return them in MAX_VAL and MIN_VAL. - -bool -FloatComplexMatrix::all_integers (float& max_val, float& min_val) const -{ - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - - if (nr > 0 && nc > 0) - { - FloatComplex val = elem (0, 0); - - float r_val = std::real (val); - float i_val = std::imag (val); - - max_val = r_val; - min_val = r_val; - - if (i_val > max_val) - max_val = i_val; - - if (i_val < max_val) - min_val = i_val; - } - else - return false; - - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - FloatComplex val = elem (i, j); - - float r_val = std::real (val); - float i_val = std::imag (val); - - if (r_val > max_val) - max_val = r_val; - - if (i_val > max_val) - max_val = i_val; - - if (r_val < min_val) - min_val = r_val; - - if (i_val < min_val) - min_val = i_val; - - if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val) - return false; - } - - return true; -} - -bool -FloatComplexMatrix::too_large_for_float (void) const -{ - return false; -} - -// FIXME: Do these really belong here? Maybe they should be -// in a base class? - -boolMatrix FloatComplexMatrix::all (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_all); + return FloatComplexNDArray::all (dim); } boolMatrix FloatComplexMatrix::any (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_any); + return FloatComplexNDArray::any (dim); } FloatComplexMatrix FloatComplexMatrix::cumprod (int dim) const { - return do_mx_cum_op (*this, dim, - mx_inline_cumprod); + return FloatComplexNDArray::cumprod (dim); } FloatComplexMatrix FloatComplexMatrix::cumsum (int dim) const { - return do_mx_cum_op (*this, dim, - mx_inline_cumsum); + return FloatComplexNDArray::cumsum (dim); } FloatComplexMatrix FloatComplexMatrix::prod (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_prod); + return FloatComplexNDArray::prod (dim); } FloatComplexMatrix FloatComplexMatrix::sum (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sum); + return FloatComplexNDArray::sum (dim); } FloatComplexMatrix FloatComplexMatrix::sumsq (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sumsq); + return FloatComplexNDArray::sumsq (dim); } FloatMatrix FloatComplexMatrix::abs (void) const { - return do_mx_unary_map (*this); + return FloatComplexNDArray::abs (); } FloatComplexMatrix FloatComplexMatrix::diag (octave_idx_type k) const { - return MArray::diag (k); + return FloatComplexNDArray::diag (k); } FloatComplexDiagMatrix diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/fCMatrix.h --- a/liboctave/array/fCMatrix.h Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/fCMatrix.h Fri Nov 07 10:41:18 2014 +0000 @@ -90,12 +90,6 @@ FloatComplexMatrix (const FloatMatrix& re, const FloatMatrix& im); - FloatComplexMatrix& operator = (const FloatComplexMatrix& a) - { - MArray::operator = (a); - return *this; - } - bool operator == (const FloatComplexMatrix& a) const; bool operator != (const FloatComplexMatrix& a) const; @@ -381,12 +375,6 @@ // other operations - bool any_element_is_nan (void) const; - bool any_element_is_inf_or_nan (void) const; - bool all_elements_are_real (void) const; - bool all_integers (float& max_val, float& min_val) const; - bool too_large_for_float (void) const; - boolMatrix all (int dim = -1) const; boolMatrix any (int dim = -1) const; diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/fMatrix.cc --- a/liboctave/array/fMatrix.cc Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/fMatrix.cc Fri Nov 07 10:41:18 2014 +0000 @@ -324,7 +324,7 @@ FloatMatrix::insert (const FloatMatrix& a, octave_idx_type r, octave_idx_type c) { - Array::insert (a, r, c); + FloatNDArray::insert (a, r, c); return *this; } @@ -2654,17 +2654,6 @@ return *this; } -// unary operations - -boolMatrix -FloatMatrix::operator ! (void) const -{ - if (any_element_is_nan ()) - gripe_nan_to_logical_conversion (); - - return do_mx_unary_op (*this, mx_inline_not); -} - // column vector by row vector -> matrix operations FloatMatrix @@ -2692,139 +2681,48 @@ return retval; } -// other operations. - -bool -FloatMatrix::any_element_is_negative (bool neg_zero) const -{ - return (neg_zero ? test_all (xnegative_sign) - : do_mx_check (*this, mx_inline_any_negative)); -} - -bool -FloatMatrix::any_element_is_positive (bool neg_zero) const -{ - return (neg_zero ? test_all (xpositive_sign) - : do_mx_check (*this, mx_inline_any_positive)); -} - -bool -FloatMatrix::any_element_is_nan (void) const -{ - return do_mx_check (*this, mx_inline_any_nan); -} - -bool -FloatMatrix::any_element_is_inf_or_nan (void) const -{ - return ! do_mx_check (*this, mx_inline_all_finite); -} - -bool -FloatMatrix::any_element_not_one_or_zero (void) const -{ - return ! test_all (xis_one_or_zero); -} - -bool -FloatMatrix::all_elements_are_int_or_inf_or_nan (void) const -{ - return test_all (xis_int_or_inf_or_nan); -} - -// Return nonzero if any element of M is not an integer. Also extract -// the largest and smallest values and return them in MAX_VAL and MIN_VAL. - -bool -FloatMatrix::all_integers (float& max_val, float& min_val) const -{ - octave_idx_type nel = nelem (); - - if (nel > 0) - { - max_val = elem (0); - min_val = elem (0); - } - else - return false; - - for (octave_idx_type i = 0; i < nel; i++) - { - float val = elem (i); - - if (val > max_val) - max_val = val; - - if (val < min_val) - min_val = val; - - if (! xisinteger (val)) - return false; - } - - return true; -} - -bool -FloatMatrix::too_large_for_float (void) const -{ - return false; -} - // FIXME: Do these really belong here? Maybe they should be in a base class? -boolMatrix -FloatMatrix::all (int dim) const -{ - return do_mx_red_op (*this, dim, mx_inline_all); -} - -boolMatrix -FloatMatrix::any (int dim) const -{ - return do_mx_red_op (*this, dim, mx_inline_any); -} - FloatMatrix FloatMatrix::cumprod (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumprod); + return FloatNDArray::cumprod (dim); } FloatMatrix FloatMatrix::cumsum (int dim) const { - return do_mx_cum_op (*this, dim, mx_inline_cumsum); + return FloatNDArray::cumsum (dim); } FloatMatrix FloatMatrix::prod (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_prod); + return FloatNDArray::prod (dim); } FloatMatrix FloatMatrix::sum (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sum); + return FloatNDArray::sum (dim); } FloatMatrix FloatMatrix::sumsq (int dim) const { - return do_mx_red_op (*this, dim, mx_inline_sumsq); + return FloatNDArray::sumsq (dim); } FloatMatrix FloatMatrix::abs (void) const { - return do_mx_unary_map (*this); + return FloatNDArray::abs (); } FloatMatrix FloatMatrix::diag (octave_idx_type k) const { - return MArray::diag (k); + return FloatNDArray::diag (k); } FloatDiagMatrix diff -r d0c73e23a505 -r 3746b92739f7 liboctave/array/fMatrix.h --- a/liboctave/array/fMatrix.h Fri Nov 07 08:15:55 2014 +0000 +++ b/liboctave/array/fMatrix.h Fri Nov 07 10:41:18 2014 +0000 @@ -76,12 +76,6 @@ explicit FloatMatrix (const charMatrix& a); - FloatMatrix& operator = (const FloatMatrix& a) - { - MArray::operator = (a); - return *this; - } - bool operator == (const FloatMatrix& a) const; bool operator != (const FloatMatrix& a) const; @@ -323,24 +317,6 @@ FloatMatrix& operator += (const FloatDiagMatrix& a); FloatMatrix& operator -= (const FloatDiagMatrix& a); - // unary operations - - boolMatrix operator ! (void) const; - - // other operations - - bool any_element_is_negative (bool = false) const; - bool any_element_is_positive (bool = false) const; - bool any_element_is_nan (void) const; - bool any_element_is_inf_or_nan (void) const; - bool any_element_not_one_or_zero (void) const; - bool all_elements_are_int_or_inf_or_nan (void) const; - bool all_integers (float& max_val, float& min_val) const; - bool too_large_for_float (void) const; - - boolMatrix all (int dim = -1) const; - boolMatrix any (int dim = -1) const; - FloatMatrix cumprod (int dim = -1) const; FloatMatrix cumsum (int dim = -1) const; FloatMatrix prod (int dim = -1) const;