diff src/ov.cc @ 7336:745a8299c2b5

[project @ 2007-12-28 20:56:55 by jwe]
author jwe
date Fri, 28 Dec 2007 20:56:58 +0000
parents 97db94ae2cf0
children 402168152bb9
line wrap: on
line diff
--- a/src/ov.cc	Fri Feb 01 23:56:51 2008 -0500
+++ b/src/ov.cc	Fri Dec 28 20:56:58 2007 +0000
@@ -55,6 +55,7 @@
 #include "ov-str-mat.h"
 #include "ov-range.h"
 #include "ov-struct.h"
+#include "ov-class.h"
 #include "ov-streamoff.h"
 #include "ov-list.h"
 #include "ov-cs-list.h"
@@ -73,6 +74,7 @@
 #include "pager.h"
 #include "parse.h"
 #include "pr-output.h"
+#include "symtab.h"
 #include "utils.h"
 #include "variables.h"
 
@@ -127,6 +129,40 @@
 }
 
 std::string
+octave_value::unary_op_fcn_name (unary_op op)
+{
+  std::string retval;
+
+  switch (op)
+    {
+    case op_not:
+      retval = "not";
+      break;
+
+    case op_uplus:
+      retval = "uplus";
+      break;
+
+    case op_uminus:
+      retval = "uminus";
+      break;
+
+    case op_transpose:
+      retval = "transpose";
+      break;
+
+    case op_hermitian:
+      retval = "ctranspose";
+      break;
+
+    default:
+      break;
+    }
+
+  return retval;
+}
+
+std::string
 octave_value::binary_op_as_string (binary_op op)
 {
   std::string retval;
@@ -225,6 +261,92 @@
 }
 
 std::string
