Mercurial > hg > octave-lyh
diff liboctave/idx-vector.cc @ 10339:de2d43bcb083
optimize some lazy index operations
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 19 Feb 2010 11:47:47 +0100 |
parents | 07ebe522dac2 |
children | 9c4daf174387 |
line wrap: on
line diff
--- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -62,6 +62,15 @@ ("internal error: idx_vector index out of range."); } +Array<octave_idx_type> +idx_vector::idx_base_rep::as_array (void) +{ + (*current_liboctave_error_handler) + ("internal error: as_array not allowed for this index class."); + + return Array<octave_idx_type> (); +} + DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_colon_rep); idx_vector::idx_colon_rep::idx_colon_rep (char c) @@ -207,6 +216,16 @@ static_cast<double> (step), len); } +Array<octave_idx_type> +idx_vector::idx_range_rep::as_array (void) +{ + Array<octave_idx_type> retval (dim_vector (1, len)); + for (octave_idx_type i = 0; i < len; i++) + retval.xelem (i) = start + len*step; + + return retval; +} + inline octave_idx_type convert_index (octave_idx_type i, bool& conv_error, octave_idx_type& ext) @@ -289,6 +308,12 @@ return data + 1; } +Array<octave_idx_type> +idx_vector::idx_scalar_rep::as_array (void) +{ + return Array<octave_idx_type> (dim_vector (1, 1), data); +} + DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_vector_rep); template <class T> @@ -592,6 +617,23 @@ return retval; } +Array<octave_idx_type> +idx_vector::idx_vector_rep::as_array (void) +{ + if (aowner) + return *aowner; + else + { + Array<octave_idx_type> retval (orig_dims); + std::memcpy (retval.fortran_vec (), data, len*sizeof (octave_idx_type)); + // Delete the old copy and share the data instead to save memory. + delete [] data; + data = retval.fortran_vec (); + aowner = new Array<octave_idx_type> (retval); + return retval; + } +} + DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_mask_rep); idx_vector::idx_mask_rep::idx_mask_rep (bool b) @@ -1095,6 +1137,12 @@ } } +Array<octave_idx_type> +idx_vector::as_array (void) const +{ + return rep->as_array (); +} + octave_idx_type idx_vector::freeze (octave_idx_type z_len, const char *, bool resize_ok) {