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);