diff src/ov-flt-re-mat.cc @ 9812:f80c566bc751

improve unary mapper system
author Jaroslav Hajek <highegg@gmail.com>
date Thu, 12 Nov 2009 15:47:58 +0100
parents b4fdfee405b5
children 9b62f2d8de6d
line wrap: on
line diff
--- a/src/ov-flt-re-mat.cc	Wed Nov 11 17:43:45 2009 -0800
+++ b/src/ov-flt-re-mat.cc	Thu Nov 12 15:47:58 2009 +0100
@@ -680,137 +680,69 @@
   return retval;
 }
 
-static bool
-any_element_less_than (const FloatNDArray& a, float val)
-{
-  octave_idx_type len = a.length ();
-  const float *m = a.fortran_vec ();
-
-  for (octave_idx_type i = 0; i < len; i++)
-    {
-      OCTAVE_QUIT;
-
-      if (m[i] < val)
-	return true;
-    }
-
-  return false;
-}
-
-static bool
-any_element_greater_than (const FloatNDArray& a, float val)
-{
-  octave_idx_type len = a.length ();
-  const float *m = a.fortran_vec ();
-
-  for (octave_idx_type i = 0; i < len; i++)
-    {
-      OCTAVE_QUIT;
-
-      if (m[i] > val)
-	return true;
-    }
-
-  return false;
-}
-
-#define ARRAY_MAPPER(MAP, AMAP, FCN) \
-  octave_value \
-  octave_float_matrix::MAP (void) const \
-  { \
-    static AMAP dmap = FCN; \
-    return matrix.map (dmap); \
-  }
-
-#define CD_ARRAY_MAPPER(MAP, RFCN, CFCN, L1, L2) \
-  octave_value \
-  octave_float_matrix::MAP (void) const \
-  { \
-    static FloatNDArray::dmapper dmap = RFCN; \
-    static FloatNDArray::cmapper cmap = CFCN; \
- \
-    return (any_element_less_than (matrix, L1) \
-            ? octave_value (matrix.map (cmap)) \
-	    : (any_element_greater_than (matrix, L2) \
-	       ? octave_value (matrix.map (cmap)) \
-	       : octave_value (matrix.map (dmap)))); \
-  }
-
-// The fast mappers.
 octave_value
