diff src/ov-base.h @ 5759:ce79d238f142

[project @ 2006-04-13 13:04:32 by jwe]
author jwe
date Thu, 13 Apr 2006 13:04:33 +0000
parents c7d5a534afa5
children faafc2d98b8d
line wrap: on
line diff
--- a/src/ov-base.h	Wed Apr 12 19:23:26 2006 +0000
+++ b/src/ov-base.h	Thu Apr 13 13:04:33 2006 +0000
@@ -27,305 +27,430 @@
 #include <cstdlib>
 
 #include <iostream>
+#include <list>
 #include <string>
 
+#if defined (HAVE_HDF5)
+#include <hdf5.h>
+#endif
+
+#include "Range.h"
 #include "mx-base.h"
 #include "str-vec.h"
 
 #include "error.h"
-#include "ov.h"
-#include "ov-typeinfo.h"
 
 class Cell;
+class streamoff_array;
 class Octave_map;
+class octave_value;
 class octave_value_list;
+class octave_stream;
+class octave_streamoff;
+class octave_function;
+class octave_user_function;
+class octave_fcn_handle;
+class octave_fcn_inline;
+class octave_value_list;
+class octave_lvalue;
 
 class tree_walker;
 
+// T_ID is the type id of struct objects, set by register_type().
+// T_NAME is the type name of struct objects.
+#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA \
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2()
+
+#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA \
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2(virtual)
+
+#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2(VIRTUAL) \
+  public: \
+    VIRTUAL int type_id (void) const { return t_id; } \
+    VIRTUAL std::string type_name (void) const { return t_name; } \
+    VIRTUAL std::string class_name (void) const { return c_name; } \
+    static int static_type_id (void) { return t_id; } \
+    static std::string static_type_name (void) { return t_name; } \
+    static std::string static_class_name (void) { return c_name; } \
+    static void register_type (void); \
+ \
+  private: \
+    static int t_id; \
+    static const std::string t_name; \
+    static const std::string c_name;
+
+
+#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c) \
+  int t::t_id (-1); \
+  const std::string t::t_name (n); \
+  const std::string t::c_name (c); \
+  void t::register_type (void) \
+    { \
+      t_id = octave_value_typeinfo::register_type (t::t_name, \
+						   t::c_name, \
+						   octave_value (new t ())); \
+    }
+
+// Should we print a warning when converting `[97, 98, 99, "123"]'
+// to a character string?
+extern bool Vwarn_num_to_str;
+
+// If TRUE, print a warning when a matrix is resized by an indexed
+// assignment with indices outside the current bounds.
+extern bool Vwarn_resize_on_range_error;
+
 // A base value type, so that derived types only have to redefine what
 // they need (if they are derived from octave_base_value instead of
 // octave_value).
 
 class
