# HG changeset patch # User jwe # Date 813114740 0 # Node ID d89532de8e726713ecd4ff6523bc94edc13f8797 # Parent d1fe5918e16b3fbe7a45d9d1978f9d3d47495295 [project @ 1995-10-08 01:12:20 by jwe] diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -36,20 +36,6 @@ // The real representation of all arrays. template -ArrayRep::ArrayRep (T *d, int l) -{ - data = d; - len = l; -} - -template -ArrayRep::ArrayRep (void) -{ - len = 0; - data = (T *) 0; -} - -template ArrayRep::ArrayRep (int n) { len = n; @@ -74,13 +60,6 @@ } template -int -ArrayRep::length (void) const -{ - return len; -} - -template T& ArrayRep::elem (int n) { @@ -98,27 +77,6 @@ // all the derived classes. template -Array::Array (T *d, int l) -{ - rep = new ArrayRep (d, l); - rep->count = 1; -} - -template -Array::Array (void) -{ - rep = new ArrayRep; - rep->count = 1; -} - -template -Array::Array (int n) -{ - rep = new ArrayRep (n); - rep->count = 1; -} - -template Array::Array (int n, const T& val) { rep = new ArrayRep (n); @@ -128,20 +86,6 @@ } template -Array::Array (const Array& a) -{ - rep = a.rep; - rep->count++; -} - -template -Array::~Array (void) -{ - if (--rep->count <= 0) - delete rep; -} - -template Array& Array::operator = (const Array& a) { @@ -158,33 +102,6 @@ } template -int -Array::capacity (void) const -{ - return rep->length (); -} - -template -int -Array::length (void) const -{ - return rep->length (); -} - -template -T& -Array::elem (int n) -{ - if (rep->count > 1) - { - --rep->count; - rep = new ArrayRep (*rep); - rep->count = 1; - } - return rep->elem (n); -} - -template T& Array::checkelem (int n) { @@ -198,20 +115,6 @@ } template -T& -Array::operator () (int n) -{ - return checkelem (n); -} - -template -T& -Array::xelem (int n) -{ - return rep->elem (n); -} - -template T Array::elem (int n) const { @@ -309,13 +212,6 @@ } template -const T * -Array::data (void) const -{ - return rep->data; -} - -template T * Array::fortran_vec (void) { @@ -331,105 +227,6 @@ // Two dimensional array class. template -Array2::Array2 (T *d, int n, int m) : Array (d, n*m) -{ - d1 = n; - d2 = m; -} - -template -Array2::Array2 (void) : Array () -{ - d1 = 0; - d2 = 0; -} - -template -Array2::Array2 (int n, int m) : Array (n*m) -{ - d1 = n; - d2 = m; -} - -template -Array2::Array2 (int n, int m, const T& val) : Array (n*m, val) -{ - d1 = n; - d2 = m; -} - -template -Array2::Array2 (const Array2& a) : Array (a) -{ - d1 = a.d1; - d2 = a.d2; -} - -template -Array2::Array2 (const DiagArray& a) - : Array (a.rows () * a.cols (), T (0)) -{ - for (int i = 0; i < a.length (); i++) - elem (i, i) = a.elem (i, i); -} - -template -Array2& -Array2::operator = (const Array2& a) -{ - if (this != &a) - { - Array::operator = (a); - d1 = a.d1; - d2 = a.d2; - } - - return *this; -} - -template -int -Array2::dim1 (void) const -{ - return d1; -} - -template -int -Array2::dim2 (void) const -{ - return d2; -} - -template -int -Array2::rows (void) const -{ - return d1; -} - -template -int -Array2::cols (void) const -{ - return d2; -} - -template -int -Array2::columns (void) const -{ - return d2; -} - -template -T& -Array2::elem (int i, int j) -{ - return Array::elem (d1*j+i); -} - -template T& Array2::checkelem (int i, int j) { @@ -443,26 +240,6 @@ } template -T& -Array2::operator () (int i, int j) -{ - if (i < 0 || j < 0 || i >= d1 || j >= d2) - { - (*current_liboctave_error_handler) ("range error"); - static T foo; - return foo; - } - return Array::elem (d1*j+i); -} - -template -T& -Array2::xelem (int i, int j) -{ - return Array::xelem (d1*j+i); -} - -template T Array2::elem (int i, int j) const { @@ -588,70 +365,6 @@ // Three dimensional array class. template -Array3::Array3 (T *d, int n, int m, int k) : Array2 (d, n, m*k) -{ - d2 = m; - d3 = k; -} - -template -Array3::Array3 (void) : Array2 () -{ - d2 = 0; - d3 = 0; -} - -template -Array3::Array3 (int n, int m, int k) : Array2 (n, m*k) -{ - d2 = m; - d3 = k; -} - -template -Array3::Array3 (int n, int m, int k, const T& val) : Array2 (n, m*k, val) -{ - d2 = m; - d3 = k; -} - -template -Array3::Array3 (const Array3& a) : Array2 (a) -{ - d2 = a.d2; - d3 = a.d3; -} - -template -Array3& -Array3::operator = (const Array3& a) -{ - if (this != &a) - { - Array::operator = (a); - d1 = a.d1; - d2 = a.d2; - d3 = a.d3; - } - - return *this; -} - -template -int -Array3::dim3 (void) const -{ - return d3; -} - -template -T& -Array3::elem (int i, int j, int k) -{ - return Array2::elem (i, d2*k+j); -} - -template T& Array3::checkelem (int i, int j, int k) { @@ -665,26 +378,6 @@ } template -T& -Array3::operator () (int i, int j, int k) -{ - if (i < 0 || j < 0 || k < 0 || i >= d1 || j >= d2 || k >= d3) - { - (*current_liboctave_error_handler) ("range error"); - static T foo; - return foo; - } - return Array2::elem (i, d2*k+j); -} - -template -T& -Array3::xelem (int i, int j, int k) -{ - return Array2::xelem (i, d2*k+j); -} - -template T Array3::elem (int i, int j, int k) const { @@ -735,110 +428,6 @@ // A two-dimensional array with diagonal elements only. -template -DiagArray::DiagArray (T *d, int r, int c) : Array (d, r < c ? r : c) -{ - nr = r; - nc = c; -} - -template -DiagArray::DiagArray (void) : Array () -{ - nr = 0; - nc = 0; -} - -template -DiagArray::DiagArray (int n) : Array (n) -{ - nr = n; - nc = n; -} - -template -DiagArray::DiagArray (int n, const T& val) : Array (n, val) -{ - nr = nc = n; -} - -template -DiagArray::DiagArray (int r, int c) : Array (r < c ? r : c) -{ - nr = r; - nc = c; -} - -template -DiagArray::DiagArray (int r, int c, const T& val) - : Array (r < c ? r : c, val) -{ - nr = r; - nc = c; -} - -template -DiagArray::DiagArray (const Array& a) : Array (a) -{ - nr = nc = a.length (); -} - -template -DiagArray::DiagArray (const DiagArray& a) : Array (a) -{ - nr = a.nr; - nc = a.nc; -} - -template -DiagArray& -DiagArray::operator = (const DiagArray& a) -{ - if (this != &a) - { - Array::operator = (a); - nr = a.nr; - nc = a.nc; - } - - return *this; -} - -template -int -DiagArray::dim1 (void) const -{ - return nr; -} - -template -int -DiagArray::dim2 (void) const -{ - return nc; -} - -template -int -DiagArray::rows (void) const -{ - return nr; -} - -template -int -DiagArray::cols (void) const -{ - return nc; -} - -template -int -DiagArray::columns (void) const -{ - return nc; -} - #if 1 template T& diff --git a/liboctave/Array.h b/liboctave/Array.h --- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -52,31 +52,41 @@ friend class Array3; friend class DiagArray; +private: + + int count; + int len; + T *data; + protected: - ArrayRep (T *d, int l); + ArrayRep (T *d, int l) + { + len = l; + data = d; + } public: - ArrayRep (void); + ArrayRep (void) + { + len = 0; + data = 0; + } + ArrayRep (int n); + ArrayRep (const ArrayRep& a); ~ArrayRep (void); - int length (void) const; + int length (void) const { return len; } T& elem (int n); T elem (int n) const; void resize (int n); - -private: - - T *data; - int len; - int count; }; // One dimensional array class. Handles the reference counting for @@ -89,30 +99,62 @@ ArrayRep *rep; - Array (T *d, int l); + Array (T *d, int l) + { + rep = new ArrayRep (d, l); + rep->count = 1; + } public: - Array (void); - Array (int n); + Array (void) + { + rep = new ArrayRep; + rep->count = 1; + } + + Array (int n) + { + rep = new ArrayRep (n); + rep->count = 1; + } + Array (int n, const T& val); - Array (const Array& a); + Array (const Array& a) + { + rep = a.rep; + rep->count++; + } - ~Array (void); + ~Array (void) + { + if (--rep->count <= 0) + delete rep; + } Array& operator = (const Array& a); - int capacity (void) const; - int length (void) const; + int capacity (void) const { return rep->length (); } + int length (void) const { return rep->length (); } - T& elem (int n); + T& elem (int n) + { + if (rep->count > 1) + { + --rep->count; + rep = new ArrayRep (*rep); + rep->count = 1; + } + return rep->elem (n); + } + T& checkelem (int n); - T& operator () (int n); + T& operator () (int n) { return checkelem (n); } // No checking. - T& xelem (int n); + T& xelem (int n) { return rep->elem (n); } T elem (int n) const; T checkelem (int n) const; @@ -121,7 +163,7 @@ void resize (int n); void resize (int n, const T& val); - const T *data (void) const; + const T *data (void) const { return rep->data; } T *fortran_vec (void); }; @@ -136,34 +178,72 @@ int d1; int d2; - Array2 (T *d, int n, int m); + Array2 (T *d, int n, int m) : Array (d, n*m) + { + d1 = n; + d2 = m; + } public: - Array2 (void); - Array2 (int n, int m); - Array2 (int n, int m, const T& val); - Array2 (const Array2& a); - Array2 (const DiagArray& a); + Array2 (void) : Array () + { + d1 = 0; + d2 = 0; + } + + Array2 (int n, int m) : Array (n*m) + { + d1 = n; + d2 = m; + } + + Array2 (int n, int m, const T& val) : Array (n*m, val) + { + d1 = n; + d2 = m; + } + + Array2 (const Array2& a) : Array (a) + { + d1 = a.d1; + d2 = a.d2; + } + + Array2 (const DiagArray& a) : Array (a.rows () * a.cols (), T (0)) + { + for (int i = 0; i < a.length (); i++) + elem (i, i) = a.elem (i, i); + } ~Array2 (void) { } - Array2& operator = (const Array2& a); - - int dim1 (void) const; - int dim2 (void) const; + Array2& operator = (const Array2& a) + { + if (this != &a) + { + Array::operator = (a); + d1 = a.d1; + d2 = a.d2; + } - int rows (void) const; - int cols (void) const; - int columns (void) const; + return *this; + } + + int dim1 (void) const { return d1; } + int dim2 (void) const { return d2; } - T& elem (int i, int j); + int rows (void) const { return d1; } + int cols (void) const { return d2; } + int columns (void) const { return d2; } + + T& elem (int i, int j) { return Array::elem (d1*j+i); } T& checkelem (int i, int j); - T& operator () (int i, int j); + T& operator () (int i, int j) { return checkelem (i, j); } // No checking. - T& xelem (int i, int j); + T& xelem (int i, int j) { return Array::xelem (d1*j+i); } T elem (int i, int j) const; T checkelem (int i, int j) const; @@ -182,28 +262,62 @@ int d3; - Array3 (T *d, int n, int m, int k); + Array3 (T *d, int n, int m, int k) : Array2 (d, n, m*k) + { + d2 = m; + d3 = k; + } public: - Array3 (void); - Array3 (int n, int m, int k); - Array3 (int n, int m, int k, const T& val); - Array3 (const Array3& a); + Array3 (void) : Array2 () + { + d2 = 0; + d3 = 0; + } + + Array3 (int n, int m, int k) : Array2 (n, m*k) + { + d2 = m; + d3 = k; + } + + Array3 (int n, int m, int k, const T& val) : Array2 (n, m*k, val) + { + d2 = m; + d3 = k; + } + + Array3 (const Array3& a) : Array2 (a) + { + d2 = a.d2; + d3 = a.d3; + } ~Array3 (void) { } - Array3& operator = (const Array3& a); - - int dim3 (void) const; + Array3& operator = (const Array3& a) + { + if (this != &a) + { + Array::operator = (a); + d1 = a.d1; + d2 = a.d2; + d3 = a.d3; + } - T& elem (int i, int j, int k); + return *this; + } + + int dim3 (void) const { return d3; } + + T& elem (int i, int j, int k) { return Array2::elem (i, d2*k+j); } T& checkelem (int i, int j, int k); - T& operator () (int i, int j, int k); + T& operator () (int i, int j, int k) { return checkelem (i, j, k); } // No checking. - T& xelem (int i, int j, int k); + T& xelem (int i, int j, int k) { return Array2::xelem (i, d2*k+j); } T elem (int i, int j, int k) const; T checkelem (int i, int j, int k) const; @@ -291,28 +405,75 @@ int nr; int nc; - DiagArray (T *d, int r, int c); + DiagArray (T *d, int r, int c) : Array (d, r < c ? r : c) + { + nr = r; + nc = c; + } public: - DiagArray (void); - DiagArray (int n); - DiagArray (int n, const T& val); - DiagArray (int r, int c); - DiagArray (int r, int c, const T& val); - DiagArray (const Array& a); - DiagArray (const DiagArray& a); + DiagArray (void) : Array () + { + nr = 0; + nc = 0; + } + + DiagArray (int n) : Array (n) +{ + nr = n; + nc = n; +} + + DiagArray (int n, const T& val) : Array (n, val) +{ + nr = n; + nc = n; +} + + DiagArray (int r, int c) : Array (r < c ? r : c) +{ + nr = r; + nc = c; +} + + DiagArray (int r, int c, const T& val) : Array (r < c ? r : c, val) +{ + nr = r; + nc = c; +} + + DiagArray (const Array& a) : Array (a) +{ + nr = nc = a.length (); +} + + DiagArray (const DiagArray& a) : Array (a) +{ + nr = a.nr; + nc = a.nc; +} ~DiagArray (void) { } - DiagArray& operator = (const DiagArray& a); + DiagArray& operator = (const DiagArray& a) +{ + if (this != &a) + { + Array::operator = (a); + nr = a.nr; + nc = a.nc; + } - int dim1 (void) const; - int dim2 (void) const; + return *this; +} - int rows (void) const; - int cols (void) const; - int columns (void) const; + int dim1 (void) const { return nr; } + int dim2 (void) const { return nc; } + + int rows (void) const { return nr; } + int cols (void) const { return nc; } + int columns (void) const { return nc; } #if 0 inline Proxy elem (int r, int c)