changeset 10364:96ed7c629bbd

remove dangerous pointer-acquiring Array ctors
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 26 Feb 2010 12:05:48 +0100
parents a0728e81ed25
children 532802559f39
files liboctave/Array.h liboctave/Array3.h liboctave/CColVector.h liboctave/CDiagMatrix.h liboctave/CMatrix.h liboctave/CNDArray.h liboctave/CRowVector.h liboctave/ChangeLog liboctave/DiagArray2.h liboctave/MArray.h liboctave/MDiagArray2.h liboctave/boolMatrix.h liboctave/boolNDArray.h liboctave/chMatrix.h liboctave/chNDArray.h liboctave/dColVector.h liboctave/dDiagMatrix.h liboctave/dMatrix.h liboctave/dNDArray.h liboctave/dRowVector.h liboctave/fCColVector.h liboctave/fCDiagMatrix.h liboctave/fCMatrix.h liboctave/fCNDArray.h liboctave/fCRowVector.h liboctave/fColVector.h liboctave/fDiagMatrix.h liboctave/fMatrix.h liboctave/fNDArray.h liboctave/fRowVector.h liboctave/intNDArray.h
diffstat 31 files changed, 51 insertions(+), 130 deletions(-) [+]
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;
--- a/liboctave/Array3.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/Array3.h	Fri Feb 26 12:05:48 2010 +0100
@@ -39,10 +39,6 @@
 class
 Array3 : public Array<T>
 {
-protected:
-
-  Array3 (T *d, octave_idx_type r, octave_idx_type c, octave_idx_type p) : Array<T> (d, dim_vector (r, c, p)) { }
-
 public:
 
   Array3 (void) : Array<T> (dim_vector (0, 0, 0)) { }
--- a/liboctave/CColVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/CColVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -134,9 +134,6 @@
   void clear (octave_idx_type n)
     { Array<Complex>::clear (n, 1); }
 
-private:
-
-  ComplexColumnVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, l, 1) { }
 };
 
 MARRAY_FORWARD_DEFS (MArray, ComplexColumnVector, Complex)
--- a/liboctave/CDiagMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/CDiagMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -131,10 +131,6 @@
 
   friend std::ostream& operator << (std::ostream& os, const ComplexDiagMatrix& a);
 
-private:
-
-  ComplexDiagMatrix (Complex *d, octave_idx_type nr, octave_idx_type nc)
-    : MDiagArray2<Complex> (d, nr, nc) { }
 };
 
 OCTAVE_API ComplexDiagMatrix conj (const ComplexDiagMatrix& a);
--- a/liboctave/CMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/CMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -373,9 +373,6 @@
 
   static Complex resize_fill_value (void) { return Complex (0.0, 0.0); }
 
-private:
-
-  ComplexMatrix (Complex *d, octave_idx_type r, octave_idx_type c) : MArray<Complex> (d, r, c) { }
 };
 
 extern OCTAVE_API ComplexMatrix conj (const ComplexMatrix& a);
--- a/liboctave/CNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/CNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -148,10 +148,6 @@
       return *this; 
     }
 
-private:
-
-  ComplexNDArray (Complex *d, const dim_vector& dv)
-    : MArray<Complex> (d, dv) { }
 };
 
 extern OCTAVE_API ComplexNDArray conj (const ComplexNDArray& a);
--- a/liboctave/CRowVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/CRowVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -114,9 +114,6 @@
   void clear (octave_idx_type n)
     { Array<Complex>::clear (1, n); }
 
