diff src/ov.h @ 2376:2142216bf85a

[project @ 1996-10-12 01:39:07 by jwe]
author jwe
date Sat, 12 Oct 1996 01:39:21 +0000
parents
children 47e5f57fb4bd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov.h	Sat Oct 12 01:39:21 1996 +0000
@@ -0,0 +1,527 @@
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_value_h)
+#define octave_value_h 1
+
+#if defined (__GNUG__)
+#pragma interface
+#endif
+
+#include <cstdlib>
+
+#include <string>
+
+class ostream;
+
+#include <SLList.h>
+
+#include "Range.h"
+#include "idx-vector.h"
+#include "mx-base.h"
+#include "str-vec.h"
+
+#include "error.h"
+#include "pt-exp.h"
+
+class Octave_map;
+class octave_value_list;
+
+// Constants.
+
+// This just provides a way to avoid infinite recursion when building
+// octave_value objects.
+
+class
+octave_xvalue
+{
+public:
+
+  octave_xvalue (void) { }
+};
+
+class
+octave_value
+{
+public:
+
+  typedef octave_value (*binary_op_fcn)
+    (const octave_value&, const octave_value&);
+
+  typedef octave_value (*assign_op_fcn)
+    (octave_value&, const octave_value_list&, const octave_value&);
+
+  typedef octave_value * (*widening_op_fcn) (const octave_value&);
+
+  typedef octave_value * (*numeric_conv_fcn) (const octave_value&);
+
+  enum binary_op
+  {
+    add,
+    sub,
+    mul,
+    div,
+    pow,
+    ldiv,
+    lt,
+    le,
+    eq,
+    ge,
+    gt,
+    ne,
+    el_mul,
+    el_div,
+    el_pow,
+    el_ldiv,
+    el_and,
+    el_or,
+    struct_ref,
+    num_binary_ops,
+    unknown_binary_op
+  };
+
+  static string binary_op_as_string (binary_op);
+
+  enum magic_colon { magic_colon_t };
+  enum all_va_args { all_va_args_t };
+
+  octave_value (void);
+  octave_value (double d);
+  octave_value (const Matrix& m);
+  octave_value (const DiagMatrix& d);
+  octave_value (const RowVector& v, int pcv = -1);
+  octave_value (const ColumnVector& v, int pcv = -1);
+  octave_value (const Complex& C);
+  octave_value (const ComplexMatrix& m);
+  octave_value (const ComplexDiagMatrix& d);
+  octave_value (const ComplexRowVector& v, int pcv = -1);
+  octave_value (const ComplexColumnVector& v, int pcv = -1);
+  octave_value (const char *s);
+  octave_value (const string& s);
+  octave_value (const string_vector& s);
+  octave_value (const charMatrix& chm, bool is_string = false);
+  octave_value (double base, double limit, double inc);
+  octave_value (const Range& r);
+  octave_value (const Octave_map& m);
+  octave_value (octave_value::magic_colon);
+  octave_value (octave_value::all_va_args);
+
+  octave_value (octave_value *new_rep);
+
+  // Copy constructor.
+
+  octave_value (const octave_value& a)
+    {
+      rep = a.rep;
+      rep->count++;
+    }
+
+  // Delete the representation of this constant if the count drops to
+  // zero.
+
+  virtual ~octave_value (void);
+
+  // This should only be called for derived types.
+
+  virtual octave_value *clone (void) { panic_impossible (); }
+
+  void make_unique (void)
+    {
+      if (rep->count > 1)
+	{
+	  --rep->count;
+	  rep = rep->clone ();
+	  rep->count = 1;
+	}
+    }
+
+#if 0
+  void *operator new (size_t size);
+  void operator delete (void *p, size_t size);
+#endif
+
+  // Simple assignment.
+
+  octave_value& operator = (const octave_value& a)
+    {
+      if (rep != a.rep)
+	{
+	  if (--rep->count == 0)
+	    delete rep;
+
+	  rep = a.rep;
+	  rep->count++;
+	}
+
+      return *this;
+    }
+
+  virtual numeric_conv_fcn numeric_conversion_function (void) const
+    { return rep->numeric_conversion_function (); }
+
+  virtual octave_value index (const octave_value_list& idx) const
+    { return rep->index (idx); }
+
+  octave_value& assign (const octave_value_list& idx, const octave_value& rhs);
+
+  virtual idx_vector index_vector (void) const
+    { return rep->index_vector (); }
+
+  virtual octave_value struct_elt_val (const string& nm) const
+    { return rep->struct_elt_val (nm); }
+
+  virtual octave_value& struct_elt_ref (const string& nm)
+    { return rep->struct_elt_ref (nm); }
+
+#if 0
+  // Simple structure assignment.
+
+  octave_value assign_map_element (SLList<string>& list,
+				    octave_value& rhs);
+
+  // Indexed structure assignment.
+
+  octave_value assign_map_element (SLList<string>& list,
+				    octave_value& rhs,
+				    const octave_value_list& args);
+#endif
+
+  // Size.
+
+  virtual int rows (void) const
+    { return rep->rows (); }
+
+  virtual int columns (void) const
+    { return rep->columns (); }
+
+  // Does this constant have a type?  Both of these are provided since
+  // it is sometimes more natural to write is_undefined() instead of
+  // ! is_defined().
+
+  virtual bool is_defined (void) const
+    { return rep->is_defined (); }
+
+  bool is_undefined (void) const
+    { return ! is_defined (); }
+
+  virtual bool is_real_scalar (void) const
+    { return rep->is_real_scalar (); }
+
+  virtual bool is_real_matrix (void) const
+    { return rep->is_real_matrix (); }
+
+  virtual bool is_complex_scalar (void) const
+    { return rep->is_complex_scalar (); }
+
+  virtual bool is_complex_matrix (void) const
+    { return rep->is_complex_matrix (); }
+
+  virtual bool is_char_matrix (void) const
+    { return rep->is_char_matrix (); }
+
+  virtual bool is_string (void) const
+    { return rep->is_string (); }
+
+  virtual bool is_range (void) const
+    { return rep->is_range (); }
+
+  virtual bool is_map (void) const
+    { return rep->is_map (); }
+
+  virtual bool is_magic_colon (void) const
+    { return rep->is_magic_colon (); }
+
+  virtual bool is_all_va_args (void) const
+    { return rep->is_all_va_args (); }
+
+  // Are any or all of the elements in this constant nonzero?
+
+  virtual octave_value all (void) const
+    { return rep->all (); }
+
+  virtual octave_value any (void) const
+    { return rep->any (); }
+
+  // Other type stuff.
+
+  virtual bool is_real_type (void) const
+    { return rep->is_real_type (); }
+
+  virtual bool is_complex_type (void) const
+    { return rep->is_complex_type (); }
+
+  virtual bool is_scalar_type (void) const
+    { return rep->is_scalar_type (); }
+
+  virtual bool is_matrix_type (void) const
+    { return rep->is_matrix_type (); }
+
+  virtual bool is_numeric_type (void) const
+    { return rep->is_numeric_type (); }
+
+  virtual bool valid_as_scalar_index (void) const
+    { return rep->valid_as_scalar_index (); }
+
+  virtual bool valid_as_zero_index (void) const
+    { return rep->valid_as_zero_index (); }
+
+  // Does this constant correspond to a truth value?
+
+  virtual bool is_true (void) const
+    { return rep->is_true (); }
+
+  // Is at least one of the dimensions of this constant zero?
+
+  virtual bool is_empty (void) const
+    { return rep->is_empty (); }
+
+  // Are the dimensions of this constant zero by zero?
+
+  virtual bool is_zero_by_zero (void) const
+    { return rep->is_zero_by_zero (); }
+
+  // Values.
+
+  virtual double double_value (bool frc_str_conv = false) const
+    { return rep->double_value (frc_str_conv); }
+
+  virtual Matrix matrix_value (bool frc_str_conv = false) const
+    { return rep->matrix_value (frc_str_conv); }
+
+  virtual Complex complex_value (bool frc_str_conv = false) const
+    { return rep->complex_value (frc_str_conv); }
+
+  virtual ComplexMatrix complex_matrix_value (bool frc_str_conv = false) const
+    { return rep->complex_matrix_value (frc_str_conv); }
+
+  virtual charMatrix char_matrix_value (bool frc_str_conv = false) const
+    { return rep->char_matrix_value (frc_str_conv); }
+
+  virtual charMatrix all_strings (void) const
+    { return rep->all_strings (); }
+
+  virtual string string_value (void) const
+    { return rep->string_value (); }
+
+  virtual Range range_value (void) const
+    { return rep->range_value (); }
+
+  virtual Octave_map map_value (void) const;
+
+  // Unary ops.
+
+  virtual octave_value not (void) const { return rep->not (); }
+
+  virtual octave_value uminus (void) const { return rep->uminus (); }
+
+  virtual octave_value transpose (void) const { return rep->transpose (); }
+
+  virtual octave_value hermitian (void) const { return rep->hermitian (); }
+
+  virtual void increment (void)
+    {
+      make_unique ();
+      rep->increment ();
+    }
+
+  virtual void decrement (void)
+    {
+      make_unique ();
+      rep->decrement ();
+    }
+
+#if 0
+  virtual octave_value
+  lookup_map_element (const string& ref, bool insert = false,
+		      bool silent = false)
+    { return lookup_map_element (ref, insert, silent); }
+
+  virtual octave_value
+  lookup_map_element (SLList<string>& list, bool insert = false,
+		      bool silent = false)
+    { return rep->lookup_map_element (list, insert, silent); }
+#endif
+
+  ColumnVector vector_value (bool frc_str_conv = false,
+			     bool frc_vec_conv = false) const;
+
+  ComplexColumnVector
+  complex_vector_value (bool frc_str_conv = false,
+			bool frc_vec_conv = false) const;
+
+  // Conversions.  These should probably be private.  If a user of this
+  // class wants a certain kind of constant, he should simply ask for
+  // it, and we should convert it if possible.
+
+  virtual octave_value convert_to_str (void) const
+    { return rep->convert_to_str (); }
+
+  virtual void convert_to_row_or_column_vector (void)
+    { rep->convert_to_row_or_column_vector (); }
+
+  void print (void);
+
+  virtual void print (ostream& os) { rep->print (os); }
+
+  void print_with_name (const string& name, bool print_padding = true);
+
+  void print_with_name (ostream& os, const string& name,
+			bool print_padding = true);
+
+  virtual int type_id (void) const { return rep->type_id (); }
+
+  virtual string type_name (void) const { return rep->type_name (); }
+
+#if 0
+  octave_value_rep *make_unique_map (void);
+
+  // We want to eliminate this, or at least make it private.
+
+  virtual octave_value_rep::constant_type const_type (void) const
+    { return rep->const_type (); }
+#endif
+
+  virtual void convert_to_matrix_type (bool make_complex)
+    { rep->convert_to_matrix_type (make_complex); }
+
+  // Can we make these go away?
+
+  // These need better names, since a range really is a numeric type.
+
+  virtual void force_numeric (bool frc_str_conv = false)
+    { rep->force_numeric (frc_str_conv); }
+
+  octave_value make_numeric (bool) const
+    {
+      warning ("octave_value::make_numeric() is a no-op");
+      return *this;
+    }
+
+#if 0
+    {
+      if (is_numeric_type ())
+	return *this;
+      else
+	return rep->make_numeric (frc_str_conv);
+    }
+#endif
+
+  bool print_as_scalar (void);
+
+  bool print_as_structure (void) { return is_map (); }
+
+  // Binary and unary operations.
+
+  friend octave_value do_binary_op (octave_value& a, octave_value& b,
+				    tree_expression::type t);
+
+protected:
+
+  octave_value (const octave_xvalue&) : rep (0) { }
+
+private:
+
+  union
+    {
+      octave_value *freeptr;  // For custom memory management.
+      octave_value *rep;      // The real representation.
+      int count;              // A reference count.
+    };
+};
+
+// If TRUE, allow assignments like
+//
+//   octave> A(1) = 3; A(2) = 5
+//
+// for A already defined and a matrix type.
+extern bool Vdo_fortran_indexing;
+
+// Should we allow things like:
+//
+//   octave> 'abc' + 0
+//   97 98 99
+//
+// to happen?  A positive value means yes.  A negative value means
+// yes, but print a warning message.  Zero means it should be
+// considered an error.
+extern int Vimplicit_str_to_num_ok;
+
+// Should we allow silent conversion of complex to real when a real
+// type is what we're really looking for?  A positive value means yes.
+// A negative value means yes, but print a warning message.  Zero
+// means it should be considered an error.
+extern int Vok_to_lose_imaginary_part;
+
+// If TRUE, create column vectors when doing assignments like:
+//
+//   octave> A(1) = 3; A(2) = 5
+//
+// (for A undefined).  Only matters when resize_on_range_error is also
+// TRUE.
+extern bool Vprefer_column_vectors;
+
+// If TRUE, prefer logical (zore-one) indexing over normal indexing
+// when there is a conflice.  For example, given a = [2, 3], the
+// expression  a ([1, 1]) would return [2 3] (instead of [2 2], which
+// would be returned if prefer_zero_one_indxing were FALSE).
+extern bool Vprefer_zero_one_indexing;
+
+// If TRUE, print the name along with the value.
+extern bool Vprint_answer_id_name;
+
+// Should operations on empty matrices return empty matrices or an
+// error?  A positive value means yes.  A negative value means yes,
+// but print a warning message.  Zero means it should be considered an
+// error.
+extern int Vpropagate_empty_matrices;
+
+// If TRUE, resize matrices when performing and indexed assignment and
+// the indices are outside the current bounds.
+extern bool Vresize_on_range_error;
+
+// How many levels of structure elements should we print?
+extern int Vstruct_levels_to_print;
+
+// Allow divide by zero errors to be suppressed.
+extern bool Vwarn_divide_by_zero;
+
+// Indentation level for structures.
+extern int struct_indent;
+
+extern void symbols_of_value (void);
+
+extern void increment_struct_indent (void);
+extern void decrement_struct_indent (void);
+
+extern octave_value
+do_binary_op (octave_value::binary_op, const octave_value&,
+	      const octave_value&);
+
+extern void install_types (void);
+
+#endif
+
+/*
+;; Local Variables: ***
+;; mode: C++ ***
+;; End: ***
+*/