# HG changeset patch # User jwe # Date 1174927907 0 # Node ID a58b5981ab6582093e601b13b63628a5001b628d # Parent 7f5316cadaa24cbfa6fe2020975275f4b3ca293f [project @ 2007-03-26 16:51:46 by jwe] diff -r 7f5316cadaa2 -r a58b5981ab65 liboctave/ChangeLog --- a/liboctave/ChangeLog Mon Mar 26 16:18:26 2007 +0000 +++ b/liboctave/ChangeLog Mon Mar 26 16:51:47 2007 +0000 @@ -1,3 +1,8 @@ +2007-03-26 David Bateman + + * Range.cc (Range::all_elements_are_ints): Improve check. + * + 2007-03-26 John W. Eaton * chNDArray.cc, chMatrix.cc: Also generate comparison and bool ops. diff -r 7f5316cadaa2 -r a58b5981ab65 liboctave/Range.cc --- a/liboctave/Range.cc Mon Mar 26 16:18:26 2007 +0000 +++ b/liboctave/Range.cc Mon Mar 26 16:51:47 2007 +0000 @@ -39,11 +39,12 @@ Range::all_elements_are_ints (void) const { // If the base and increment are ints, the final value in the range - // will also be an integer, even if the limit is not. + // will also be an integer, even if the limit is not. If there is one + // or fewer elements only the base needs to be an integer return (! (xisnan (rng_base) || xisnan (rng_inc)) - && NINTbig (rng_base) == rng_base - && NINTbig (rng_inc) == rng_inc); + && (NINTbig (rng_base) == rng_base || rng_nelem < 1) + && (NINTbig (rng_inc) == rng_inc || rng_nelem <= 1)); } Matrix diff -r 7f5316cadaa2 -r a58b5981ab65 liboctave/idx-vector.cc --- a/liboctave/idx-vector.cc Mon Mar 26 16:18:26 2007 +0000 +++ b/liboctave/idx-vector.cc Mon Mar 26 16:51:47 2007 +0000 @@ -183,27 +183,25 @@ return; } - double b = r.base (); - double step = r.inc (); - data = new octave_idx_type [len]; - bool conversion_error = false; + // If all elements are ints, we can generate the indexes as integers + // and save tons of tests. - for (octave_idx_type i = 0; i < len; i++) - { - double val = b + i * step; + if (r.all_elements_are_ints ()) + { + octave_idx_type b = static_cast (r.base ()); + octave_idx_type step = static_cast (r.inc ()); - if (idx_is_inf_or_nan (val)) - return; - else - data[i] = tree_to_mat_idx (val, conversion_error); + data[0] = b - 1; + for (octave_idx_type i = 1; i < len; i++) + data[i] = data[i-1] + step; - if (conversion_error) - return; + init_state (); } - - init_state (); + else + (*current_liboctave_error_handler) + ("expecting integer index, found non integer Range"); } IDX_VEC_REP::idx_vector_rep (double d)