-private:
-
-  ComplexRowVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/ChangeLog	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/ChangeLog	Fri Feb 26 12:05:48 2010 +0100
@@ -1,3 +1,41 @@
+2010-02-26  Jaroslav Hajek  <highegg@gmail.com>
+
+	* Array.h (Array<T>::ArrayRep): Simplify copy constructor. Add
+	conversion constructor.
+	(Array<T>): Remove pointer acquiring ctors.
+	(Array<T>::maybe_economize): Update.
+	(Array<T>::make_unique): Update.
+	* Array.cc (Array<T>::fill): Update.
+
+	* MArray.h (MArray<T>::MArray<T> (T *, ...)): Remove.
+	* DiagArray2.h (DiagArray2<T>::DiagArray2<T> (T *, ...)): Remove.
+	* MDiagArray2.h (MDiagArray2<T>::MDiagArray2<T> (T *, ...)): Remove.
+	* Array3.h (Array3<T>::Array3<T> (T *, ...)): Remove.
+
+	* dColVector.h (ColumnVector::ColumnVector (T *, ...)): Remove.
+	* fColVector.h (FloatColumnVector::FloatColumnVector (T *, ...)): Remove.
+	* CColVector.h (ComplexColumnVector::ComplexColumnVector (T *, ...)): Remove.
+	* fCColVector.h (FloatComplexColumnVector::FloatComplexColumnVector (T *, ...)): Remove.
+
+	* dRowVector.h (RowVector::RowVector (T *, ...)): Remove.
+	* fRowVector.h (FloatRowVector::FloatRowVector (T *, ...)): Remove.
+	* CRowVector.h (ComplexRowVector::ComplexRowVector (T *, ...)): Remove.
+	* fCRowVector.h (FloatComplexRowVector::FloatComplexRowVector (T *, ...)): Remove.
+
+	* dMatrix.h (Matrix::Matrix (T *, ...)): Remove.
+	* fMatrix.h (FloatMatrix::FloatMatrix (T *, ...)): Remove.
+	* CMatrix.h (ComplexMatrix::ComplexMatrix (T *, ...)): Remove.
+	* fCMatrix.h (FloatComplexMatrix::FloatComplexMatrix (T *, ...)): Remove.
+	* boolMatrix.h (boolMatrix::boolMatrix (T *, ...)): Remove.
+	* chMatrix.h (charMatrix::charMatrix (T *, ...)): Remove.
+
+	* dNDArray.h (NDArray::NDArray (T *, ...)): Remove.
+	* fNDArray.h (FloatNDArray::FloatNDArray (T *, ...)): Remove.
+	* CNDArray.h (ComplexNDArray::ComplexNDArray (T *, ...)): Remove.
+	* fCNDArray.h (FloatComplexNDArray::FloatComplexNDArray (T *, ...)): Remove.
+	* boolNDArray.h (boolNDArray::boolNDArray (T *, ...)): Remove.
+	* chNDArray.h (charNDArray::charNDArray (T *, ...)): Remove.
+
 2010-02-26  Jaroslav Hajek  <highegg@gmail.com>
 
 	* DiagArray2.h (DiagArray2): Clean up ctors. Remove Proxy class.
--- a/liboctave/DiagArray2.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/DiagArray2.h	Fri Feb 26 12:05:48 2010 +0100
@@ -41,9 +41,6 @@
 protected:
   octave_idx_type d1, d2;
 
-  DiagArray2 (T *d, octave_idx_type r, octave_idx_type c) 
-    : Array<T> (d, std::min (r, c), 1), d1 (r), d2 (c) { }
-
 public:
 
   using Array<T>::element_type;
--- a/liboctave/MArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/MArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -39,11 +39,6 @@
 class
 MArray : public Array<T>
 {
-protected:
-
-  MArray (T *d, octave_idx_type m, octave_idx_type n) : Array<T> (d, m, n) { }
-  MArray (T *d, const dim_vector& dv) : Array<T> (d, dv) { }
-
 public:
   
   MArray (void) : Array<T> () {}
--- a/liboctave/MDiagArray2.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/MDiagArray2.h	Fri Feb 26 12:05:48 2010 +0100
@@ -40,10 +40,6 @@
 class
 MDiagArray2 : public DiagArray2<T>
 {
-protected:
-
-  MDiagArray2 (T *d, octave_idx_type r, octave_idx_type c) : DiagArray2<T> (d, r, c) { }
-
 public:
   
   MDiagArray2 (void) : DiagArray2<T> () { }
--- a/liboctave/boolMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/boolMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -78,9 +78,6 @@
 
   static bool resize_fill_value (void) { return false; }
 
-private:
-
-  boolMatrix (bool *b, octave_idx_type r, octave_idx_type c) : Array<bool> (b, r, c) { }
 };
 
 MM_BOOL_OP_DECLS (boolMatrix, boolMatrix, OCTAVE_API)
--- a/liboctave/boolNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/boolNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -103,9 +103,6 @@
 
   boolNDArray diag (octave_idx_type k = 0) const;
 
-private:
-
-  boolNDArray (bool *d, dim_vector& dv) : Array<bool> (d, dv) { }
 };
 
 NDND_BOOL_OP_DECLS (boolNDArray, boolNDArray, OCTAVE_API)
--- a/liboctave/chMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/chMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -88,9 +88,6 @@
 
   static char resize_fill_value (void) { return '\0'; }
 
-private:
-
-  charMatrix (char *ch, octave_idx_type r, octave_idx_type c) : Array<char> (ch, r, c) { }
 };
 
 MS_CMP_OP_DECLS (charMatrix, char, OCTAVE_API)
--- a/liboctave/chNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/chNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -96,9 +96,6 @@
 
   charNDArray diag (octave_idx_type k = 0) const;
 
-private:
-
-  charNDArray (char *d, dim_vector& dv) : Array<char> (d, dv) { }
 };
 
 NDS_CMP_OP_DECLS (charNDArray, char, OCTAVE_API)
--- a/liboctave/dColVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/dColVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -103,9 +103,6 @@
   void clear (octave_idx_type n)
     { Array<double>::clear (n, 1); }
 
-private:
-
-  ColumnVector (double *d, octave_idx_type l) : MArray<double> (d, l, 1) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/dDiagMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/dDiagMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -109,9 +109,6 @@
 
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const DiagMatrix& a);
 
