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);