+octave_value::binary_op_fcn_name (binary_op op)
+{
+  std::string retval;
+
+  switch (op)
+    {
+    case op_add:
+      retval = "plus";
+      break;
+
+    case op_sub:
+      retval = "minus";
+      break;
+
+    case op_mul:
+      retval = "mtimes";
+      break;
+
+    case op_div:
+      retval = "mrdivide";
+      break;
+
+    case op_pow:
+      retval = "mpower";
+      break;
+
+    case op_ldiv:
+      retval = "mldivide";
+      break;
+
+    case op_lt:
+      retval = "lt";
+      break;
+
+    case op_le:
+      retval = "le";
+      break;
+
+    case op_eq:
+      retval = "eq";
+      break;
+
+    case op_ge:
+      retval = "ge";
+      break;
+
+    case op_gt:
+      retval = "gt";
+      break;
+
+    case op_ne:
+      retval = "ne";
+      break;
+
+    case op_el_mul:
+      retval = "times";
+      break;
+
+    case op_el_div:
+      retval = "rdivide";
+      break;
+
+    case op_el_pow:
+      retval = "power";
+      break;
+
+    case op_el_ldiv:
+      retval = "ldivide";
+      break;
+
+    case op_el_and:
+      retval = "and";
+      break;
+
+    case op_el_or:
+      retval = "or";
+      break;
+
+    default:
+      break;
+    }
+
+  return retval;
+}
+
+std::string
 octave_value::assign_op_as_string (assign_op op)
 {
   std::string retval;
@@ -719,6 +841,11 @@
 {
 }
 
+octave_value::octave_value (const Octave_map& m, const std::string& id)
+  : rep (new octave_class (m, id))
+{
+}
+
 octave_value::octave_value (const streamoff_array& off)
   : rep (new octave_streamoff (off))
 {
@@ -741,6 +868,12 @@
 {
 }
 
+octave_value::octave_value (octave_base_value *new_rep, int xcount)
+  : rep (new_rep)
+{
+  rep->count = xcount;
+}
+
 octave_base_value *
 octave_value::clone (void) const
 {
@@ -886,7 +1019,7 @@
 
   if (! error_state)
     {
-      if (type[0] == '.' && ! is_map ())
+      if (type[0] == '.' && ! (is_map () || is_object ()))
 	{
 	  octave_value tmp = Octave_map ();
 	  retval = tmp.subsasgn (type, idx, t_rhs);
@@ -1369,68 +1502,86 @@
   int t1 = v1.type_id ();
   int t2 = v2.type_id ();
 
-  octave_value_typeinfo::binary_op_fcn f
-    = octave_value_typeinfo::lookup_binary_op (op, t1, t2);
+  if (t1 == octave_class::static_type_id ()
+      || t2 == octave_class::static_type_id ())
+    {
+      octave_value_typeinfo::binary_class_op_fcn f
+	= octave_value_typeinfo::lookup_binary_class_op (op);
 
-  if (f)
-    retval = f (*v1.rep, *v2.rep);
+      if (f)
+	retval = f (v1, v2);
+      else
+	gripe_binary_op (octave_value::binary_op_as_string (op),
+			 v1.class_name (), v2.class_name ());
+    }
   else
     {
-      octave_value tv1;
-      octave_base_value::type_conv_fcn cf1 = v1.numeric_conversion_function ();
+      // FIXME -- we need to handle overloading operators for built-in
+      // classes (double, char, int8, etc.)
 
-      if (cf1)
+      octave_value_typeinfo::binary_op_fcn f
+	= octave_value_typeinfo::lookup_binary_op (op, t1, t2);
+
+      if (f)
+	retval = f (*v1.rep, *v2.rep);
+      else
 	{
-	  octave_base_value *tmp = cf1 (*v1.rep);
+	  octave_value tv1;
+	  octave_base_value::type_conv_fcn cf1 = v1.numeric_conversion_function ();
+
+	  if (cf1)
+	    {
+	      octave_base_value *tmp = cf1 (*v1.rep);
 
-	  if (tmp)
-	    {
-	      tv1 = octave_value (tmp);
-	      t1 = tv1.type_id ();
+	      if (tmp)
+		{
+		  tv1 = octave_value (tmp);
+		  t1 = tv1.type_id ();
+		}
+	      else
+		{
+		  gripe_binary_op_conv (octave_value::binary_op_as_string (op));
+		  return retval;
+		}
 	    }
 	  else
+	    tv1 = v1;
+
+	  octave_value tv2;
+	  octave_base_value::type_conv_fcn cf2 = v2.numeric_conversion_function ();
+
+	  if (cf2)
 	    {
-	      gripe_binary_op_conv (octave_value::binary_op_as_string (op));
-	      return retval;
-	    }
-	}
-      else
-	tv1 = v1;
+	      octave_base_value *tmp = cf2 (*v2.rep);
 
-      octave_value tv2;
-      octave_base_value::type_conv_fcn cf2 = v2.numeric_conversion_function ();
-
-      if (cf2)
-	{
-	  octave_base_value *tmp = cf2 (*v2.rep);
-
-	  if (tmp)
-	    {
-	      tv2 = octave_value (tmp);
-	      t2 = tv2.type_id ();
+	      if (tmp)
+		{
+		  tv2 = octave_value (tmp);
+		  t2 = tv2.type_id ();
+		}
+	      else
+		{
+		  gripe_binary_op_conv (octave_value::binary_op_as_string (op));
+		  return retval;
+		}
 	    }
 	  else
+	    tv2 = v2;
+
+	  if (cf1 || cf2)
 	    {
-	      gripe_binary_op_conv (octave_value::binary_op_as_string (op));
-	      return retval;
+	      f = octave_value_typeinfo::lookup_binary_op (op, t1, t2);
+
+	      if (f)
+		retval = f (*tv1.rep, *tv2.rep);
+	      else
+		gripe_binary_op (octave_value::binary_op_as_string (op),
+				 v1.type_name (), v2.type_name ());
 	    }
-	}
-      else
-	tv2 = v2;
-
-      if (cf1 || cf2)
-	{
-	  f = octave_value_typeinfo::lookup_binary_op (op, t1, t2);
-
-	  if (f)
-	    retval = f (*tv1.rep, *tv2.rep);
 	  else
 	    gripe_binary_op (octave_value::binary_op_as_string (op),
 			     v1.type_name (), v2.type_name ());
 	}
-      else
-	gripe_binary_op (octave_value::binary_op_as_string (op),
-			 v1.type_name (), v2.type_name ());
     }
 
   return retval;
@@ -1560,39 +1711,57 @@
 
   int t = v.type_id ();
 
-  octave_value_typeinfo::unary_op_fcn f
-    = octave_value_typeinfo::lookup_unary_op (op, t);
+  if (t == octave_class::static_type_id ())
+    {
+      octave_value_typeinfo::unary_class_op_fcn f
+	= octave_value_typeinfo::lookup_unary_class_op (op);
 
-  if (f)
-    retval = f (*v.rep);
+      if (f)
+	retval = f (v);
+      else
+	gripe_unary_op (octave_value::unary_op_as_string (op),
+			v.class_name ());
+    }
   else
     {
-      octave_value tv;
-      octave_base_value::type_conv_fcn cf = v.numeric_conversion_function ();
+      // FIXME -- we need to handle overloading operators for built-in
+      // classes (double, char, int8, etc.)
+
+      octave_value_typeinfo::unary_op_fcn f
+	= octave_value_typeinfo::lookup_unary_op (op, t);
 
-      if (cf)
+      if (f)
+	retval = f (*v.rep);
+      else
 	{
-	  octave_base_value *tmp = cf (*v.rep);
+	  octave_value tv;
+	  octave_base_value::type_conv_fcn cf
+	    = v.numeric_conversion_function ();
 
-	  if (tmp)
+	  if (cf)
 	    {
-	      tv = octave_value (tmp);
-	      t = tv.type_id ();
+	      octave_base_value *tmp = cf (*v.rep);
 
-	      f = octave_value_typeinfo::lookup_unary_op (op, t);
+	      if (tmp)
+		{
+		  tv = octave_value (tmp);
+		  t = tv.type_id ();
+
+		  f = octave_value_typeinfo::lookup_unary_op (op, t);
 
-	      if (f)
-		retval = f (*tv.rep);
+		  if (f)
+		    retval = f (*tv.rep);
+		  else
+		    gripe_unary_op (octave_value::unary_op_as_string (op),
+				    v.type_name ());
+		}
 	      else
-		gripe_unary_op (octave_value::unary_op_as_string (op),
-				v.type_name ());
+		gripe_unary_op_conv (octave_value::unary_op_as_string (op));
 	    }
 	  else
-	    gripe_unary_op_conv (octave_value::unary_op_as_string (op));
+	    gripe_unary_op (octave_value::unary_op_as_string (op),
+			    v.type_name ());
 	}
-      else
-	gripe_unary_op (octave_value::unary_op_as_string (op),
-			v.type_name ());
     }
 
   return retval;
@@ -1882,6 +2051,7 @@
   octave_sparse_matrix::register_type ();
   octave_sparse_complex_matrix::register_type ();
   octave_struct::register_type ();
+  octave_class::register_type ();
   octave_list::register_type ();
   octave_cs_list::register_type ();
   octave_magic_colon::register_type ();