changeset 24760:b784d68f7c44

fix printing of logical values (bug #53160) * pr-output.h, pr-output.cc (make_format): Provide specialization for boolNDArray objects. (octave_print_internal): Define more consistently.
author John W. Eaton <jwe@octave.org>
date Wed, 14 Feb 2018 23:28:40 -0500
parents 6fe8e8a2a8e8
children d7c3918955e6
files libinterp/corefcn/pr-output.cc libinterp/corefcn/pr-output.h
diffstat 2 files changed, 201 insertions(+), 192 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/pr-output.cc	Wed Feb 14 16:08:12 2018 -0800
+++ b/libinterp/corefcn/pr-output.cc	Wed Feb 14 23:28:40 2018 -0500
@@ -1647,6 +1647,13 @@
   return make_format (FloatComplexMatrix (nda), r_fw, i_fw, scale);
 }
 
+template <>
+float_display_format
+make_format (const boolNDArray&)
+{
+  return float_display_format (float_format (1, 1));
+}
+
 // FIXME: all this mess with abs is an attempt to avoid seeing
 //
 //   warning: comparison of unsigned expression < 0 is always false
@@ -1775,17 +1782,23 @@
 MAKE_INT_SCALAR_FORMAT (uint64_t)
 
 void
-octave_print_internal (std::ostream&, char, bool)
+octave_print_internal (std::ostream& os, const float_display_format& fmt,
+                       bool d, bool pr_as_read_syntax)
 {
-  panic_impossible ();
+  octave_print_internal (os, fmt, octave_uint8 (d), pr_as_read_syntax);
 }
 
 void
-octave_print_internal (std::ostream& os, double d,
-                       bool pr_as_read_syntax)
+octave_print_internal (std::ostream& os, bool d, bool pr_as_read_syntax)
 {
-  set_format (d);
-  octave_print_internal (os, curr_float_display_fmt, d, pr_as_read_syntax);
+  octave_print_internal (os, octave_uint8 (d), pr_as_read_syntax);
+}
+
+void
+octave_print_internal (std::ostream&, const float_display_format&,
+                       char, bool)
+{
+  panic_impossible ();
 }
 
 void
@@ -2202,14 +2215,6 @@
     os << 'c';
 }
 
-void
-octave_print_internal (std::ostream& os, const Complex& c,
-                       bool pr_as_read_syntax)
-{
-  set_format (c);
-  octave_print_internal (os, curr_float_display_fmt, c, pr_as_read_syntax);
-}
-
 extern void
 octave_print_internal (std::ostream& os, const float_display_format& fmt,
                        const Complex& c, bool pr_as_read_syntax)
@@ -2666,21 +2671,9 @@
     }
 }
 
-void
-octave_print_internal (std::ostream& os, bool d, bool pr_as_read_syntax)
-{
-  octave_print_internal (os, octave_uint8 (d), pr_as_read_syntax);
-}
-
 // FIXME: write single precision versions of the printing functions.
 
 void
-octave_print_internal (std::ostream& os, float d, bool pr_as_read_syntax)
-{
-  octave_print_internal (os, double (d), pr_as_read_syntax);
-}
-
-void
 octave_print_internal (std::ostream& os, const FloatMatrix& m,
                        bool pr_as_read_syntax, int extra_indent)
 {
@@ -2702,13 +2695,6 @@
 }
 
 void
