Mercurial > octave
changeset 24745:d2467914ce33
enable (or improve) display for more types in the variable editor
* pr-output.h, pr-output.cc (make_format): Provide versions for Range,
FloatNDArray, FloatComplexNDArray, intNDArray, double, float, Complex,
FloatComplex, and octave_int types. Use format when printing scalar
integer values.
* ov-base-diag.cc, ov-base-diag.h
(octave_base_diag<DMT, MT>::get_edit_display_format,
octave_base_diag<DMT, MT>::edit_display): Pass format to
octave_print_internal.
* ov-base-int.cc, ov-base-int.h
(octave_base_int_matrix<T>::edit_display,
octave_base_int_scalar<ST>::edit_display): New functions.
* ov-base-scalar.cc, ov-base-scalar.h
(octave_base_scalar<ST>::get_edit_display_format): New function.
(octave_base_scalar<ST>::edit_display): Pass format to
octave_print_internal.
* ov-base-sparse.cc, ov-base-sparse.h
(octave_base_sparse<MT>::get_edit_display_format,
octave_base_sparse<MT>::edit_display): New functions.
* ov-perm.cc, ov-perm.h (octave_perm_matrix::get_edit_display_format,
octave_perm_matrix::edit_display): Pass format to
octave_print_internal.
* ov-range.cc, ov-range.h (octave_range::get_edit_display_format,
octave_range::edit_display): New functions.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 13 Feb 2018 01:54:16 -0500 |
parents | c1820e83f309 |
children | 52ca22ba4474 |
files | libinterp/corefcn/pr-output.cc libinterp/corefcn/pr-output.h libinterp/octave-value/ov-base-diag.cc libinterp/octave-value/ov-base-diag.h libinterp/octave-value/ov-base-int.cc libinterp/octave-value/ov-base-int.h libinterp/octave-value/ov-base-scalar.cc libinterp/octave-value/ov-base-scalar.h libinterp/octave-value/ov-base-sparse.cc libinterp/octave-value/ov-base-sparse.h libinterp/octave-value/ov-perm.cc libinterp/octave-value/ov-perm.h libinterp/octave-value/ov-range.cc libinterp/octave-value/ov-range.h |
diffstat | 14 files changed, 408 insertions(+), 85 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/pr-output.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/corefcn/pr-output.cc Tue Feb 13 01:54:16 2018 -0500 @@ -1602,6 +1602,15 @@ template <> float_display_format +make_format (const Range& rng) +{ + int fw = 0; + double scale = 0; + return make_format (rng, fw, scale); +} + +template <> +float_display_format make_format (const NDArray& nda) { int fw = 0; @@ -1611,6 +1620,15 @@ template <> float_display_format +make_format (const FloatNDArray& nda) +{ + int fw = 0; + double scale = 0; + return make_format (FloatMatrix (nda), fw, scale); +} + +template <> +float_display_format make_format (const ComplexNDArray& nda) { int r_fw = 0; @@ -1619,6 +1637,107 @@ return make_format (ComplexMatrix (nda), r_fw, i_fw, scale); } +template <> +float_display_format +make_format (const FloatComplexNDArray& nda) +{ + int r_fw = 0; + int i_fw = 0; + double scale = 0; + return make_format (FloatComplexMatrix (nda), r_fw, i_fw, scale); +} + +#define MAKE_INT_MATRIX_FORMAT(TYPE) \ + template <> \ + float_display_format \ + make_format (const intNDArray<TYPE>& nda) \ + { \ + bool isneg = false; \ + int digits = 0; \ + \ + for (octave_idx_type i = 0; i < nda.numel (); i++) \ + { \ + int new_digits \ + = static_cast<int> \ + (std::floor (log10 (double (abs (nda(i).value ()))) + 1.0)); \ + \ + if (new_digits > digits) \ + digits = new_digits; \ + \ + if (! isneg) \ + isneg = (abs (nda(i).value ()) != nda(i).value ()); \ + } \ + \ + return float_display_format (float_format (digits + isneg, 0, 0)); \ + } + +MAKE_INT_MATRIX_FORMAT (octave_int8) +MAKE_INT_MATRIX_FORMAT (octave_uint8) +MAKE_INT_MATRIX_FORMAT (octave_int16) +MAKE_INT_MATRIX_FORMAT (octave_uint16) +MAKE_INT_MATRIX_FORMAT (octave_int32) +MAKE_INT_MATRIX_FORMAT (octave_uint32) +MAKE_INT_MATRIX_FORMAT (octave_int64) +MAKE_INT_MATRIX_FORMAT (octave_uint64) + +template <> +float_display_format +make_format (const double& d) +{ + int fw = 0; + return make_format (d, fw); +} + +template <> +float_display_format +make_format (const float& f) +{ + int fw = 0; + return make_format (f, fw); +} + +template <> +float_display_format +make_format (const Complex& c) +{ + int r_fw = 0; + int i_fw = 0; + return make_format (c, r_fw, i_fw); +} + +template <> +float_display_format +make_format (const FloatComplex& c) +{ + int r_fw = 0; + int i_fw = 0; + return make_format (c, r_fw, i_fw); +} + +#define MAKE_INT_SCALAR_FORMAT(TYPE) \ + template <> \ + float_display_format \ + make_format (const octave_int<TYPE>& val) \ + { \ + bool isneg = false; \ + int digits \ + = static_cast<int> \ + (std::floor (log10 (double (abs (val.value ()))) + 1.0)); \ + \ + isneg = (abs (val.value ()) != val.value ()); \ + \ + return float_display_format (float_format (digits + isneg, 0, 0)); \ + } + +MAKE_INT_SCALAR_FORMAT (int8_t) +MAKE_INT_SCALAR_FORMAT (uint8_t) +MAKE_INT_SCALAR_FORMAT (int16_t) +MAKE_INT_SCALAR_FORMAT (uint16_t) +MAKE_INT_SCALAR_FORMAT (int32_t) +MAKE_INT_SCALAR_FORMAT (uint32_t) +MAKE_INT_SCALAR_FORMAT (int64_t) +MAKE_INT_SCALAR_FORMAT (uint64_t) + void octave_print_internal (std::ostream&, char, bool) { @@ -3033,8 +3152,9 @@ template <typename T> void -octave_print_internal_template (std::ostream& os, const octave_int<T>& val, - bool) +octave_print_internal_template (std::ostream& os, + const float_display_format& fmt, + const octave_int<T>& val, bool) { if (plus_format) { @@ -3045,15 +3165,21 @@ if (free_format) os << typename octave_print_conv<octave_int<T>>::print_conv_type (val); else - pr_int (os, val); + { + float_format r_fmt = fmt.real_format (); + + pr_int (os, val, r_fmt.fw); + } } } #define PRINT_INT_SCALAR_INTERNAL(TYPE) \ OCTINTERP_API void \ - octave_print_internal (std::ostream& os, const octave_int<TYPE>& val, bool dummy) \ + octave_print_internal (std::ostream& os, \ + const float_display_format& fmt, \ + const octave_int<TYPE>& val, bool dummy) \ { \ - octave_print_internal_template (os, val, dummy); \ + octave_print_internal_template (os, fmt, val, dummy); \ } PRINT_INT_SCALAR_INTERNAL (int8_t) @@ -3076,7 +3202,8 @@ if (nda.isempty ()) print_empty_nd_array (os, nda.dims (), pr_as_read_syntax); else if (nda.numel () == 1) - octave_print_internal_template (os, nda(0), pr_as_read_syntax); + octave_print_internal_template (os, float_display_format (), nda(0), + pr_as_read_syntax); else if (plus_format && ! pr_as_read_syntax) { int ndims = nda.ndims ();
--- a/libinterp/corefcn/pr-output.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/corefcn/pr-output.h Tue Feb 13 01:54:16 2018 -0500 @@ -260,100 +260,99 @@ bool pr_as_read_syntax = false, int extra_indent = 0); -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<int8_t>& sa, - bool pr_as_read_syntax = false); - -inline void +extern void 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, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<uint8_t>& sa, +extern void +octave_print_internal (std::ostream& os, const float_display_format&, + const octave_int<uint8_t>& sa, bool pr_as_read_syntax = false); -inline void -octave_print_internal (std::ostream& os, const float_display_format&, - const octave_int<uint8_t>& sa, +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<uint8_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<int16_t>& sa, - bool pr_as_read_syntax = false); - -inline void +extern void octave_print_internal (std::ostream& os, const float_display_format&, const octave_int<int16_t>& sa, + bool pr_as_read_syntax = false); + +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<int16_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<uint16_t>& sa, +extern void +octave_print_internal (std::ostream& os, const float_display_format&, + const octave_int<uint16_t>& sa, bool pr_as_read_syntax = false); -inline void -octave_print_internal (std::ostream& os, const float_display_format&, - const octave_int<uint16_t>& sa, +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<uint16_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<int32_t>& sa, - bool pr_as_read_syntax = false); - -inline void +extern void octave_print_internal (std::ostream& os, const float_display_format&, const octave_int<int32_t>& sa, + bool pr_as_read_syntax = false); + +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<int32_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<uint32_t>& sa, +extern void +octave_print_internal (std::ostream& os, const float_display_format&, + const octave_int<uint32_t>& sa, bool pr_as_read_syntax = false); -inline void -octave_print_internal (std::ostream& os, const float_display_format&, - const octave_int<uint32_t>& sa, +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<uint32_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<int64_t>& sa, +extern void +octave_print_internal (std::ostream& os, const float_display_format&, + const octave_int<int64_t>& sa, bool pr_as_read_syntax = false); -inline void -octave_print_internal (std::ostream& os, const float_display_format&, - const octave_int<int64_t>& sa, +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<int64_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } -extern OCTINTERP_API void -octave_print_internal (std::ostream& os, const octave_int<uint64_t>& sa, +extern void +octave_print_internal (std::ostream& os, const float_display_format&, + const octave_int<uint64_t>& sa, bool pr_as_read_syntax = false); -inline void -octave_print_internal (std::ostream& os, const float_display_format&, - const octave_int<uint64_t>& sa, +inline OCTINTERP_API void +octave_print_internal (std::ostream& os, const octave_int<uint64_t>& sa, bool pr_as_read_syntax = false) { - octave_print_internal (os, sa, pr_as_read_syntax); + octave_print_internal (os, float_display_format (), sa, pr_as_read_syntax); } extern OCTINTERP_API void @@ -397,6 +396,106 @@ 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 {
--- a/libinterp/octave-value/ov-base-diag.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-diag.cc Tue Feb 13 01:54:16 2018 -0500 @@ -466,6 +466,25 @@ } template <typename DMT, typename MT> +float_display_format +octave_base_diag<DMT, MT>::get_edit_display_format (void) const +{ + // FIXME + return float_display_format (); +} + +template <typename DMT, typename MT> +std::string +octave_base_diag<DMT, MT>::edit_display (const float_display_format& fmt, + octave_idx_type i, + octave_idx_type j) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, matrix(i,j)); + return buf.str (); +} + +template <typename DMT, typename MT> bool octave_base_diag<DMT, MT>::save_ascii (std::ostream& os) { @@ -614,17 +633,6 @@ } template <typename DMT, typename MT> -std::string -octave_base_diag<DMT, MT>::edit_display (const float_display_format&, - octave_idx_type i, - octave_idx_type j) const -{ - std::ostringstream buf; - octave_print_internal (buf, matrix(i,j)); - return buf.str (); -} - -template <typename DMT, typename MT> octave_value octave_base_diag<DMT, MT>::fast_elem_extract (octave_idx_type n) const {
--- a/libinterp/octave-value/ov-base-diag.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-diag.h Tue Feb 13 01:54:16 2018 -0500 @@ -198,6 +198,11 @@ void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; + float_display_format get_edit_display_format (void) const; + + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + bool save_ascii (std::ostream& os); bool load_ascii (std::istream& is); @@ -216,9 +221,6 @@ void short_disp (std::ostream& os) const; - std::string edit_display (const float_display_format& fmt, - octave_idx_type i, octave_idx_type j) const; - octave_value fast_elem_extract (octave_idx_type n) const; protected:
--- a/libinterp/octave-value/ov-base-int.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-int.cc Tue Feb 13 01:54:16 2018 -0500 @@ -265,6 +265,17 @@ } template <typename T> +std::string +octave_base_int_matrix<T>::edit_display (const float_display_format& fmt, + octave_idx_type i, + octave_idx_type j) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, this->matrix(i,j)); + return buf.str (); +} + +template <typename T> bool octave_base_int_matrix<T>::save_ascii (std::ostream& os) { @@ -646,6 +657,17 @@ return octave_uint64 (this->scalar); } +template <typename ST> +std::string +octave_base_int_scalar<ST>::edit_display (const float_display_format& fmt, + octave_idx_type, + octave_idx_type) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, this->scalar); + return buf.str (); +} + template <typename T> bool octave_base_int_scalar<T>::save_ascii (std::ostream& os)
--- a/libinterp/octave-value/ov-base-int.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-int.h Tue Feb 13 01:54:16 2018 -0500 @@ -84,6 +84,9 @@ octave_value as_uint32 (void) const; octave_value as_uint64 (void) const; + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + bool save_ascii (std::ostream& os); bool load_ascii (std::istream& is); @@ -146,6 +149,9 @@ octave_value as_uint32 (void) const; octave_value as_uint64 (void) const; + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + bool save_ascii (std::ostream& os); bool load_ascii (std::istream& is);
--- a/libinterp/octave-value/ov-base-scalar.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-scalar.cc Tue Feb 13 01:54:16 2018 -0500 @@ -189,12 +189,19 @@ } template <typename ST> +float_display_format +octave_base_scalar<ST>::get_edit_display_format (void) const +{ + return make_format (scalar); +} + +template <typename ST> std::string -octave_base_scalar<ST>::edit_display (const float_display_format&, +octave_base_scalar<ST>::edit_display (const float_display_format& fmt, octave_idx_type, octave_idx_type) const { std::ostringstream buf; - octave_print_internal (buf, scalar); + octave_print_internal (buf, fmt, scalar); return buf.str (); }
--- a/libinterp/octave-value/ov-base-scalar.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-scalar.h Tue Feb 13 01:54:16 2018 -0500 @@ -138,6 +138,8 @@ void short_disp (std::ostream& os) const; + float_display_format get_edit_display_format (void) const; + std::string edit_display (const float_display_format& fmt, octave_idx_type i, octave_idx_type j) const;
--- a/libinterp/octave-value/ov-base-sparse.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-sparse.cc Tue Feb 13 01:54:16 2018 -0500 @@ -427,6 +427,25 @@ } } +template <typename MT> +float_display_format +octave_base_sparse<MT>::get_edit_display_format (void) const +{ + return float_display_format (); + // return make_format (this->matrix); +} + +template <typename MT> +std::string +octave_base_sparse<MT>::edit_display (const float_display_format& fmt, + octave_idx_type i, + octave_idx_type j) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, this->matrix(i,j)); + return buf.str (); +} + template <typename T> bool octave_base_sparse<T>::save_ascii (std::ostream& os)
--- a/libinterp/octave-value/ov-base-sparse.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-base-sparse.h Tue Feb 13 01:54:16 2018 -0500 @@ -165,6 +165,11 @@ bool load_ascii (std::istream& is); + float_display_format get_edit_display_format (void) const; + + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + // Unsafe. These functions exists to support the MEX interface. // You should not use them anywhere else. void * mex_get_data (void) const { return matrix.mex_get_data (); }
--- a/libinterp/octave-value/ov-perm.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-perm.cc Tue Feb 13 01:54:16 2018 -0500 @@ -310,6 +310,22 @@ return uint64_array_value (); } +float_display_format +octave_perm_matrix::get_edit_display_format (void) const +{ + return float_display_format (float_format (1, 0, 0)); +} + +std::string +octave_perm_matrix::edit_display (const float_display_format& fmt, + octave_idx_type i, + octave_idx_type j) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, octave_int<octave_idx_type> (matrix(i,j))); + return buf.str (); +} + bool octave_perm_matrix::save_ascii (std::ostream& os) { @@ -543,18 +559,6 @@ return retval; } -std::string -octave_perm_matrix::edit_display (const float_display_format&, - octave_idx_type i, octave_idx_type j) const -{ - // FIXME: maybe we should have octave_print_internal functions for - // standard int types, not just octave_int<T> types. - - std::ostringstream buf; - octave_print_internal (buf, octave_int<octave_idx_type> (matrix(i,j))); - return buf.str (); -} - octave_value octave_perm_matrix::fast_elem_extract (octave_idx_type n) const {
--- a/libinterp/octave-value/ov-perm.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-perm.h Tue Feb 13 01:54:16 2018 -0500 @@ -209,6 +209,11 @@ void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; + float_display_format get_edit_display_format (void) const; + + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + bool save_ascii (std::ostream& os); bool load_ascii (std::istream& is); @@ -232,9 +237,6 @@ void short_disp (std::ostream& os) const; - std::string edit_display (const float_display_format& fmt, - octave_idx_type i, octave_idx_type j) const; - octave_value map (unary_mapper_t umap) const { return to_dense ().map (umap); }
--- a/libinterp/octave-value/ov-range.cc Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-range.cc Tue Feb 13 01:54:16 2018 -0500 @@ -501,6 +501,21 @@ skip_until_newline (is, false); } +float_display_format +octave_range::get_edit_display_format (void) const +{ + return make_format (range_value ()); +} + +std::string +octave_range::edit_display (const float_display_format& fmt, + octave_idx_type, octave_idx_type j) const +{ + std::ostringstream buf; + octave_print_internal (buf, fmt, range.elem (j)); + return buf.str (); +} + bool octave_range::save_ascii (std::ostream& os) {
--- a/libinterp/octave-value/ov-range.h Mon Feb 12 16:03:18 2018 -0800 +++ b/libinterp/octave-value/ov-range.h Tue Feb 13 01:54:16 2018 -0500 @@ -268,6 +268,11 @@ void short_disp (std::ostream& os) const; + float_display_format get_edit_display_format (void) const; + + std::string edit_display (const float_display_format& fmt, + octave_idx_type i, octave_idx_type j) const; + bool save_ascii (std::ostream& os); bool load_ascii (std::istream& is);