diff liboctave/Array.h @ 10364:96ed7c629bbd

remove dangerous pointer-acquiring Array ctors
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 26 Feb 2010 12:05:48 +0100
parents 72fab01e5d68
children e5ae13b8b2c2
line wrap: on
line diff
--- a/liboctave/Array.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/Array.h	Fri Feb 26 12:05:48 2010 +0100
@@ -61,11 +61,17 @@
     octave_idx_type len;
     int count;
 
-    ArrayRep (T *d, octave_idx_type l, bool copy = false) 
-      : data (copy ? no_ctor_new<T> (l) : d), len (l), count (1) 
+    ArrayRep (T *d, octave_idx_type l) 
+      : data (no_ctor_new<T> (l)), len (l), count (1) 
         { 
-          if (copy)
-            copy_or_memcpy (l, d, data);
+          copy_or_memcpy (l, d, data);
+        }
+
+    template <class U>
+    ArrayRep (U *d, octave_idx_type l) 
+      : data (no_ctor_new<T> (l)), len (l), count (1) 
+        { 
+          std::copy (d, d+l, data);
         }
 
     ArrayRep (void) : data (0), len (0), count (1) { }
@@ -104,7 +110,7 @@
       if (rep->count > 1)
         {
           --rep->count;
-          rep = new ArrayRep (slice_data, slice_len, true);
+          rep = new ArrayRep (slice_data, slice_len);
           slice_data = rep->data;
         }
     }
@@ -132,22 +138,6 @@
   T* slice_data;
   octave_idx_type slice_len;
 
-  Array (T *d, octave_idx_type m, octave_idx_type n)
-    : rep (new typename Array<T>::ArrayRep (d, m*n)), dimensions (m, n) 
-    { 
-      slice_data = rep->data;
-      slice_len = rep->len;
-    }
-
-  Array (T *d, const dim_vector& dv)
-    : rep (new typename Array<T>::ArrayRep (d, dv.numel ())),
-      dimensions (dv) 
-    { 
-      slice_data = rep->data;
-      slice_len = rep->len;
-      dimensions.chop_trailing_singletons ();
-    }
-
   // slice constructor
   Array (const Array<T>& a, const dim_vector& dv,
          octave_idx_type l, octave_idx_type u)
@@ -169,18 +159,6 @@
       return nr;
     }
 
-  template <class U>
-  T *
-  coerce (const U *a, octave_idx_type len)
-  {
-    T *retval = no_ctor_new<T> (len);
-
-    for (octave_idx_type i = 0; i < len; i++)
-      retval[i] = T (a[i]);
-
-    return retval;
-  }
-
 public:
 
   // Empty ctor (0x0).
@@ -249,7 +227,7 @@
   // Type conversion case.
   template <class U>
   Array (const Array<U>& a)
-    : rep (new typename Array<T>::ArrayRep (coerce (a.data (), a.length ()), a.length ())),
+    : rep (new typename Array<T>::ArrayRep (a.data (), a.length ())),
       dimensions (a.dims ())
     {
       slice_data = rep->data;
@@ -616,7 +594,7 @@
     {
       if (rep->count == 1 && slice_len != rep->len)
         {
-          ArrayRep *new_rep = new ArrayRep (slice_data, slice_len, true);
+          ArrayRep *new_rep = new ArrayRep (slice_data, slice_len);
           delete rep;
           rep = new_rep;
           slice_data = rep->data;