Mercurial > octave
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 {