diff liboctave/CNDArray.cc @ 10143:f3c34b518422

simplify pairwise min/max implementations
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 20 Jan 2010 10:58:55 +0100
parents 829e69ec3110
children 4c0cdbe0acca
line wrap: on
line diff
--- a/liboctave/CNDArray.cc
+++ b/liboctave/CNDArray.cc
@@ -914,139 +914,40 @@
   return is;
 }
 
-// FIXME -- it would be nice to share code among the min/max
-// functions below.
-
-#define EMPTY_RETURN_CHECK(T) \
-  if (nel == 0)	\
-    return T (dv);
-
 ComplexNDArray
-min (const Complex& c, const ComplexNDArray& m)
+min (const Complex& s, const ComplexNDArray& m)
 {
-  dim_vector dv = m.dims ();
-  int nel = dv.numel ();
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmin (c, m (i));
-    }
-
-  return result;
+  return do_sm_binary_op<ComplexNDArray> (s, m, mx_inline_xmin);
 }
 
 ComplexNDArray
-min (const ComplexNDArray& m, const Complex& c)
+min (const ComplexNDArray& m, const Complex& s)
 {
-  dim_vector dv = m.dims ();
-  int nel = dv.numel ();
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmin (c, m (i));
-    }
-
-  return result;
+  return do_ms_binary_op<ComplexNDArray> (m, s, mx_inline_xmin);
 }
 
 ComplexNDArray
 min (const ComplexNDArray& a, const ComplexNDArray& b)
 {
-  dim_vector dv = a.dims ();
-  int nel = dv.numel ();
-
-  if (dv != b.dims ())
-    {
-      (*current_liboctave_error_handler)
-	("two-arg min expecting args of same size");
-      return ComplexNDArray ();
-    }
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmin (a (i), b (i));
-    }
-
-  return result;
+  return do_mm_binary_op<ComplexNDArray> (a, b, mx_inline_xmin, "min");
 }
 
 ComplexNDArray
-max (const Complex& c, const ComplexNDArray& m)
+max (const Complex& s, const ComplexNDArray& m)
 {
-  dim_vector dv = m.dims ();
-  int nel = dv.numel ();
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmax (c, m (i));
-    }
-
-  return result;
+  return do_sm_binary_op<ComplexNDArray> (s, m, mx_inline_xmax);
 }
 
 ComplexNDArray
-max (const ComplexNDArray& m, const Complex& c)
+max (const ComplexNDArray& m, const Complex& s)
 {
-  dim_vector dv = m.dims ();
-  int nel = dv.numel ();
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmax (c, m (i));
-    }
-
-  return result;
+  return do_ms_binary_op<ComplexNDArray> (m, s, mx_inline_xmax);
 }
 
 ComplexNDArray
 max (const ComplexNDArray& a, const ComplexNDArray& b)
 {
-  dim_vector dv = a.dims ();
-  int nel = dv.numel ();
-
-  if (dv != b.dims ())
-    {
-      (*current_liboctave_error_handler)
-	("two-arg max expecting args of same size");
-      return ComplexNDArray ();
-    }
-
-  EMPTY_RETURN_CHECK (ComplexNDArray);
-
-  ComplexNDArray result (dv);
-
-  for (int i = 0; i < nel; i++)
-    {
-      octave_quit ();
-      result (i) = xmax (a (i), b (i));
-    }
-
-  return result;
+  return do_mm_binary_op<ComplexNDArray> (a, b, mx_inline_xmax, "max");
 }
 
 NDS_CMP_OPS (ComplexNDArray, Complex)