-octave_print_internal (std::ostream& os, const FloatComplex& c,
-                       bool pr_as_read_syntax)
-{
-  octave_print_internal (os, Complex (c), pr_as_read_syntax);
-}
-
-void
 octave_print_internal (std::ostream& os, const FloatComplexMatrix& cm,
                        bool pr_as_read_syntax, int extra_indent)
 {
--- a/libinterp/corefcn/pr-output.h	Wed Feb 14 16:08:12 2018 -0800
+++ b/libinterp/corefcn/pr-output.h	Wed Feb 14 23:28:40 2018 -0500
@@ -56,47 +56,177 @@
 
 template <typename T> class intNDArray;
 
+extern float_display_format
+make_format (double d, int& fw);
+
+extern float_display_format
+make_format (const Matrix& m, int& fw, double& scale);
+
+extern float_display_format
+make_format (const Complex& c, int& r_fw, int& i_fw);
+
+extern float_display_format
+make_format (const ComplexMatrix& cm, int& r_fw, int& i_fw, double& scale);
+
+extern float_display_format
+make_format (const Range& r, int& fw, double& scale);
+
+template <typename MT>
+float_display_format
+make_format (const MT&)
+{
+  return float_display_format ();
+}
+
+template <>
+float_display_format
+make_format (const Range& r);
+
+template <>
+float_display_format
+make_format (const NDArray& nda);
+
+template <>
+float_display_format
+make_format (const FloatNDArray& nda);
+
+template <>
+float_display_format
+make_format (const ComplexNDArray& nda);
+
+template <>
+float_display_format
+make_format (const FloatComplexNDArray& nda);
+
+template <>
+float_display_format
+make_format (const boolNDArray& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_int8>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_int16>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_int32>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_int64>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_uint8>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_uint16>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_uint32>& nda);
+
+template <>
+float_display_format
+make_format (const intNDArray<octave_uint64>& nda);
+
+template <>
+float_display_format
+make_format (const double& d);
+
+template <>
+float_display_format
+make_format (const float& f);
+
+template <>
+float_display_format
+make_format (const Complex& c);
+
+template <>
+float_display_format
+make_format (const FloatComplex& c);
+
+template <>
+float_display_format
+make_format (const octave_int8& nda);
+
+template <>
+float_display_format
+make_format (const octave_int16& nda);
+
+template <>
+float_display_format
+make_format (const octave_int32& nda);
+
+template <>
+float_display_format
+make_format (const octave_int64& nda);
+
+template <>
+float_display_format
+make_format (const octave_uint8& nda);
+
+template <>
+float_display_format
+make_format (const octave_uint16& nda);
+
+template <>
+float_display_format
+make_format (const octave_uint32& nda);
+
+template <>
+float_display_format
+make_format (const octave_uint64& nda);
+
 // FIXME: templates plus specializations might help here.
 
 extern OCTINTERP_API void
+octave_print_internal (std::ostream& os, const float_display_format& fmt,
+                       bool d, bool pr_as_read_syntax = false);
+
+extern OCTINTERP_API void
 octave_print_internal (std::ostream& os, bool d,
                        bool pr_as_read_syntax = false);
 
-inline void
-octave_print_internal (std::ostream& os, const float_display_format&,
-                       bool d, bool pr_as_read_syntax = false)
-{
-  octave_print_internal (os, d, pr_as_read_syntax);
-}
-
 extern OCTINTERP_API void
-octave_print_internal (std::ostream& os, char c,
-                       bool pr_as_read_syntax = false);
+octave_print_internal (std::ostream& os, const float_display_format& fmt,
+                       char c, bool pr_as_read_syntax = false);
 
 inline void
-octave_print_internal (std::ostream& os, const float_display_format&,
-                       char c, bool pr_as_read_syntax = false)
+octave_print_internal (std::ostream& os, char c,
+                       bool pr_as_read_syntax = false)
 {
+  float_display_format fmt (float_format (0, 0));
   octave_print_internal (os, c, pr_as_read_syntax);
 }
 
 extern OCTINTERP_API void
-octave_print_internal (std::ostream& os, double d,
-                       bool pr_as_read_syntax = false);
-
-extern void
 octave_print_internal (std::ostream& os, const float_display_format& fmt,
                        double d, bool pr_as_read_syntax = false);
 
-extern OCTINTERP_API void
-octave_print_internal (std::ostream& os, float d,
-                       bool pr_as_read_syntax = false);
+inline void
+octave_print_internal (std::ostream& os, double d,
+                       bool pr_as_read_syntax = false)
+{
+  octave_print_internal (os, make_format (d), d, pr_as_read_syntax);
+}
 
 inline void
-octave_print_internal (std::ostream& os, const float_display_format&,
+octave_print_internal (std::ostream& os, const float_display_format& fmt,
                        float d, bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, d, pr_as_read_syntax);
+  octave_print_internal (os, fmt, double (d), pr_as_read_syntax);
+}
+
+inline void
+octave_print_internal (std::ostream& os, float d,
+                       bool pr_as_read_syntax = false)
+{
+  octave_print_internal (os, double (d), pr_as_read_syntax);
 }
 
 extern OCTINTERP_API void
@@ -130,22 +260,28 @@
                        int extra_indent = 0);
 
 extern OCTINTERP_API void
-octave_print_internal (std::ostream& os, const Complex& c,
-                       bool pr_as_read_syntax = false);
-
-extern void
 octave_print_internal (std::ostream& os, const float_display_format& fmt,
                        const Complex& c, bool pr_as_read_syntax = false);
 
