diff libinterp/corefcn/dot.cc @ 20918:6f0bd96f93c0

maint: Use new C++ archetype in more files. Place input validation first in files. Move declaration of retval down in function to be closer to point of usage. Eliminate else clause after if () error. Use "return ovl()" where it makes sense. * __dispatch__.cc, __dsearchn__.cc, __ichol__.cc, __lin_interpn__.cc, balance.cc, betainc.cc, bitfcns.cc, bsxfun.cc, cellfun.cc, colloc.cc, conv2.cc, daspk.cc, dasrt.cc, dassl.cc, data.cc, debug.cc, dirfns.cc, dlmread.cc, dot.cc, eig.cc, error.cc, fft.cc, fft2.cc, fftn.cc, file-io.cc, ov-type-conv.h: Use new C++ archetype in more files.
author Rik <rik@octave.org>
date Wed, 16 Dec 2015 15:00:31 -0800
parents 1142cf6abc0d
children fcac5dbbf9ed
line wrap: on
line diff
--- a/libinterp/corefcn/dot.cc	Wed Dec 16 17:09:44 2015 -0500
+++ b/libinterp/corefcn/dot.cc	Wed Dec 16 15:00:31 2015 -0800
@@ -122,116 +122,108 @@
 @seealso{cross, divergence}\n\
 @end deftypefn")
 {
-  octave_value retval;
   int nargin = args.length ();
 
   if (nargin < 2 || nargin > 3)
     print_usage ();
 
+  octave_value retval;
   octave_value argx = args(0);
   octave_value argy = args(1);
 
-  if (argx.is_numeric_type () && argy.is_numeric_type ())
-    {
-      dim_vector dimx = argx.dims ();
-      dim_vector dimy = argy.dims ();
-      bool match = dimx == dimy;
-      if (! match && nargin == 2
-          && dimx.is_vector () && dimy.is_vector ())
-        {
-          // Change to column vectors.
-          dimx = dimx.redim (1);
-          argx = argx.reshape (dimx);
-          dimy = dimy.redim (1);
-          argy = argy.reshape (dimy);
-          match = dimx == dimy;
-        }
+  if (! argx.is_numeric_type () || ! argy.is_numeric_type ())
+    error ("dot: X and Y must be numeric");
 
-      if (match)
-        {
-          int dim;
-          if (nargin == 2)
-            dim = dimx.first_non_singleton ();
-          else
-            dim = args(2).int_value (true) - 1;
+  dim_vector dimx = argx.dims ();
+  dim_vector dimy = argy.dims ();
+  bool match = dimx == dimy;
+  if (! match && nargin == 2 && dimx.is_vector () && dimy.is_vector ())
+    {
+      // Change to column vectors.
+      dimx = dimx.redim (1);
+      argx = argx.reshape (dimx);
+      dimy = dimy.redim (1);
+      argy = argy.reshape (dimy);
+      match = dimx == dimy;
+    }
 
-          if (dim < 0)
-            error ("dot: DIM must be a valid dimension");
-          else
-            {
-              octave_idx_type m, n, k;
-              dim_vector dimz;
-              if (argx.is_complex_type () || argy.is_complex_type ())
-                {
-                  if (argx.is_single_type () || argy.is_single_type ())
-                    {
-                      FloatComplexNDArray x = argx.float_complex_array_value ();
-                      FloatComplexNDArray y = argy.float_complex_array_value ();
-                      get_red_dims (dimx, dimy, dim, dimz, m, n, k);
-                      FloatComplexNDArray z (dimz);
+  if (! match)
+    error ("dot: sizes of X and Y must match");
 
-                      F77_XFCN (cdotc3, CDOTC3, (m, n, k,
-                                                 x.data (), y.data (),
-                                                 z.fortran_vec ()));
-                      retval = z;
-                    }
-                  else
-                    {
-                      ComplexNDArray x = argx.complex_array_value ();
-                      ComplexNDArray y = argy.complex_array_value ();
-                      get_red_dims (dimx, dimy, dim, dimz, m, n, k);
-                      ComplexNDArray z (dimz);
+  int dim;
+  if (nargin == 2)
+    dim = dimx.first_non_singleton ();
+  else
+    dim = args(2).int_value (true) - 1;
 
-                      F77_XFCN (zdotc3, ZDOTC3, (m, n, k,
-                                                 x.data (), y.data (),
-                                                 z.fortran_vec ()));
-                      retval = z;
-                    }
-                }
-              else if (argx.is_float_type () && argy.is_float_type ())
-                {
-                  if (argx.is_single_type () || argy.is_single_type ())
-                    {
-                      FloatNDArray x = argx.float_array_value ();
-                      FloatNDArray y = argy.float_array_value ();
-                      get_red_dims (dimx, dimy, dim, dimz, m, n, k);
-                      FloatNDArray z (dimz);
+  if (dim < 0)
+    error ("dot: DIM must be a valid dimension");
 
-                      F77_XFCN (sdot3, SDOT3, (m, n, k, x.data (), y.data (),
-                                               z.fortran_vec ()));
-                      retval = z;
-                    }
-                  else
-                    {
-                      NDArray x = argx.array_value ();
-                      NDArray y = argy.array_value ();
-                      get_red_dims (dimx, dimy, dim, dimz, m, n, k);
-                      NDArray z (dimz);
+  octave_idx_type m, n, k;
+  dim_vector dimz;
+  if (argx.is_complex_type () || argy.is_complex_type ())
+    {
+      if (argx.is_single_type () || argy.is_single_type ())
+        {
+          FloatComplexNDArray x = argx.float_complex_array_value ();
+          FloatComplexNDArray y = argy.float_complex_array_value ();
+          get_red_dims (dimx, dimy, dim, dimz, m, n, k);
+          FloatComplexNDArray z (dimz);
 
-                      F77_XFCN (ddot3, DDOT3, (m, n, k, x.data (), y.data (),
-                                               z.fortran_vec ()));
-                      retval = z;
-                    }
-                }
-              else
-                {
-                  // Non-optimized evaluation.
-                  octave_value_list tmp;
-                  tmp(1) = dim + 1;
-                  tmp(0) = do_binary_op (octave_value::op_el_mul, argx, argy);
-
-                  tmp = feval ("sum", tmp, 1);
-                  if (! tmp.empty ())
-                    retval = tmp(0);
-                }
-            }
+          F77_XFCN (cdotc3, CDOTC3, (m, n, k,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
         }
       else
-        error ("dot: sizes of X and Y must match");
+        {
+          ComplexNDArray x = argx.complex_array_value ();
+          ComplexNDArray y = argy.complex_array_value ();
+          get_red_dims (dimx, dimy, dim, dimz, m, n, k);
+          ComplexNDArray z (dimz);
 
+          F77_XFCN (zdotc3, ZDOTC3, (m, n, k,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
+        }
+    }
+  else if (argx.is_float_type () && argy.is_float_type ())
+    {
+      if (argx.is_single_type () || argy.is_single_type ())
+        {
+          FloatNDArray x = argx.float_array_value ();
+          FloatNDArray y = argy.float_array_value ();
+          get_red_dims (dimx, dimy, dim, dimz, m, n, k);
+          FloatNDArray z (dimz);
+
+          F77_XFCN (sdot3, SDOT3, (m, n, k, x.data (), y.data (),
+                                   z.fortran_vec ()));
+          retval = z;
+        }
+      else
+        {
+          NDArray x = argx.array_value ();
+          NDArray y = argy.array_value ();
+          get_red_dims (dimx, dimy, dim, dimz, m, n, k);
+          NDArray z (dimz);
+
+          F77_XFCN (ddot3, DDOT3, (m, n, k, x.data (), y.data (),
+                                   z.fortran_vec ()));
+          retval = z;
+        }
     }
   else
-    error ("dot: X and Y must be numeric");
+    {
+      // Non-optimized evaluation.
+      octave_value_list tmp;
+      tmp(1) = dim + 1;
+      tmp(0) = do_binary_op (octave_value::op_el_mul, argx, argy);
+
+      tmp = feval ("sum", tmp, 1);
+      if (! tmp.empty ())
+        retval = tmp(0);
+    }
 
   return retval;
 }
@@ -293,94 +285,89 @@
 @end example\n\
 @end deftypefn")
 {
-  octave_value retval;
-
   if (args.length () != 2)
     print_usage ();
 
+  octave_value retval;
+
   octave_value argx = args(0);
   octave_value argy = args(1);
 
-  if (argx.is_numeric_type () && argy.is_numeric_type ())
-    {
-      const dim_vector dimx = argx.dims ();
-      const dim_vector dimy = argy.dims ();
-      int nd = dimx.length ();
-      octave_idx_type m = dimx(0);
-      octave_idx_type k = dimx(1);
-      octave_idx_type n = dimy(1);
-      octave_idx_type np = 1;
-      bool match = dimy(0) == k && nd == dimy.length ();
-      dim_vector dimz = dim_vector::alloc (nd);
-      dimz(0) = m;
-      dimz(1) = n;
-      for (int i = 2; match && i < nd; i++)
-        {
-          match = match && dimx(i) == dimy(i);
-          dimz(i) = dimx(i);
-          np *= dimz(i);
-        }
-
-      if (match)
-        {
-          if (argx.is_complex_type () || argy.is_complex_type ())
-            {
-              if (argx.is_single_type () || argy.is_single_type ())
-                {
-                  FloatComplexNDArray x = argx.float_complex_array_value ();
-                  FloatComplexNDArray y = argy.float_complex_array_value ();
-                  FloatComplexNDArray z (dimz);
+  if (! argx.is_numeric_type () || ! argy.is_numeric_type ())
+    error ("blkmm: A and B must be numeric");
 
-                  F77_XFCN (cmatm3, CMATM3, (m, n, k, np,
-                                             x.data (), y.data (),
-                                             z.fortran_vec ()));
-                  retval = z;
-                }
-              else
-                {
-                  ComplexNDArray x = argx.complex_array_value ();
-                  ComplexNDArray y = argy.complex_array_value ();
-                  ComplexNDArray z (dimz);
+  const dim_vector dimx = argx.dims ();
+  const dim_vector dimy = argy.dims ();
+  int nd = dimx.length ();
+  octave_idx_type m = dimx(0);
+  octave_idx_type k = dimx(1);
+  octave_idx_type n = dimy(1);
+  octave_idx_type np = 1;
+  bool match = dimy(0) == k && nd == dimy.length ();
+  dim_vector dimz = dim_vector::alloc (nd);
+  dimz(0) = m;
+  dimz(1) = n;
+  for (int i = 2; match && i < nd; i++)
+    {
+      match = match && dimx(i) == dimy(i);
+      dimz(i) = dimx(i);
+      np *= dimz(i);
+    }
 
-                  F77_XFCN (zmatm3, ZMATM3, (m, n, k, np,
-                                             x.data (), y.data (),
-                                             z.fortran_vec ()));
-                  retval = z;
-                }
-            }
-          else
-            {
-              if (argx.is_single_type () || argy.is_single_type ())
-                {
-                  FloatNDArray x = argx.float_array_value ();
-                  FloatNDArray y = argy.float_array_value ();
-                  FloatNDArray z (dimz);
+  if (! match)
+    error ("blkmm: A and B dimensions don't match: (%s) and (%s)",
+           dimx.str ().c_str (), dimy.str ().c_str ());
 
-                  F77_XFCN (smatm3, SMATM3, (m, n, k, np,
-                                             x.data (), y.data (),
-                                             z.fortran_vec ()));
-                  retval = z;
-                }
-              else
-                {
-                  NDArray x = argx.array_value ();
-                  NDArray y = argy.array_value ();
-                  NDArray z (dimz);
+  if (argx.is_complex_type () || argy.is_complex_type ())
+    {
+      if (argx.is_single_type () || argy.is_single_type ())
+        {
+          FloatComplexNDArray x = argx.float_complex_array_value ();
+          FloatComplexNDArray y = argy.float_complex_array_value ();
+          FloatComplexNDArray z (dimz);
 
-                  F77_XFCN (dmatm3, DMATM3, (m, n, k, np,
-                                             x.data (), y.data (),
-                                             z.fortran_vec ()));
-                  retval = z;
-                }
-            }
+          F77_XFCN (cmatm3, CMATM3, (m, n, k, np,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
         }
       else
-        error ("blkmm: A and B dimensions don't match: (%s) and (%s)",
-               dimx.str ().c_str (), dimy.str ().c_str ());
+        {
+          ComplexNDArray x = argx.complex_array_value ();
+          ComplexNDArray y = argy.complex_array_value ();
+          ComplexNDArray z (dimz);
 
+          F77_XFCN (zmatm3, ZMATM3, (m, n, k, np,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
+        }
     }
   else
-    error ("blkmm: A and B must be numeric");
+    {
+      if (argx.is_single_type () || argy.is_single_type ())
+        {
+          FloatNDArray x = argx.float_array_value ();
+          FloatNDArray y = argy.float_array_value ();
+          FloatNDArray z (dimz);
+
+          F77_XFCN (smatm3, SMATM3, (m, n, k, np,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
+        }
+      else
+        {
+          NDArray x = argx.array_value ();
+          NDArray y = argy.array_value ();
+          NDArray z (dimz);
+
+          F77_XFCN (dmatm3, DMATM3, (m, n, k, np,
+                                     x.data (), y.data (),
+                                     z.fortran_vec ()));
+          retval = z;
+        }
+    }
 
   return retval;
 }