-octave_base_value : public octave_value
+octave_base_value
 {
 public:
 
-  octave_base_value (void)
-    : octave_value (octave_xvalue ()) { }
+  typedef octave_base_value * (*type_conv_fcn) (const octave_base_value&);
+
+  friend class octave_value;
 
-  octave_base_value (const octave_base_value&)
-    : octave_value (octave_xvalue ()) { }
+  octave_base_value (void) : count (1) { }
+
+  octave_base_value (const octave_base_value&) { }
 
-  ~octave_base_value (void) { }
+  virtual ~octave_base_value (void) { }
+
+  virtual octave_base_value *
+  clone (void) const { return new octave_base_value (*this); }
 
-  octave_value *clone (void) const { return new octave_base_value (*this); }
-  octave_value *empty_clone (void) const { return new octave_base_value (); }
+  virtual octave_base_value *
+  empty_clone (void) const { return new octave_base_value (); }
 
-  type_conv_fcn numeric_conversion_function (void) const
+  virtual type_conv_fcn
+  numeric_conversion_function (void) const
     { return static_cast<type_conv_fcn> (0); }
 
-  octave_value squeeze (void) const;
+  virtual octave_value squeeze (void) const;
+
+  virtual octave_base_value *try_narrowing_conversion (void) { return 0; }
 
-  octave_value *try_narrowing_conversion (void)
-    { return static_cast<octave_value *> (0); }
-
-  octave_value subsref (const std::string& type,
-			const std::list<octave_value_list>& idx);
+  virtual octave_value
+  subsref (const std::string& type,
+	   const std::list<octave_value_list>& idx);
 
-  octave_value_list subsref (const std::string& type,
-			     const std::list<octave_value_list>& idx,
-			     int nargout);
+  virtual octave_value_list
+  subsref (const std::string& type,
+	   const std::list<octave_value_list>& idx,
+	   int nargout);
 
-  octave_value do_index_op (const octave_value_list& idx, int resize_ok);
+  virtual octave_value
+  do_index_op (const octave_value_list& idx, int resize_ok);
 
-  octave_value do_index_op (const octave_value_list& idx)
-    { return do_index_op (idx, 0); }
+  virtual octave_value
+  do_index_op (const octave_value_list& idx);
 
-  octave_value_list
+  virtual octave_value_list
   do_multi_index_op (int nargout, const octave_value_list& idx);
 
-  idx_vector index_vector (void) const;
+  virtual octave_value
+  subsasgn (const std::string& type,
+	    const std::list<octave_value_list>& idx,
+	    const octave_value& rhs);
 
-  octave_value subsasgn (const std::string& type,
-			 const std::list<octave_value_list>& idx,
-			 const octave_value& rhs);
+  virtual idx_vector index_vector (void) const;
 
-  dim_vector dims (void) const { return dim_vector (-1, -1); }
+  virtual dim_vector dims (void) const { return dim_vector (-1, -1); }
 
-  octave_idx_type numel (void) const { return dims ().numel (); }
-
-  octave_idx_type capacity (void) const { return numel (); }
+  octave_idx_type rows (void) const
+    {
+      dim_vector dv = dims ();
 
-  size_t byte_size (void) const { return 0; }
+      return (dv.length () > 0) ? dv(0) : -1;
+    }
 
-  octave_idx_type nnz (void) const;
+  octave_idx_type columns (void) const
+    {
+      dim_vector dv = dims ();
 
-  octave_idx_type nzmax (void) const;
+      return (dv.length () > 1) ? dv(1) : -1;
+    }
 
-  octave_value reshape (const dim_vector&) const;
+  virtual int ndims (void) const;
 
-  octave_value permute (const Array<int>& vec, bool = false) const;
+  virtual octave_idx_type numel (void) const { return dims ().numel (); }
 
-  octave_value resize (const dim_vector&, bool fill = false) const;
+  virtual octave_idx_type capacity (void) const { return numel (); }
+
+  virtual size_t byte_size (void) const { return 0; }
 
-  bool is_defined (void) const { return false; }
+  virtual octave_idx_type nnz (void) const;
 
-  bool is_cell (void) const { return false; }
+  virtual octave_idx_type nzmax (void) const;
+
+  virtual octave_value reshape (const dim_vector&) const;
 
-  bool is_real_scalar (void) const { return false; }
+  virtual octave_value permute (const Array<int>& vec, bool = false) const;
 
-  bool is_real_matrix (void) const { return false; }
+  virtual octave_value resize (const dim_vector&, bool fill = false) const;
 
-  bool is_real_nd_array (void) const { return false; }
+  virtual bool is_defined (void) const { return false; }
 
-  bool is_complex_scalar (void) const { return false; }
+  bool is_empty (void) const { return numel () == 0; }
 
-  bool is_complex_matrix (void) const { return false; }
+  virtual bool is_cell (void) const { return false; }
 
-  bool is_bool_matrix (void) const { return false; }
+  virtual bool is_real_scalar (void) const { return false; }
 
-  bool is_char_matrix (void) const { return false; }
+  virtual bool is_real_matrix (void) const { return false; }
+
+  virtual bool is_real_nd_array (void) const { return false; }
 
-  bool is_string (void) const { return false; }
+  virtual bool is_complex_scalar (void) const { return false; }
 
-  bool is_sq_string (void) const { return false; }
+  virtual bool is_complex_matrix (void) const { return false; }
+
+  virtual bool is_bool_matrix (void) const { return false; }
 
-  bool is_range (void) const { return false; }
+  virtual bool is_char_matrix (void) const { return false; }
 
-  bool is_map (void) const { return false; }
+  virtual bool is_string (void) const { return false; }
 
-  bool is_streamoff (void) const { return false; }
+  virtual bool is_sq_string (void) const { return false; }
 
-  bool is_cs_list (void) const { return false; }
+  virtual bool is_range (void) const { return false; }
 
-  bool is_list (void) const { return false; }
+  virtual bool is_map (void) const { return false; }
+
+  virtual bool is_streamoff (void) const { return false; }
 
-  bool is_magic_colon (void) const { return false; }
+  virtual bool is_cs_list (void) const { return false; }
 
-  bool is_all_va_args (void) const { return false; }
+  virtual bool is_list (void) const { return false; }
+
+  virtual bool is_magic_colon (void) const { return false; }
 
-  octave_value all (int = 0) const { return 0.0; }
+  virtual bool is_all_va_args (void) const { return false; }
 
-  octave_value any (int = 0) const { return 0.0; }
+  virtual octave_value all (int = 0) const;
+
+  virtual octave_value any (int = 0) const;
 
-  bool is_bool_type (void) const { return false; }
+  virtual bool is_bool_type (void) const { return false; }
 
-  bool is_real_type (void) const { return false; }
+  virtual bool is_real_type (void) const { return false; }
 
-  bool is_complex_type (void) const { return false; }
+  virtual bool is_complex_type (void) const { return false; }
 
   // Would be nice to get rid of the next four functions:
 
-  bool is_scalar_type (void) const { return false; }
+  virtual bool is_scalar_type (void) const { return false; }
 
-  bool is_matrix_type (void) const { return false; }
+  virtual bool is_matrix_type (void) const { return false; }
 
-  bool is_numeric_type (void) const { return false; }
+  virtual bool is_numeric_type (void) const { return false; }
 
-  bool is_sparse_type (void) const { return false; }
+  virtual bool is_sparse_type (void) const { return false; }
 
-  bool valid_as_scalar_index (void) const { return false; }
+  virtual bool valid_as_scalar_index (void) const { return false; }
 
-  bool valid_as_zero_index (void) const { return false; }
+  virtual bool valid_as_zero_index (void) const { return false; }
 
-  bool is_true (void) const { return false; }
+  virtual bool is_true (void) const { return false; }
+
+  virtual bool is_constant (void) const { return false; }
 
-  bool is_zero_by_zero (void) const
-    { return (rows () == 0 && columns () == 0); }
+  virtual bool is_function_handle (void) const { return false; }
 
-  bool is_constant (void) const { return false; }
+  virtual bool is_inline_function (void) const { return false; }
 
-  bool is_function_handle (void) const { return false; }
-
-  bool is_inline_function (void) const { return false; }
+  virtual bool is_function (void) const { return false; }
 
-  bool is_function (void) const { return false; }
+  virtual bool is_builtin_function (void) const { return false; }
 
-  bool is_builtin_function (void) const { return false; }
-
-  bool is_dld_function (void) const { return false; }
+  virtual bool is_dld_function (void) const { return false; }
 
-  short int short_value (bool = false, bool = false) const;
+  virtual short int short_value (bool = false, bool = false) const;
 
-  unsigned short int ushort_value (bool = false, bool = false) const;
+  virtual unsigned short int ushort_value (bool = false, bool = false) const;
 
-  int int_value (bool = false, bool = false) const;
+  virtual int int_value (bool = false, bool = false) const;
 
-  unsigned int uint_value (bool = false, bool = false) const;
+  virtual unsigned int uint_value (bool = false, bool = false) const;
 
-  int nint_value (bool = false) const;
+  virtual int nint_value (bool = false) const;
 
-  long int long_value (bool = false, bool = false) const;
+  virtual long int long_value (bool = false, bool = false) const;
 
-  unsigned long int ulong_value (bool = false, bool = false) const;
+  virtual unsigned long int ulong_value (bool = false, bool = false) const;
 
-  double double_value (bool = false) const;
+  virtual double double_value (bool = false) const;
 
-  double scalar_value (bool frc_str_conv = false) const
+  virtual double scalar_value (bool frc_str_conv = false) const
     { return double_value (frc_str_conv); }
 
-  Cell cell_value (void) const;
+  virtual Cell cell_value (void) const;
 
-  Matrix matrix_value (bool = false) const;
+  virtual Matrix matrix_value (bool = false) const;
 
-  NDArray array_value (bool = false) const;
+  virtual NDArray array_value (bool = false) const;
 
-  Complex complex_value (bool = false) const;
+  virtual Complex complex_value (bool = false) const;
 
-  ComplexMatrix complex_matrix_value (bool = false) const;
+  virtual ComplexMatrix complex_matrix_value (bool = false) const;
 
-  ComplexNDArray complex_array_value (bool = false) const;
+  virtual ComplexNDArray complex_array_value (bool = false) const;
 
-  bool bool_value (void) const;
+  virtual bool bool_value (void) const;
 
-  boolMatrix bool_matrix_value (void) const;
+  virtual boolMatrix bool_matrix_value (void) const;
 
-  boolNDArray bool_array_value (void) const;
+  virtual boolNDArray bool_array_value (void) const;
 
-  charMatrix char_matrix_value (bool force = false) const;
+  virtual charMatrix char_matrix_value (bool force = false) const;
+
+  virtual charNDArray char_array_value (bool = false) const;
 
-  charNDArray char_array_value (bool = false) const;
+  virtual SparseMatrix sparse_matrix_value (bool = false) const;
 
-  SparseMatrix sparse_matrix_value (bool = false) const;
+  virtual SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
 
-  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
+  virtual SparseBoolMatrix sparse_bool_matrix_value (bool = false) const;
 
-  SparseBoolMatrix sparse_bool_matrix_value (bool = false) const;
+  virtual octave_int8 int8_scalar_value (void) const;
 
-  octave_int8 int8_scalar_value (void) const;
+  virtual octave_int16 int16_scalar_value (void) const;
 
-  octave_int16 int16_scalar_value (void) const;
+  virtual octave_int32 int32_scalar_value (void) const;
+
+  virtual octave_int64 int64_scalar_value (void) const;
 
-  octave_int32 int32_scalar_value (void) const;
+  virtual octave_uint8 uint8_scalar_value (void) const;
 
-  octave_int64 int64_scalar_value (void) const;
+  virtual octave_uint16 uint16_scalar_value (void) const;
 
-  octave_uint8 uint8_scalar_value (void) const;
+  virtual octave_uint32 uint32_scalar_value (void) const;
 
-  octave_uint16 uint16_scalar_value (void) const;
+  virtual octave_uint64 uint64_scalar_value (void) const;
 
-  octave_uint32 uint32_scalar_value (void) const;
+  virtual int8NDArray int8_array_value (void) const;
 
-  octave_uint64 uint64_scalar_value (void) const;
+  virtual int16NDArray int16_array_value (void) const;
 
-  int8NDArray int8_array_value (void) const;
+  virtual int32NDArray int32_array_value (void) const;
 
-  int16NDArray int16_array_value (void) const;
+  virtual int64NDArray int64_array_value (void) const;
 
-  int32NDArray int32_array_value (void) const;
+  virtual uint8NDArray uint8_array_value (void) const;
 
-  int64NDArray int64_array_value (void) const;
+  virtual uint16NDArray uint16_array_value (void) const;
 
-  uint8NDArray uint8_array_value (void) const;
+  virtual uint32NDArray uint32_array_value (void) const;
 
-  uint16NDArray uint16_array_value (void) const;
+  virtual uint64NDArray uint64_array_value (void) const;
 
-  uint32NDArray uint32_array_value (void) const;
+  virtual string_vector all_strings (bool pad = false) const;
 
-  uint64NDArray uint64_array_value (void) const;
+  virtual std::string string_value (bool force = false) const;
 
-  string_vector all_strings (bool pad = false) const;
+  virtual Range range_value (void) const;
 
-  std::string string_value (bool force = false) const;
+  virtual Octave_map map_value (void) const;
 
-  Range range_value (void) const;
+  virtual string_vector map_keys (void) const;
 
-  Octave_map map_value (void) const;
+  virtual std::streamoff streamoff_value (void) const;
 
-  string_vector map_keys (void) const;
+  virtual streamoff_array streamoff_array_value (void) const;
+
+  virtual octave_function *function_value (bool silent = false);
 
-  std::streamoff streamoff_value (void) const;
+  virtual octave_user_function *user_function_value (bool silent = false);
 
-  streamoff_array streamoff_array_value (void) const;
+  virtual octave_fcn_handle *fcn_handle_value (bool silent = false);
 
-  octave_function *function_value (bool silent = false);
+  virtual octave_fcn_inline *fcn_inline_value (bool silent = false);
 
-  octave_user_function *user_function_value (bool silent = false);
-
-  octave_fcn_handle *fcn_handle_value (bool silent = false);
+  virtual octave_value_list list_value (void) const;
 
-  octave_fcn_inline *fcn_inline_value (bool silent = false);
+  virtual octave_value convert_to_str (bool pad = false, bool force = false,
+				       char type = '"') const;
+  virtual octave_value
+  convert_to_str_internal (bool pad, bool force, char type) const;
 
-  octave_value_list list_value (void) const;
+  virtual void convert_to_row_or_column_vector (void);
 
-  octave_value convert_to_str_internal (bool pad, bool force, char type) const;
+  virtual bool print_as_scalar (void) const { return false; }
 
-  void convert_to_row_or_column_vector (void);
+  virtual void print (std::ostream& os, bool pr_as_read_syntax = false) const;
 
-  bool print_as_scalar (void) const { return false; }
+  virtual void
+  print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
 
-  void print (std::ostream& os, bool pr_as_read_syntax = false) const;
+  virtual bool
+  print_name_tag (std::ostream& os, const std::string& name) const;
 
-  void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
-
-  bool print_name_tag (std::ostream& os, const std::string& name) const;
+  virtual void
+  print_with_name (std::ostream& output_buf, const std::string& name, 
+		   bool print_padding = true) const;
 
-  void print_info (std::ostream& os, const std::string& prefix) const;
+  virtual void print_info (std::ostream& os, const std::string& prefix) const;
 
-  bool save_ascii (std::ostream& os, bool& infnan_warned,
+  virtual bool save_ascii (std::ostream& os, bool& infnan_warned,
 			   bool strip_nan_and_inf);
 
-  bool load_ascii (std::istream& is);
+  virtual bool load_ascii (std::istream& is);
 
-  bool save_binary (std::ostream& os, bool& save_as_floats);
+  virtual bool save_binary (std::ostream& os, bool& save_as_floats);
 
-  bool load_binary (std::istream& is, bool swap, 
-		    oct_mach_info::float_format fmt);
+  virtual bool load_binary (std::istream& is, bool swap, 
+			    oct_mach_info::float_format fmt);
 
 #if defined (HAVE_HDF5)
-  bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
+  virtual bool
+  save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
 
-  bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
+  virtual bool
+  load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
 #endif
 
-  int write (octave_stream& os, int block_size,
-	     oct_data_conv::data_type output_type, int skip,
-	     oct_mach_info::float_format flt_fmt) const;
+  virtual int
+  write (octave_stream& os, int block_size,
+	 oct_data_conv::data_type output_type, int skip,
+	 oct_mach_info::float_format flt_fmt) const;
+
+protected:
+
+  // This should only be called for derived types.
+
+  octave_value numeric_assign (const std::string& type,
+			       const std::list<octave_value_list>& idx,
+			       const octave_value& rhs);
+
+  void reset_indent_level (void) const
+    { curr_print_indent_level = 0; }
+
+  void increment_indent_level (void) const
+    { curr_print_indent_level += 2; }
+
+  void decrement_indent_level (void) const
+    { curr_print_indent_level -= 2; }
+
+  int current_print_indent_level (void) const
+    { return curr_print_indent_level; }
+
+  void indent (std::ostream& os) const;
+
+  void newline (std::ostream& os) const;
+
+  void reset (void) const;
+
+  // A reference count.
+  int count;
 
 private:
 
-  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+  static int curr_print_indent_level;
+  static bool beginning_of_line;
+
+  DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA
 };
 
 #endif