Mercurial > octave-nkf
diff liboctave/lo-utils.h @ 15212:4bbd3bbb8912
reduce code duplication in too_large_for_float array functions
* lo-utils.h (any_all_test): New function.
* lo-utils.h, lo-utils.cc (xtoo_large_for_float (const Complex&)):
New function.
* Array.h (Array<T>::test): Call any_all_test.
* Sparse.h (Sparse<T>::test, Sparse<T>::test_any, Sparse<T>::test_all,
Sparse<T>::test_any, Sparse<T>::test_any, Sparse<T>::test_all,
Sparse<T>::test_all): New functions.
* CMatrix.cc (ComplexMatrix::too_large_for_float): Simplify with
test_any and xtoo_large_for_float.
* CNDArray.cc (ComplexNDArray::too_large_for_float): Likewise.
* CSparse.cc (SparseComplexMatrix::too_large_for_float): Likewise.
* dSparse.cc (SparseMatrix::too_large_for_float): Likewise.
* dMatrix.cc (Matrix::too_large_for_float): Use test_any, not test_all.
* dNDArray.cc (NDArray::too_large_for_float): Likewise.
* fCMatrix.cc (FloatComplexMatrix::too_large_for_float):
Unconditionlly return false.
* fCNDArray.cc (FloatComplexNDArray::too_large_for_float): Likewise.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 22 Aug 2012 16:16:31 -0400 |
parents | 72c96de7a403 |
children | a83b7b2f95ee |
line wrap: on
line diff
--- a/liboctave/lo-utils.h Tue Aug 21 17:48:19 2012 -0400 +++ b/liboctave/lo-utils.h Wed Aug 22 16:16:31 2012 -0400 @@ -28,14 +28,46 @@ #include <iostream> #include <string> +#include "quit.h" + #include "lo-cutils.h" #include "oct-cmplx.h" +// Generic any/all test functionality with arbitrary predicate. + +template <class F, class T, bool zero> +bool +any_all_test (F fcn, const T *m, octave_idx_type len) +{ + octave_idx_type i; + + for (i = 0; i < len - 3; i += 4) + { + octave_quit (); + + if (fcn (m[i]) != zero + || fcn (m[i+1]) != zero + || fcn (m[i+2]) != zero + || fcn (m[i+3]) != zero) + return ! zero; + } + + octave_quit (); + + for (; i < len; i++) + if (fcn (m[i]) != zero) + return ! zero; + + return zero; +} + extern OCTAVE_API bool xis_int_or_inf_or_nan (double x); extern OCTAVE_API bool xis_one_or_zero (double x); extern OCTAVE_API bool xis_zero (double x); extern OCTAVE_API bool xtoo_large_for_float (double x); +extern OCTAVE_API bool xtoo_large_for_float (const Complex& x); + extern OCTAVE_API bool xis_int_or_inf_or_nan (float x); extern OCTAVE_API bool xis_one_or_zero (float x); extern OCTAVE_API bool xis_zero (float x);