changeset 6457:a58b5981ab65

[project @ 2007-03-26 16:51:46 by jwe]
author jwe
date Mon, 26 Mar 2007 16:51:47 +0000
parents 7f5316cadaa2
children 6588b4fe0869
files liboctave/ChangeLog liboctave/Range.cc liboctave/idx-vector.cc
diffstat 3 files changed, 22 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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  <dbateman@free.fr>
+
+	* Range.cc (Range::all_elements_are_ints): Improve check.
+	* 
+
 2007-03-26  John W. Eaton  <jwe@octave.org>
 
 	* chNDArray.cc, chMatrix.cc: Also generate comparison and bool ops.
--- 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
--- 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<octave_idx_type> (r.base ());
+      octave_idx_type step = static_cast<octave_idx_type> (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)