-private:
-
-  DiagMatrix (double *d, octave_idx_type nr, octave_idx_type nc) : MDiagArray2<double> (d, nr, nc) { }
 };
 
 OCTAVE_API DiagMatrix real (const ComplexDiagMatrix& a);
--- a/liboctave/dMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/dMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -326,9 +326,6 @@
 
   static double resize_fill_value (void) { return 0; }
 
-private:
-
-  Matrix (double *d, octave_idx_type r, octave_idx_type c) : MArray<double> (d, r, c) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/dNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/dNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -160,9 +160,6 @@
       return *this; 
     }
 
-private:
-
-  NDArray (double *d, const dim_vector& dv) : MArray<double> (d, dv) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/dRowVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/dRowVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -96,9 +96,6 @@
   void clear (octave_idx_type n)
     { Array<double>::clear (1, n); }
 
-private:
-
-  RowVector (double *d, octave_idx_type l) : MArray<double> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/fCColVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fCColVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -134,9 +134,6 @@
   void clear (octave_idx_type n)
     { Array<FloatComplex>::clear (n, 1); }
 
-private:
-
-  FloatComplexColumnVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, l, 1) { }
 };
 
 MARRAY_FORWARD_DEFS (MArray, FloatComplexColumnVector, FloatComplex)
--- a/liboctave/fCDiagMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fCDiagMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -131,10 +131,6 @@
 
   friend std::ostream& operator << (std::ostream& os, const FloatComplexDiagMatrix& a);
 
-private:
-
-  FloatComplexDiagMatrix (FloatComplex *d, octave_idx_type nr, octave_idx_type nc)
-    : MDiagArray2<FloatComplex> (d, nr, nc) { }
 };
 
 OCTAVE_API FloatComplexDiagMatrix conj (const FloatComplexDiagMatrix& a);
--- a/liboctave/fCMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fCMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -373,9 +373,6 @@
 
   static FloatComplex resize_fill_value (void) { return FloatComplex (0.0, 0.0); }
 
-private:
-
-  FloatComplexMatrix (FloatComplex *d, octave_idx_type r, octave_idx_type c) : MArray<FloatComplex> (d, r, c) { }
 };
 
 extern OCTAVE_API FloatComplexMatrix conj (const FloatComplexMatrix& a);
--- a/liboctave/fCNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fCNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -148,10 +148,6 @@
       return *this; 
     }
 
-private:
-
-  FloatComplexNDArray (FloatComplex *d, const dim_vector& dv)
-    : MArray<FloatComplex> (d, dv) { }
 };
 
 extern OCTAVE_API FloatComplexNDArray conj (const FloatComplexNDArray& a);
--- a/liboctave/fCRowVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fCRowVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -115,9 +115,6 @@
   void clear (octave_idx_type n)
     { Array<FloatComplex>::clear (1, n); }
 
-private:
-
-  FloatComplexRowVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/fColVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fColVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -103,9 +103,6 @@
   void clear (octave_idx_type n)
     { Array<float>::clear (n, 1); }
 
-private:
-
-  FloatColumnVector (float *d, octave_idx_type l) : MArray<float> (d, l, 1) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/fDiagMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fDiagMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -109,9 +109,6 @@
 
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const FloatDiagMatrix& a);
 
-private:
-
-  FloatDiagMatrix (float *d, octave_idx_type nr, octave_idx_type nc) : MDiagArray2<float> (d, nr, nc) { }
 };
 
 OCTAVE_API FloatDiagMatrix real (const FloatComplexDiagMatrix& a);
--- a/liboctave/fMatrix.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fMatrix.h	Fri Feb 26 12:05:48 2010 +0100
@@ -326,9 +326,6 @@
 
   static float resize_fill_value (void) { return 0; }
 
-private:
-
-  FloatMatrix (float *d, octave_idx_type r, octave_idx_type c) : MArray<float> (d, r, c) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/fNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -157,9 +157,6 @@
       return *this; 
     }
 
-private:
-
-  FloatNDArray (float *d, const dim_vector& dv) : MArray<float> (d, dv) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/fRowVector.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/fRowVector.h	Fri Feb 26 12:05:48 2010 +0100
@@ -96,9 +96,6 @@
   void clear (octave_idx_type n)
     { Array<float>::clear (1, n); }
 
-private:
-
-  FloatRowVector (float *d, octave_idx_type l) : MArray<float> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/intNDArray.h	Fri Feb 26 11:44:38 2010 +0100
+++ b/liboctave/intNDArray.h	Fri Feb 26 12:05:48 2010 +0100
@@ -116,9 +116,6 @@
 
   static T resize_fill_value (void) { return 0; }
 
-protected:
-
-  intNDArray (T *d, dim_vector& dv) : MArray<T> (d, dv) { }
 };
 
 // i/o