diff src/ov.h @ 3203:bc61b0e8d60e

[project @ 1998-10-30 20:26:27 by jwe]
author jwe
date Fri, 30 Oct 1998 20:26:31 +0000
parents 44d82b369c78
children 81738e630f57
line wrap: on
line diff
--- a/src/ov.h	Thu Oct 29 20:28:02 1998 +0000
+++ b/src/ov.h	Fri Oct 30 20:26:31 1998 +0000
@@ -62,7 +62,13 @@
 
 // XXX FIXME XXX -- these should probably really be inside the scope
 // of the octave_value class, but the cygwin32 beta16 version of g++
-// can't handlt that.
+// can't handle that.
+
+typedef octave_value (*unary_op_fcn)
+  (const octave_value&);
+
+typedef void (*non_const_unary_op_fcn)
+  (octave_value&);
 
 typedef octave_value (*binary_op_fcn)
   (const octave_value&, const octave_value&);
@@ -77,6 +83,18 @@
 {
 public:
 
+  enum unary_op
+  {
+    not,
+    uminus,
+    transpose,
+    hermitian,
+    incr,
+    decr,
+    num_unary_ops,
+    unknown_unary_op
+  };
+
   enum binary_op
   {
     add,
@@ -121,6 +139,8 @@
     unknown_assign_op
   };
 
+  static string unary_op_as_string (unary_op);
+
   static string binary_op_as_string (binary_op);
 
   static string assign_op_as_string (assign_op);
@@ -409,28 +429,6 @@
   virtual boolMatrix bool_matrix_value (void) const
     { return rep->bool_matrix_value (); }
 
-  // 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 ();
-    }
-
   ColumnVector vector_value (bool frc_str_conv = false,
 			     bool frc_vec_conv = false) const;
 
@@ -464,7 +462,12 @@
 
   virtual string type_name (void) const { return rep->type_name (); }
 
-  // Binary and unary operations.
+  // Unary and binary operations.
+
+  friend octave_value do_unary_op (octave_value::unary_op,
+				   const octave_value&);
+
+  void do_non_const_unary_op (octave_value::unary_op);
 
   friend octave_value do_binary_op (octave_value::binary_op,
 				    const octave_value&,
@@ -516,6 +519,79 @@
   static bool beginning_of_line;
 };
 
+#define OV_UNOP_FN(name) \
+  inline octave_value \
+  name (const octave_value& a) \
+  { \
+    return do_unary_op (octave_value::name, a); \
+  }
+
+#define OV_UNOP_OP(name, op) \
+  inline octave_value \
+  operator op (const octave_value& a) \
+  { \
+    return name (a); \
+  }
+
+#define OV_UNOP_FN_OP(name, op) \
+  OV_UNOP_FN (name) \
+  OV_UNOP_OP (name, op)
+
+OV_UNOP_FN_OP (not, !)
+OV_UNOP_FN_OP (uminus, -)
+
+OV_UNOP_FN (transpose)
+OV_UNOP_FN (hermitian)
+
+// No simple way to define these for prefix and suffix ops?
+//
+//   incr
+//   decr
+
+#define OV_BINOP_FN(name) \
+  inline octave_value \
+  name (const octave_value& a1, const octave_value& a2) \
+  { \
+    return do_binary_op (octave_value::name, a1, a2); \
+  }
+
+#define OV_BINOP_OP(name, op) \
+  inline octave_value \
+  operator op (const octave_value& a1, const octave_value& a2) \
+  { \
+    return name (a1, a2); \
+  }
+
+#define OV_BINOP_FN_OP(name, op) \
+  OV_BINOP_FN (name) \
+  OV_BINOP_OP (name, op)
+
+OV_BINOP_FN_OP (add, +)
+OV_BINOP_FN_OP (sub, -)
+OV_BINOP_FN_OP (mul, *)
+OV_BINOP_FN_OP (div, /)
+
+OV_BINOP_FN (pow)
+OV_BINOP_FN (ldiv)
+OV_BINOP_FN (lshift)
+OV_BINOP_FN (rshift)
+
+OV_BINOP_FN_OP (lt, <)
+OV_BINOP_FN_OP (le, <=)
+OV_BINOP_FN_OP (eq, ==)
+OV_BINOP_FN_OP (ge, >=)
+OV_BINOP_FN_OP (gt, >)
+OV_BINOP_FN_OP (ne, !=)
+
+OV_BINOP_FN (el_mul)
+OV_BINOP_FN (el_div)
+OV_BINOP_FN (el_pow)
+OV_BINOP_FN (el_ldiv)
+OV_BINOP_FN (el_and)
+OV_BINOP_FN (el_or)
+
+OV_BINOP_FN (struct_ref)
+
 // If TRUE, allow assignments like
 //
 //   octave> A(1) = 3; A(2) = 5