diff liboctave/Array.h @ 2006:95e952f72d66

[project @ 1996-03-04 00:33:32 by jwe]
author jwe
date Mon, 04 Mar 1996 00:40:14 +0000
parents c1ffef39e94a
children 91c6c05e4c06
line wrap: on
line diff
--- a/liboctave/Array.h	Sun Mar 03 20:06:08 1996 +0000
+++ b/liboctave/Array.h	Mon Mar 04 00:40:14 1996 +0000
@@ -82,6 +82,15 @@
       }
   };
 
+  void make_unique (void)
+    {
+      if (rep->count > 1)
+	{
+	  --rep->count;
+	  rep = new ArrayRep (*rep);
+	}
+    }
+
 #ifdef HEAVYWEIGHT_INDEXING
   idx_vector *idx;
   int max_indices;
@@ -148,24 +157,55 @@
   int capacity (void) const { return rep->length (); }
   int length (void) const { return rep->length (); }
 
+  // XXX FIXME XXX -- would be nice to fix this so that we don't
+  // unnecessarily force a copy, but that is not so easy, and I see no
+  // clean way to do it.
+
   T& elem (int n)
     {
-      if (rep->count > 1)
-	{
-	  --rep->count;
-	  rep = new ArrayRep (*rep);
-	}
+      make_unique ();
       return rep->elem (n);
     }
 
-  T& checkelem (int n);
+  T& Array<T>::checkelem (int n)
+    {
+      if (n < 0 || n >= rep->length ())
+	{
+	  (*current_liboctave_error_handler) ("range error");
+	  static T foo;
+	  return foo;
+	}
+      else
+	return elem (n);
+    }
+
+#if defined (NO_BOUNDS_CHECKING)
+  T& operator () (int n) { return elem (n); }
+#else
   T& operator () (int n) { return checkelem (n); }
+#endif
+
+  T Array<T>::elem (int n) const { return rep->elem (n); }
 
-  T elem (int n) const;
-  T checkelem (int n) const;
-  T operator () (int n) const;
+  T Array<T>::checkelem (int n) const
+    {
+      if (n < 0 || n >= rep->length ())
+	{
+	  (*current_liboctave_error_handler) ("range error");
+	  T foo;
+	  static T *bar = &foo;
+	  return foo;
+	}
+      return elem (n);
+    }
 
-  // No checking.
+#if defined (NO_BOUNDS_CHECKING)
+  T Array<T>::operator () (int n) const { return elem (n); }
+#else
+  T Array<T>::operator () (int n) const { return checkelem (n); }
+#endif
+
+  // No checking, even for multiple references, ever.
 
   T& xelem (int n) { return rep->elem (n); }
   T xelem (int n) const { return rep->elem (n); }