diff libinterp/octave-value/ov-classdef.cc @ 18416:bcd71a2531d3

Support disp/display overloading in classdef * ov-classdef.h (octave_classdef::print, octave_classdef::print_raw): Move definition to C++ file. (octave_classdef::print_as_scalar): Removed method. (octave_classdef::print_name_tag, octave_classdef::print_with_name): New methods. * ov-classdef.cc (octave_classdef::print): Moved from header. (octave_classdef::print_raw): Likewise. Call overloaded disp, if defined and not called from builtin. (octave_classdef::print_name_tag): New method. (octave_classdef::print_with_name): New method, calls overloaded "display" if defined. * pr-output.cc (octave_print_internal(std::ostream, bool): Avoid compilation warning. (Frats, Fdisp, Ffdisp): Allow to call non-const octave_value::print. * ov.h (octave_value::print): Make non-const. * ov-base.h (octave_base_value::print): Likewise. * ov-base.cc (octave_base_value::print): Likewise. * ov-base-diag.h (octave_base_diag::print): Likewise. * ov-base-diag.cc (octave_base_diag::print): Likewise. * ov-base-mat.h (octave_base_matrix::print): Likewise. * ov-base-mat.cc (octave_base_matrix::print): Likewise. * ov-base-scalar.h (octave_base_scalar::print): Likewise. * ov-base-scalar.cc (octave_base_scalar::print): Likewise. * ov-base-sparse.h (octave_base_sparse::print): Likewise. * ov-base-sparse.cc (octave_base_sparse::print): Likewise. * ov-cell.h (octave_cell::print): Likewise. * ov-cell.cc (octave_cell::print): Likewise. * ov-class.h (octave_class::print): Likewise. * ov-class.cc (octave_class::print): Likewise. * ov-colon.h (octave_magic_colon::print): Likewise. * ov-colon.cc (octave_magic_colon::print): Likewise. * ov-fcn-handle.h (octave_fcn_handle::print): Likewise. * ov-fcn-handle.cc (octave_fcn_handle::print): Likewise. * ov-fcn-inline.h (octave_fcn_inline::print): Likewise. * ov-fcn-inline.cc (octave_fcn_inline::print): Likewise. * ov-java.h (octave_java::print): Likewise. * ov-java.cc (octave_java::print): Likewise. * ov-lazy-idx.h (octave_lazy_index::print): Likewise. * ov-oncleanup.h (octave_oncleanup::print): Likewise. * ov-oncleanup.cc (octave_oncleanup::print): Likewise. * ov-perm.h (octave_perm_matrix::print): Likewise. * ov-perm.cc (octave_perm_matrix::print): Likewise. * ov-range.h (octave_range::print): Likewise. * ov-range.cc (octave_range::print): Likewise. * ov-struct.h (octave_struct::print, octave_scalar_struct): Likewise. * ov-struct.cc (octave_struct::print, octave_scalar_struct): Likewise.
author Michael Goffioul <michael.goffioul@gmail.com>
date Fri, 31 Jan 2014 11:41:19 -0500
parents 642fc1165f3f
children d5aa615dcf4c
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc	Thu Jan 30 17:56:43 2014 -0800
+++ b/libinterp/octave-value/ov-classdef.cc	Fri Jan 31 11:41:19 2014 -0500
@@ -1018,6 +1018,73 @@
   return octave_value ();
 }
 
+void
+octave_classdef::print (std::ostream& os, bool)
+{
+  if (! called_from_builtin ())
+    {
+      cdef_method meth = object.get_class ().find_method ("disp");
+
+      if (meth.ok ())
+        {
+          octave_value_list args;
+
+          count++;
+          args(0) = octave_value (this);
+
+          indent (os);
+          meth.execute (args, 0, true, "disp");
+
+          return;
+        }
+    }
+
+  print_raw (os);
+}
+
+void
+octave_classdef::print_raw (std::ostream& os, bool) const
+{
+  indent (os);
+  os << "<object ";
+  if (object.is_array ())
+    os << "array ";
+  os << class_name () << ">";
+  newline (os);
+}
+
+bool
+octave_classdef::print_name_tag (std::ostream& os,
+                                 const std::string& name) const
+{
+  return octave_base_value::print_name_tag (os, name);
+}
+
+void
+octave_classdef::print_with_name (std::ostream& os, const std::string& name,
+                                  bool print_padding)
+{
+  cdef_method meth = object.get_class ().find_method ("display");
+
+  if (meth.ok ())
+    {
+      octave_value_list args;
+
+      count++;
+      args(0) = octave_value (this);
+
+      string_vector arg_names (1);
+
+      arg_names[0] = name;
+      args.stash_name_tags (arg_names);
+
+      indent (os);
+      meth.execute (args, 0, true, "display");
+    }
+  else
+    octave_base_value::print_with_name (os, name, print_padding);
+}
+
 //----------------------------------------------------------------------------
 
 class octave_classdef_meta : public octave_function