diff src/ov-range.cc @ 10613:e103fb2182ce

use internal variable instead of warning state to control whether to allow non-integer ranges as indices
author John W. Eaton <jwe@octave.org>
date Fri, 07 May 2010 15:58:51 -0400
parents 58bcda68ac11
children d61caf612f1e
line wrap: on
line diff
--- a/src/ov-range.cc	Fri May 07 20:53:27 2010 +0100
+++ b/src/ov-range.cc	Fri May 07 15:58:51 2010 -0400
@@ -45,6 +45,9 @@
 #include "ls-hdf5.h"
 #include "ls-utils.h"
 
+// If TRUE, allow ranges with non-integer elements as array indices.
+bool Vallow_noninteger_range_as_index = false;
+
 DEFINE_OCTAVE_ALLOCATOR (octave_range);
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_range, "range", "double");
@@ -151,11 +154,12 @@
     return *idx_cache;
   else
     {
-      if (range.all_elements_are_ints ())
+      if (range.all_elements_are_ints ()
+          || ! Vallow_noninteger_range_as_index)
         return set_idx_cache (idx_vector (range));
       else
         {
-          warning_with_id ("Octave:allow-noninteger-ranges-as-indices",
+          warning_with_id ("Octave:noninteger-range-as-index",
                            "non-integer range used as index");
 
           return octave_value (matrix_value ()).round ().index_vector ();
@@ -307,12 +311,25 @@
   return retval;
 }
 
+boolNDArray
+octave_range::bool_array_value (bool warn) const
+{
+  Matrix m = range.matrix_value ();
+
+  if (m.any_element_is_nan ())
+    error ("invalid conversion from NaN to logical");
+  else if (warn && m.any_element_not_one_or_zero ())
+    gripe_logical_conversion ();
+
+  return boolNDArray (m);
+}
+
 octave_value 
 octave_range::resize (const dim_vector& dv, bool fill) const
 { 
   NDArray retval = array_value (); 
   if (fill)
-    retval.resize (dv, NDArray::resize_fill_value());
+    retval.resize (dv, NDArray::resize_fill_value ());
   else
     retval.resize (dv); 
   return retval; 
@@ -589,3 +606,16 @@
 
   return retval;
 }
+
+DEFUN (allow_noninteger_range_as_index, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Built-in Function} {@var{val} =} allow_noninteger_range_as_index ()\n\
+@deftypefnx {Built-in Function} {@var{old_val} =} allow_noninteger_range_as_index (@var{new_val})\n\
+Query or set the internal variable that controls whether non-integer\n\
+ranges are allowed as indices.  This might be useful for Matlab\n\
+compatibility; however, it is still not entirely compatible because\n\
+Matlab treats the range expression differently in different contexts.\n\
+@end deftypefn")
+{
+  return SET_INTERNAL_VARIABLE (allow_noninteger_range_as_index);
+}