diff libinterp/octave-value/ov.cc @ 22283:564203123065

move single and double type conversion functions to ov.cc * ov.h, ov.cc (octave_value::as_double, octave_value::as_double): New functions. (Fdouble): Move here from ov-re-mat.cc. (Fsingle): Move here from ov-flt-re-mat.cc. * ov-type-conv.h (octave_type_conv): New template function, replaces OCTAVE_TYPE_CONV_BODY3 macro. Change all uses. (OCTAVE_TYPE_CONV_BODY): Simplify.
author John W. Eaton <jwe@octave.org>
date Sat, 13 Aug 2016 17:49:18 -0400
parents e43d83253e28
children 8b18f46f6427
line wrap: on
line diff
--- a/libinterp/octave-value/ov.cc	Sat Aug 13 17:44:19 2016 -0400
+++ b/libinterp/octave-value/ov.cc	Sat Aug 13 17:49:18 2016 -0400
@@ -74,6 +74,7 @@
 #include "ov-usr-fcn.h"
 #include "ov-fcn-handle.h"
 #include "ov-fcn-inline.h"
+#include "ov-type-conv.h"
 #include "ov-typeinfo.h"
 #include "ov-null-mat.h"
 #include "ov-lazy-idx.h"
@@ -1184,6 +1185,138 @@
 }
 
 octave_value
+octave_value::as_double (void) const
+{
+  if (is_perm_matrix ())
+    return octave_type_conv<octave_perm_matrix, octave_scalar> (*this, "double");
+  else if (is_diag_matrix ())
+    {
+      if (is_complex_type ())
+        return octave_type_conv<octave_complex_diag_matrix, octave_complex> (*this, "double");
+      else
+        return octave_type_conv<octave_diag_matrix, octave_scalar> (*this, "double");
+    }
+  else if (is_sparse_type ())
+    {
+      if (is_complex_type ())
+        return octave_type_conv<octave_sparse_complex_matrix, octave_complex> (*this, "double");
+      else
+        return octave_type_conv<octave_sparse_matrix, octave_scalar> (*this, "double");
+    }
+  else if (is_complex_type ())
+    return octave_type_conv<octave_complex_matrix, octave_complex> (*this, "double");
+  else
+    return octave_type_conv<octave_matrix, octave_scalar> (*this, "double");
+
+  return ovl ();
+}
+
+DEFUN (double, args, ,
+       doc: /* -*- texinfo -*-
+@deftypefn {} {} double (@var{x})
+Convert @var{x} to double precision type.
+@seealso{single}
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    print_usage ();
+
+  return ovl (args(0).as_double ());
+}
+
+/*
+%!assert (class (double (single (1))), "double")
+%!assert (class (double (single (1 + i))), "double")
+%!assert (class (double (int8 (1))), "double")
+%!assert (class (double (uint8 (1))), "double")
+%!assert (class (double (int16 (1))), "double")
+%!assert (class (double (uint16 (1))), "double")
+%!assert (class (double (int32 (1))), "double")
+%!assert (class (double (uint32 (1))), "double")
+%!assert (class (double (int64 (1))), "double")
+%!assert (class (double (uint64 (1))), "double")
+%!assert (class (double (true)), "double")
+%!assert (class (double ("A")), "double")
+%!test
+%! x = sparse (logical ([1 0; 0 1]));
+%! y = double (x);
+%! assert (class (x), "logical");
+%! assert (class (y), "double");
+%! assert (issparse (y));
+%!test
+%! x = diag (single ([1 3 2]));
+%! y = double (x);
+%! assert (class (x), "single");
+%! assert (class (y), "double");
+%!test
+%! x = diag (single ([i 3 2]));
+%! y = double (x);
+%! assert (class (x), "single");
+%! assert (class (y), "double");
+*/
+
+octave_value
+octave_value::as_single (void) const
+{
+  if (is_diag_matrix ())
+    {
+      if (is_complex_type ())
+        return octave_type_conv<octave_float_complex_diag_matrix, octave_float_complex> (*this, "single");
+      else
+        return octave_type_conv<octave_float_diag_matrix, octave_float_scalar> (*this, "single");
+    }
+  else if (is_sparse_type ())
+    error ("single: sparse type does not support single precision");
+  else if (is_complex_type ())
+    return octave_type_conv<octave_float_complex_matrix, octave_float_complex> (*this, "single");
+  else
+    return octave_type_conv<octave_float_matrix, octave_float_scalar> (*this, "single");
+
+  return octave_value ();
+}
+
+DEFUN (single, args, ,
+       doc: /* -*- texinfo -*-
+@deftypefn {} {} single (@var{x})
+Convert @var{x} to single precision type.
+@seealso{double}
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    print_usage ();
+
+  return args(0).as_single ();
+
+  return ovl ();
+}
+
+/*
+%!assert (class (single (1)), "single")
+%!assert (class (single (1 + i)), "single")
+%!assert (class (single (int8 (1))), "single")
+%!assert (class (single (uint8 (1))), "single")
+%!assert (class (single (int16 (1))), "single")
+%!assert (class (single (uint16 (1))), "single")
+%!assert (class (single (int32 (1))), "single")
+%!assert (class (single (uint32 (1))), "single")
+%!assert (class (single (int64 (1))), "single")
+%!assert (class (single (uint64 (1))), "single")
+%!assert (class (single (true)), "single")
+%!assert (class (single ("A")), "single")
+%!error (single (sparse (1)))
+%!test
+%! x = diag ([1 3 2]);
+%! y = single (x);
+%! assert (class (x), "double");
+%! assert (class (y), "single");
+%!test
+%! x = diag ([i 3 2]);
+%! y = single (x);
+%! assert (class (x), "double");
+%! assert (class (y), "single");
+*/
+
+ octave_value
 octave_value::single_subsref (const std::string& type,
                               const octave_value_list& idx)
 {