-extern OCTINTERP_API void
-octave_print_internal (std::ostream& os, const FloatComplex& c,
-                       bool pr_as_read_syntax = false);
+inline void
+octave_print_internal (std::ostream& os, const Complex& c,
+                       bool pr_as_read_syntax = false)
+{
+  octave_print_internal (os, make_format (c), c, pr_as_read_syntax);
+}
 
 inline void
-octave_print_internal (std::ostream& os, const float_display_format&,
+octave_print_internal (std::ostream& os, const float_display_format& fmt,
                        const FloatComplex& c, bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, c, pr_as_read_syntax);
+  octave_print_internal (os, fmt, Complex (c), pr_as_read_syntax);
+}
+
+inline void
+octave_print_internal (std::ostream& os, const FloatComplex& c,
+                       bool pr_as_read_syntax = false)
+{
+  octave_print_internal (os, Complex (c), pr_as_read_syntax);
 }
 
 extern OCTINTERP_API void
@@ -264,11 +400,13 @@
 octave_print_internal (std::ostream& os, const float_display_format&,
                        const octave_int<int8_t>& sa,
                        bool pr_as_read_syntax = false);
+
 inline OCTINTERP_API void
 octave_print_internal (std::ostream& os, const octave_int<int8_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -280,7 +418,8 @@
 octave_print_internal (std::ostream& os, const octave_int<uint8_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -292,7 +431,8 @@
 octave_print_internal (std::ostream& os, const octave_int<int16_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -304,7 +444,8 @@
 octave_print_internal (std::ostream& os, const octave_int<uint16_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -316,7 +457,8 @@
 octave_print_internal (std::ostream& os, const octave_int<int32_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -328,7 +470,8 @@
 octave_print_internal (std::ostream& os, const octave_int<uint32_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -340,7 +483,8 @@
 octave_print_internal (std::ostream& os, const octave_int<int64_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern void
@@ -352,7 +496,8 @@
 octave_print_internal (std::ostream& os, const octave_int<uint64_t>& sa,
                        bool pr_as_read_syntax = false)
 {
-  octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax);
+  float_display_format fmt (float_format (0, 0));
+  octave_print_internal (os, fmt, sa, pr_as_read_syntax);
 }
 
 extern OCTINTERP_API void
@@ -374,128 +519,6 @@
 octave_print_internal (std::ostream& os, const octave_value& ov,
                        bool pr_as_read_syntax = false);
 
-extern float_display_format
-make_format (double d, int& fw);
-
-extern float_display_format
-make_format (const Matrix& m, int& fw, double& scale);
-
-extern float_display_format
-make_format (const Complex& c, int& r_fw, int& i_fw);
-
-extern float_display_format
-make_format (const ComplexMatrix& cm, int& r_fw, int& i_fw, double& scale);
-
-extern float_display_format
-make_format (const Range& r, int& fw, double& scale);
-
-template <typename MT>
-float_display_format
-make_format (const MT&)
-{
-  return float_display_format ();
-}
-
-template <>
-float_display_format
-make_format (const Range& r);
-
-template <>
-float_display_format
-make_format (const NDArray& nda);
-
-template <>
-float_display_format
-make_format (const FloatNDArray& nda);
-
-template <>
-float_display_format
-make_format (const ComplexNDArray& nda);
-
-template <>
-float_display_format
-make_format (const FloatComplexNDArray& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_int8>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_int16>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_int32>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_int64>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_uint8>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_uint16>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_uint32>& nda);
-
-template <>
-float_display_format
-make_format (const intNDArray<octave_uint64>& nda);
-
-template <>
-float_display_format
-make_format (const double& d);
-
-template <>
-float_display_format
-make_format (const float& f);
-
-template <>
-float_display_format
-make_format (const Complex& c);
-
-template <>
-float_display_format
-make_format (const FloatComplex& c);
-
-template <>
-float_display_format
-make_format (const octave_int8& nda);
-
-template <>
-float_display_format
-make_format (const octave_int16& nda);
-
-template <>
-float_display_format
-make_format (const octave_int32& nda);
-
-template <>
-float_display_format
-make_format (const octave_int64& nda);
-
-template <>
-float_display_format
-make_format (const octave_uint8& nda);
-
-template <>
-float_display_format
-make_format (const octave_uint16& nda);
-
-template <>
-float_display_format
-make_format (const octave_uint32& nda);
-
-template <>
-float_display_format
-make_format (const octave_uint64& nda);
-
 class
 pr_engineering_float
 {