diff examples/make_int.cc @ 3301:02866242d3ae

[project @ 1999-10-20 04:10:46 by jwe]
author jwe
date Wed, 20 Oct 1999 04:10:53 +0000
parents 35a6d027772c
children 76f6a531f5b8
line wrap: on
line diff
--- a/examples/make_int.cc	Tue Oct 19 18:04:03 1999 +0000
+++ b/examples/make_int.cc	Wed Oct 20 04:10:53 1999 +0000
@@ -1,6 +1,6 @@
 /*
 
-Copyright (C) 1996, 1997 John W. Eaton
+Copyright (C) 1996 John W. Eaton
 
 This file is part of Octave.
 
@@ -28,6 +28,7 @@
 
 class ostream;
 
+#include <octave/lo-mappers.h>
 #include <octave/lo-utils.h>
 #include <octave/mx-base.h>
 #include <octave/str-vec.h>
@@ -35,7 +36,6 @@
 #include <octave/defun-dld.h>
 #include <octave/error.h>
 #include <octave/gripes.h>
-#include <octave/lo-mappers.h>
 #include <octave/oct-obj.h>
 #include <octave/ops.h>
 #include <octave/ov-base.h>
@@ -85,8 +85,8 @@
   bool is_defined (void) const { return true; }
   bool is_real_scalar (void) const { return true; }
 
-  octave_value all (void) const { return (scalar != 0); }
-  octave_value any (void) const { return (scalar != 0); }
+  octave_value all (void) const { return (double) (scalar != 0); }
+  octave_value any (void) const { return (double) (scalar != 0); }
 
   bool is_real_type (void) const { return true; }
   bool is_scalar_type (void) const { return true; }
@@ -111,76 +111,54 @@
   ComplexMatrix complex_matrix_value (bool = false) const
     { return  ComplexMatrix (1, 1, Complex (scalar)); }
 
-  octave_value not (void) const { return octave_value (! scalar); }
+  octave_value not (void) const { return octave_value ((double) ! scalar); }
 
-  octave_value uminus (void) const { return octave_value (- scalar); }
+  octave_value uminus (void) const { return new octave_integer (- scalar); }
 
-  octave_value transpose (void) const { return octave_value (scalar); }
+  octave_value transpose (void) const { return new octave_integer (scalar); }
 
-  octave_value hermitian (void) const { return octave_value (scalar); }
+  octave_value hermitian (void) const { return new octave_integer (scalar); }
 
   void increment (void) { ++scalar; }
 
   void decrement (void) { --scalar; }
 
-  void print (ostream& os);
-
-  int type_id (void) const { return t_id; }
-
-  string type_name (void) const { return t_name; }
-
-  static int static_type_id (void) { return t_id; }
-
-  static void register_type (void)
-    { t_id = octave_value_typeinfo::register_type (t_name); }
+  void print (ostream& os, bool pr_as_read_syntax = false) const;
 
 private:
 
   int scalar;
 
-  static int t_id;
+  DECLARE_OCTAVE_ALLOCATOR
 
-  static const string t_name;
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
 };
 
-int octave_integer::t_id = -1;
-
-const string octave_integer::t_name ("integer");
+void
+octave_integer::print (ostream& os, bool pr_as_read_syntax) const
+{
+  octave_print_internal (os, scalar, pr_as_read_syntax);
+}
 
-void
-octave_integer::print (ostream& os)
-{
-  octave_print_internal (os, scalar, false);
-}
+#ifdef DEFBINOP_OP
+#undef DEFBINOP_OP
+#endif
+
+#define DEFBINOP_OP(name, t1, t2, op) \
+  BINOPDECL (name, a1, a2) \
+  { \
+    CAST_BINOP_ARGS (const octave_ ## t1&, const octave_ ## t2&); \
+    return octave_value \
+      (new octave_integer (v1.t1 ## _value () op v2.t2 ## _value ())); \
+  }
 
 // integer by integer ops.
 
-static octave_value
-add (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () + v2.integer_value ());
-}
-
-static octave_value
-sub (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
+DEFBINOP_OP (add, integer, integer, +)
+DEFBINOP_OP (sub, integer, integer, -)
+DEFBINOP_OP (mul, integer, integer, *)
 
-  return new octave_integer (v1.integer_value () - v2.integer_value ());
-}
-
-static octave_value
-mul (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () * v2.integer_value ());
-}
-
-static octave_value
-div (const octave_value& a1, const octave_value& a2)
+DEFBINOP (div, integer, integer)
 {
   CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
 
@@ -192,8 +170,8 @@
   return new octave_integer (v1.integer_value () / d);
 }
 
-static octave_value
-i_s_div (const octave_value& a1, const octave_value& a2)
+
+DEFBINOP (i_s_div, integer, scalar)
 {
   CAST_BINOP_ARGS (const octave_integer&, const octave_scalar&);
 
@@ -205,8 +183,7 @@
   return new octave_scalar (v1.double_value () / d);
 }
 
-static octave_value
-ldiv (const octave_value& a1, const octave_value& a2)
+DEFBINOP (ldiv, integer, integer)
 {
   CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
 
@@ -218,64 +195,16 @@
   return new octave_integer (v2.integer_value () / d);
 }
 
-static octave_value
-lt (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () < v2.integer_value ());
-}
-
-static octave_value
-le (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () <= v2.integer_value ());
-}
-
-static octave_value
-eq (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () == v2.integer_value ());
-}
-
-static octave_value
-ge (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
+DEFBINOP_OP (lt, integer, integer, <)
+DEFBINOP_OP (le, integer, integer, <=)
+DEFBINOP_OP (eq, integer, integer, ==)
+DEFBINOP_OP (ge, integer, integer, >=)
+DEFBINOP_OP (gt, integer, integer, >)
+DEFBINOP_OP (ne, integer, integer, !=)
 
-  return new octave_integer (v1.integer_value () >= v2.integer_value ());
-}
-
-static octave_value
-gt (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () > v2.integer_value ());
-}
+DEFBINOP_OP (el_mul, integer, integer, !=)
 
-static octave_value
-ne (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () != v2.integer_value ());
-}
-
-static octave_value
-el_mul (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () * v2.integer_value ());
-}
-
-static octave_value
-el_div (const octave_value& a1, const octave_value& a2)
+DEFBINOP (el_div, integer, integer)
 {
   CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
 
@@ -287,8 +216,7 @@
   return new octave_integer (v1.integer_value () / d);
 }
 
-static octave_value
-el_ldiv (const octave_value& a1, const octave_value& a2)
+DEFBINOP (el_ldiv, integer, integer)
 {
   CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
 
@@ -300,21 +228,8 @@
   return new octave_integer (v2.integer_value () / d);
 }
 
-static octave_value
-el_and (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () && v2.integer_value ());
-}
-
-static octave_value
-el_or (const octave_value& a1, const octave_value& a2)
-{
-  CAST_BINOP_ARGS (const octave_integer&, const octave_integer&);
-
-  return new octave_integer (v1.integer_value () || v2.integer_value ());
-}
+DEFBINOP_OP (el_and, integer, integer, &&)
+DEFBINOP_OP (el_or, integer, integer, ||)
 
 DEFUN_DLD (make_int, args, ,
   "int_val = make_int (val)\n\
@@ -365,6 +280,33 @@
   return retval;
 }
 
+DEFUN_DLD (doit, args, ,
+  "doit (I)")
+{
+  octave_value_list retval;
+
+  if (args(0).type_name () == "integer")
+    {
+      // At this point, we know we have a handle for an octave_integer
+      // object, so we can peek at the representation and extract the
+      // data.
+
+      const octave_value& rep = args(0).get_rep ();
+
+      int my_value = ((const octave_integer&) rep) . integer_value ();
+
+      message ("doit", "your lucky number is: %d", my_value);
+    }
+  else
+    gripe_wrong_type_arg ("doit", args(0));
+
+  return retval;
+}
+
+DEFINE_OCTAVE_ALLOCATOR (octave_integer);
+
+DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_integer, "integer");
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***