diff liboctave/Array.h @ 11507:c3ad80f4ce36

Array.h, Array.cc: more constructor fixes
author John W. Eaton <jwe@octave.org>
date Thu, 13 Jan 2011 06:01:08 -0500
parents 9478b216752e
children fd0a3ac60b0e
line wrap: on
line diff
--- a/liboctave/Array.h	Thu Jan 13 05:42:24 2011 -0500
+++ b/liboctave/Array.h	Thu Jan 13 06:01:08 2011 -0500
@@ -125,9 +125,9 @@
 
 protected:
 
-  typename Array<T>::ArrayRep *rep;
+  dim_vector dimensions;
 
-  dim_vector dimensions;
+  typename Array<T>::ArrayRep *rep;
 
   // Rationale:
   // slice_data is a pointer to rep->data, denoting together with slice_len the
@@ -142,11 +142,9 @@
   // slice constructor
   Array (const Array<T>& a, const dim_vector& dv,
          octave_idx_type l, octave_idx_type u)
-    : rep(a.rep), dimensions (dv)
+    : dimensions (dv), rep(a.rep), slice_data (a.slice_data+l), slice_len (u-l)
     {
       rep->count++;
-      slice_data = a.slice_data + l;
-      slice_len = u - l;
       dimensions.chop_trailing_singletons ();
     }
 
@@ -165,57 +163,49 @@
   // Empty ctor (0x0).
 
   Array (void)
-    : rep (nil_rep ()), dimensions () 
+    : dimensions (), rep (nil_rep ()), slice_data (rep->data),
+      slice_len (rep->len)
     { 
       rep->count++; 
-      slice_data = rep->data;
-      slice_len = rep->len;
     }
 
   // Obsolete 1D ctor (there are no 1D arrays).
   explicit Array (octave_idx_type n) GCC_ATTR_DEPRECATED
-    : rep (new typename Array<T>::ArrayRep (n)), dimensions (n, 1) 
-    { 
-      slice_data = rep->data;
-      slice_len = rep->len;
-    }
+    : dimensions (n, 1), rep (new typename Array<T>::ArrayRep (n)),
+      slice_data (rep->data), slice_len (rep->len)
+    { }
 
   // 2D uninitialized ctor.
   explicit Array (octave_idx_type m, octave_idx_type n)
-    : rep (), dimensions (m, n) 
-    { 
-      rep = new typename Array<T>::ArrayRep (dimensions.safe_numel ());
-      slice_data = rep->data;
-      slice_len = rep->len;
-    }
+    : dimensions (m, n),
+      rep (new typename Array<T>::ArrayRep (dimensions.safe_numel ())), 
+      slice_data (rep->data), slice_len (rep->len)
+    { }
 
   // 2D initialized ctor.
   explicit Array (octave_idx_type m, octave_idx_type n, const T& val)
-    : rep (), dimensions (m, n) 
+    : dimensions (m, n),
+      rep (new typename Array<T>::ArrayRep (dimensions.safe_numel ())),
+      slice_data (rep->data), slice_len (rep->len)
     { 
-      rep = new typename Array<T>::ArrayRep (dimensions.safe_numel ());
-      slice_data = rep->data;
-      slice_len = rep->len;
       fill (val);
     }
 
   // nD uninitialized ctor.
   explicit Array (const dim_vector& dv)
-    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
-      dimensions (dv) 
+    : dimensions (dv),
+      rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
+      slice_data (rep->data), slice_len (rep->len)
     { 
-      slice_data = rep->data;
-      slice_len = rep->len;
       dimensions.chop_trailing_singletons ();
     }
 
   // nD initialized ctor.
   explicit Array (const dim_vector& dv, const T& val)
-    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
-      dimensions (dv)
+    : dimensions (dv),
+      rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
+      slice_data (rep->data), slice_len (rep->len)
     {
-      slice_data = rep->data;
-      slice_len = rep->len;
       fill (val);
       dimensions.chop_trailing_singletons ();
     }
@@ -228,20 +218,17 @@
   // Type conversion case.
   template <class U>
   Array (const Array<U>& a)
-    : rep (new typename Array<T>::ArrayRep (a.data (), a.length ())),
-      dimensions (a.dims ())
-    {
-      slice_data = rep->data;
-      slice_len = rep->len;
-    }
+    : dimensions (a.dims ()),
+      rep (new typename Array<T>::ArrayRep (a.data (), a.length ())),
+      slice_data (rep->data), slice_len (rep->len)
+    { }
 
   // No type conversion case.
   Array (const Array<T>& a)
-    : rep (a.rep), dimensions (a.dimensions)
+    : dimensions (a.dimensions), rep (a.rep), slice_data (a.slice_data),
+      slice_len (a.slice_len)
     {
       rep->count++;
-      slice_data = a.slice_data;
-      slice_len = a.slice_len;
     }
 
 public: