Mercurial > hg > octave-lyh
diff liboctave/idx-vector.cc @ 9479:d9716e3ee0dd
supply optimized compiled sub2ind & ind2sub
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 03 Aug 2009 15:52:40 +0200 |
parents | 47f19c11b558 |
children | a9b37bae1802 |
line wrap: on
line diff
--- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -540,6 +540,49 @@ return res; } +void +idx_vector::copy_data (octave_idx_type *data) const +{ + octave_idx_type len = rep->length (0); + + switch (rep->idx_class ()) + { + case class_colon: + current_liboctave_error_handler ("colon not allowed"); + break; + case class_range: + { + idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); + octave_idx_type start = r->get_start (), step = r->get_step (); + octave_idx_type i, j; + if (step == 1) + for (i = start, j = start + len; i < j; i++) *data++ = i; + else if (step == -1) + for (i = start, j = start - len; i > j; i--) *data++ = i; + else + for (i = 0, j = start; i < len; i++, j += step) *data++ = j; + } + break; + case class_scalar: + { + idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); + *data = r->get_data (); + } + break; + case class_vector: + { + idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep); + const octave_idx_type *rdata = r->get_data (); + std::copy (rdata, rdata + len, data); + } + break; + default: + assert (false); + break; + } + +} + idx_vector idx_vector::complement (octave_idx_type n) const { @@ -596,6 +639,43 @@ return retval; } +void idx_vector::unconvert (idx_class_type& iclass, + double& scalar, Range& range, Array<double>& array) const +{ + iclass = idx_class (); + switch (iclass) + { + case class_colon: + break; + case class_range: + { + idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); + double start = r->get_start (), step = r->get_step (); + range = Range (start+1, step, r->length (0)); + } + break; + case class_scalar: + { + idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); + scalar = r->get_data () + 1; + } + break; + case class_vector: + { + idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep); + const octave_idx_type *data = r->get_data (); + array = Array<double> (r->orig_dimensions ()); + octave_idx_type len = r->length (0); + for (octave_idx_type i = 0; i < len; i++) + array.xelem (i) = data[i] + 1; + } + break; + default: + assert (false); + break; + } +} + octave_idx_type idx_vector::freeze (octave_idx_type z_len, const char *, bool resize_ok) {