-octave_float_matrix::abs (void) const
-{
-  return matrix.abs ();
-}
-
-octave_value
-octave_float_matrix::real (void) const
+octave_float_matrix::map (unary_mapper_t umap) const
 {
-  return matrix;
-}
+  switch (umap)
+    {
+    case umap_imag:
+      return FloatNDArray (matrix.dims (), 0.0);
 
-octave_value
-octave_float_matrix::conj (void) const
-{
-  return matrix;
-}
-
-octave_value
-octave_float_matrix::imag (void) const
-{
-  return FloatNDArray (matrix.dims (), 0.0);
-}
+    case umap_real:
+    case umap_conj:
+      return matrix;
 
-octave_value
-octave_float_matrix::isnan (void) const
-{
-  return matrix.isnan ();
-}
+    // Mappers handled specially.
+#define ARRAY_METHOD_MAPPER(UMAP, FCN) \
+    case umap_ ## UMAP: \
+      return octave_value (matrix.FCN ())
 
-octave_value
-octave_float_matrix::isinf (void) const
-{
-  return matrix.isinf ();
-}
+      ARRAY_METHOD_MAPPER (abs, abs);
+      ARRAY_METHOD_MAPPER (isnan, isnan);
+      ARRAY_METHOD_MAPPER (isinf, isinf);
+      ARRAY_METHOD_MAPPER (finite, isfinite);
 
-octave_value
-octave_float_matrix::finite (void) const
-{
-  return matrix.isfinite ();
-}
+#define ARRAY_MAPPER(UMAP, TYPE, FCN) \
+    case umap_ ## UMAP: \
+      return octave_value (matrix.map<TYPE> (FCN))
 
-ARRAY_MAPPER (erf, FloatNDArray::dmapper, ::erff)
-ARRAY_MAPPER (erfc, FloatNDArray::dmapper, ::erfcf)
-ARRAY_MAPPER (gamma, FloatNDArray::dmapper, xgamma)
-CD_ARRAY_MAPPER (lgamma, xlgamma, xlgamma, 0.0, octave_Float_Inf)
-CD_ARRAY_MAPPER (acos, ::acosf, ::acos, -1.0, 1.0)
-CD_ARRAY_MAPPER (acosh, ::acoshf, ::acosh, 1.0, octave_Float_Inf)
-ARRAY_MAPPER (angle, FloatNDArray::dmapper, ::arg)
-ARRAY_MAPPER (arg, FloatNDArray::dmapper, ::arg)
-CD_ARRAY_MAPPER (asin, ::asinf, ::asin, -1.0, 1.0)
-ARRAY_MAPPER (asinh, FloatNDArray::dmapper,::asinhf)
-ARRAY_MAPPER (atan, FloatNDArray::dmapper, ::atanf)
-CD_ARRAY_MAPPER (atanh, ::atanhf, ::atanh, -1.0, 1.0)
-ARRAY_MAPPER (ceil, FloatNDArray::dmapper, ::ceilf)
-ARRAY_MAPPER (cos, FloatNDArray::dmapper, ::cosf)
-ARRAY_MAPPER (cosh, FloatNDArray::dmapper, ::coshf)
-ARRAY_MAPPER (exp, FloatNDArray::dmapper, ::expf)
-ARRAY_MAPPER (expm1, FloatNDArray::dmapper, ::expm1f)
-ARRAY_MAPPER (fix, FloatNDArray::dmapper, ::fix)
-ARRAY_MAPPER (floor, FloatNDArray::dmapper, ::floorf)
-CD_ARRAY_MAPPER (log, ::logf, std::log, 0.0, octave_Float_Inf)
-CD_ARRAY_MAPPER (log2, xlog2, xlog2, 0.0, octave_Float_Inf)
-CD_ARRAY_MAPPER (log10, ::log10f, std::log10, 0.0, octave_Float_Inf)
-CD_ARRAY_MAPPER (log1p, ::log1pf, ::log1pf, -1.0, octave_Float_Inf)
-ARRAY_MAPPER (round, FloatNDArray::dmapper, xround)
-ARRAY_MAPPER (roundb, FloatNDArray::dmapper, xroundb)
-ARRAY_MAPPER (signum, FloatNDArray::dmapper, ::signum)
-ARRAY_MAPPER (sin, FloatNDArray::dmapper, ::sinf)
-ARRAY_MAPPER (sinh, FloatNDArray::dmapper, ::sinhf)
-CD_ARRAY_MAPPER (sqrt, ::sqrtf, std::sqrt, 0.0, octave_Float_Inf)
-ARRAY_MAPPER (tan, FloatNDArray::dmapper, ::tanf)
-ARRAY_MAPPER (tanh, FloatNDArray::dmapper, ::tanhf)
-ARRAY_MAPPER (isna, FloatNDArray::bmapper, octave_is_NA)
+      ARRAY_MAPPER (acos, FloatComplex, rc_acos);
+      ARRAY_MAPPER (acosh, FloatComplex, rc_acosh);
+      ARRAY_MAPPER (angle, float, ::arg);
+      ARRAY_MAPPER (arg, float, ::arg);
+      ARRAY_MAPPER (asin, FloatComplex, rc_asin);
+      ARRAY_MAPPER (asinh, float, ::asinhf);
+      ARRAY_MAPPER (atan, float, ::atanf);
+      ARRAY_MAPPER (atanh, FloatComplex, rc_atanh);
+      ARRAY_MAPPER (erf, float, ::erff);
+      ARRAY_MAPPER (erfc, float, ::erfcf);
+      ARRAY_MAPPER (gamma, float, xgamma);
+      ARRAY_MAPPER (lgamma, FloatComplex, rc_lgamma);
+      ARRAY_MAPPER (ceil, float, ::ceilf);
+      ARRAY_MAPPER (cos, float, ::cosf);
+      ARRAY_MAPPER (cosh, float, ::coshf);
+      ARRAY_MAPPER (exp, float, ::expf);
+      ARRAY_MAPPER (expm1, float, ::expm1f);
+      ARRAY_MAPPER (fix, float, ::fix);
+      ARRAY_MAPPER (floor, float, ::floorf);
+      ARRAY_MAPPER (log, FloatComplex, rc_log);
+      ARRAY_MAPPER (log2, FloatComplex, rc_log2);
+      ARRAY_MAPPER (log10, FloatComplex, rc_log10);
+      ARRAY_MAPPER (log1p, FloatComplex, rc_log1p);
+      ARRAY_MAPPER (round, float, xround);
+      ARRAY_MAPPER (roundb, float, xroundb);
+      ARRAY_MAPPER (signum, float, ::signum);
+      ARRAY_MAPPER (sin, float, ::sinf);
+      ARRAY_MAPPER (sinh, float, ::sinhf);
+      ARRAY_MAPPER (sqrt, FloatComplex, rc_sqrt);
+      ARRAY_MAPPER (tan, float, ::tanf);
+      ARRAY_MAPPER (tanh, float, ::tanhf);
+      ARRAY_MAPPER (isna, bool, octave_is_NA);
+
+    default:
+      return octave_base_value::map (umap);
+    }
+}
 
 DEFUN (single, args, ,
   "-*- texinfo -*-\n\