diff src/ov-float.cc @ 9812:f80c566bc751

improve unary mapper system
author Jaroslav Hajek <highegg@gmail.com>
date Thu, 12 Nov 2009 15:47:58 +0100
parents bcdf878e2686
children 1bb1ed717d2f
line wrap: on
line diff
--- a/src/ov-float.cc
+++ b/src/ov-float.cc
@@ -252,67 +252,63 @@
   return retval;
 }
 
-#define SCALAR_MAPPER(MAP, FCN) \
-  octave_value \
-  octave_float_scalar::MAP (void) const \
-  { \
-    return octave_value (FCN (scalar)); \
-  }
+octave_value
+octave_float_scalar::map (unary_mapper_t umap) const
+{
+  switch (umap)
+    {
+    case umap_imag:
+      return 0.0f;
 
-#define CD_SCALAR_MAPPER(MAP, RFCN, CFCN, L1, L2) \
-  octave_value \
-  octave_float_scalar::MAP (void) const \
-  { \
-    return (scalar < L1 || scalar > L2 \
-            ? octave_value (CFCN (FloatComplex (scalar))) \
-	    : octave_value (RFCN (scalar))); \
-  }
+    case umap_real:
+    case umap_conj:
+      return scalar;
 
-static float
-xconj (float x)
-{
-  return x;
-}
+#define SCALAR_MAPPER(UMAP, FCN) \
+    case umap_ ## UMAP: \
+      return octave_value (FCN (scalar))
 
-SCALAR_MAPPER (erf, ::erff)
-SCALAR_MAPPER (erfc, ::erfcf)
-SCALAR_MAPPER (gamma, xgamma)
-CD_SCALAR_MAPPER (lgamma, xlgamma, xlgamma, 0.0, octave_Float_Inf)
-SCALAR_MAPPER (abs, ::fabsf)
-CD_SCALAR_MAPPER (acos, ::acosf, ::acos, -1.0, 1.0)
-CD_SCALAR_MAPPER (acosh, ::acoshf, ::acosh, 1.0, octave_Float_Inf)
-SCALAR_MAPPER (angle, ::arg)
-SCALAR_MAPPER (arg, ::arg)
-CD_SCALAR_MAPPER (asin, ::asinf, ::asin, -1.0, 1.0)
-SCALAR_MAPPER (asinh, ::asinhf)
-SCALAR_MAPPER (atan, ::atanf)
-CD_SCALAR_MAPPER (atanh, ::atanhf, ::atanh, -1.0, 1.0)
-SCALAR_MAPPER (ceil, ::ceilf)
-SCALAR_MAPPER (conj, xconj)
-SCALAR_MAPPER (cos, ::cosf)
-SCALAR_MAPPER (cosh, ::coshf)
-SCALAR_MAPPER (exp, ::expf)
-SCALAR_MAPPER (expm1, ::expm1f)
-SCALAR_MAPPER (fix, ::fix)
-SCALAR_MAPPER (floor, ::floorf)
-SCALAR_MAPPER (imag, ::imag)
-CD_SCALAR_MAPPER (log, ::logf, std::log, 0.0, octave_Float_Inf)
-CD_SCALAR_MAPPER (log2, xlog2, xlog2, 0.0, octave_Float_Inf)
-CD_SCALAR_MAPPER (log10, ::log10f, std::log10, 0.0, octave_Float_Inf)
-CD_SCALAR_MAPPER (log1p, ::log1pf, ::log1p, -1.0, octave_Float_Inf)
-SCALAR_MAPPER (real, ::real)
-SCALAR_MAPPER (round, xround)
-SCALAR_MAPPER (roundb, xroundb)
-SCALAR_MAPPER (signum, ::signum)
-SCALAR_MAPPER (sin, ::sinf)
-SCALAR_MAPPER (sinh, ::sinhf)
-CD_SCALAR_MAPPER (sqrt, ::sqrtf, std::sqrt, 0.0, octave_Float_Inf)
-SCALAR_MAPPER (tan, ::tanf)
-SCALAR_MAPPER (tanh, ::tanhf)
-SCALAR_MAPPER (finite, xfinite)
-SCALAR_MAPPER (isinf, xisinf)
-SCALAR_MAPPER (isna, octave_is_NA)
-SCALAR_MAPPER (isnan, xisnan)
+      SCALAR_MAPPER (abs, ::fabsf);
+      SCALAR_MAPPER (acos, rc_acos);
+      SCALAR_MAPPER (acosh, rc_acosh);
+      SCALAR_MAPPER (angle, ::arg);
+      SCALAR_MAPPER (arg, ::arg);
+      SCALAR_MAPPER (asin, rc_asin);
+      SCALAR_MAPPER (asinh, ::asinhf);
+      SCALAR_MAPPER (atan, ::atanf);
+      SCALAR_MAPPER (atanh, rc_atanh);
+      SCALAR_MAPPER (erf, ::erff);
+      SCALAR_MAPPER (erfc, ::erfcf);
+      SCALAR_MAPPER (gamma, xgamma);
+      SCALAR_MAPPER (lgamma, rc_lgamma);
+      SCALAR_MAPPER (ceil, ::ceilf);
+      SCALAR_MAPPER (cos, ::cosf);
+      SCALAR_MAPPER (cosh, ::coshf);
+      SCALAR_MAPPER (exp, ::expf);
+      SCALAR_MAPPER (expm1, ::expm1f);
+      SCALAR_MAPPER (fix, ::fix);
+      SCALAR_MAPPER (floor, ::floorf);
+      SCALAR_MAPPER (log, rc_log);
+      SCALAR_MAPPER (log2, rc_log2);
+      SCALAR_MAPPER (log10, rc_log10);
+      SCALAR_MAPPER (log1p, rc_log1p);
+      SCALAR_MAPPER (round, xround);
+      SCALAR_MAPPER (roundb, xroundb);
+      SCALAR_MAPPER (signum, ::signum);
+      SCALAR_MAPPER (sin, ::sinf);
+      SCALAR_MAPPER (sinh, ::sinhf);
+      SCALAR_MAPPER (sqrt, rc_sqrt);
+      SCALAR_MAPPER (tan, ::tanf);
+      SCALAR_MAPPER (tanh, ::tanhf);
+      SCALAR_MAPPER (finite, xfinite);
+      SCALAR_MAPPER (isinf, xisinf);
+      SCALAR_MAPPER (isna, octave_is_NA);
+      SCALAR_MAPPER (isnan, xisnan);
+
+    default:
+      return octave_base_value::map (umap);
+    }
+}
 
 /*
 ;;; Local Variables: ***