# HG changeset patch # User Jaroslav Hajek # Date 1271155524 -7200 # Node ID 40c58502a78b7fedfdeb27326f3a7bedf72dfaea # Parent c5005bc2b7a9f28df37fcd6cf1fad43d04d42d86 improve conversion & copy ctors of sparse matrix diff -r c5005bc2b7a9 -r 40c58502a78b liboctave/Sparse.h --- a/liboctave/Sparse.h Tue Apr 13 12:36:24 2010 +0200 +++ b/liboctave/Sparse.h Tue Apr 13 12:45:24 2010 +0200 @@ -29,6 +29,7 @@ #include #include +#include #include "Array.h" #include "dim-vector.h" @@ -97,13 +98,21 @@ : d (new T [a.nzmx]), r (new octave_idx_type [a.nzmx]), c (new octave_idx_type [a.ncols + 1]), nzmx (a.nzmx), nrows (a.nrows), ncols (a.ncols), count (1) { - for (octave_idx_type i = 0; i < nzmx; i++) - { - d[i] = a.d[i]; - r[i] = a.r[i]; - } - for (octave_idx_type i = 0; i < ncols + 1; i++) - c[i] = a.c[i]; + octave_idx_type nz = a.nnz (); + copy_or_memcpy (nz, a.d, d); + copy_or_memcpy (nz, a.r, r); + copy_or_memcpy (ncols + 1, a.c, c); + } + + template + SparseRep (const Sparse::SparseRep& a) + : d (new T [a.nzmx]), r (new octave_idx_type [a.nzmx]), c (new octave_idx_type [a.ncols + 1]), + nzmx (a.nzmx), nrows (a.nrows), ncols (a.ncols), count (1) + { + octave_idx_type nz = a.nnz (); + std::copy (a.d, a.d + nz, d); + copy_or_memcpy (nz, a.r, r); + copy_or_memcpy (ncols + 1, a.c, c); } ~SparseRep (void) { delete [] d; delete [] r; delete [] c; } @@ -196,8 +205,10 @@ : rep (new typename Sparse::SparseRep (nr, nc, nz)), dimensions (dim_vector (nr, nc)) { } - // Type conversion case. - template Sparse (const Sparse& a); + // Type conversion case. Preserves capacity (). + template Sparse (const Sparse& a) + : rep (new typename Sparse::SparseRep (a.rep)), + dimensions (a.dimensions) { } // No type conversion case. Sparse (const Sparse& a)