changeset 25287:f692728de113 stable

enable lazy index to numeric conversion (bug #53681) * ov-lazy-idx.h, ov-lazy-idx.h (octave_lazy_index::as_double, octave_lazy_index::as_single, octave_lazy_index::as_int8, octave_lazy_index::as_int16, octave_lazy_index::as_int32, octave_lazy_index::as_int64, octave_lazy_index::as_uint8, octave_lazy_index::as_uint16, octave_lazy_index::as_uint32, octave_lazy_index::as_uint64): New functions. New tests.
author John W. Eaton <jwe@octave.org>
date Thu, 19 Apr 2018 14:32:37 -0400
parents 44c0aca121cc
children c1e344166c4b ff59be58f028
files libinterp/octave-value/ov-lazy-idx.cc libinterp/octave-value/ov-lazy-idx.h
diffstat 2 files changed, 90 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-lazy-idx.cc	Thu Apr 19 08:39:45 2018 -0700
+++ b/libinterp/octave-value/ov-lazy-idx.cc	Thu Apr 19 14:32:37 2018 -0400
@@ -157,6 +157,66 @@
   return index.as_array ().is_sorted_rows (mode);
 }
 
+octave_value
+octave_lazy_index::as_double (void) const
+{
+  return array_value ();
+}
+
+octave_value
+octave_lazy_index::as_single (void) const
+{
+  return float_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_int8 (void) const
+{
+  return int8_array_value  ();
+}
+
+octave_value
+octave_lazy_index::as_int16 (void) const
+{
+  return int16_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_int32 (void) const
+{
+  return int32_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_int64 (void) const
+{
+  return int64_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_uint8 (void) const
+{
+  return uint8_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_uint16 (void) const
+{
+  return uint16_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_uint32 (void) const
+{
+  return uint32_array_value ();
+}
+
+octave_value
+octave_lazy_index::as_uint64 (void) const
+{
+  return uint64_array_value ();
+}
+
 static const std::string value_save_tag ("index_value");
 
 bool octave_lazy_index::save_ascii (std::ostream& os)
@@ -197,3 +257,20 @@
 
   return true;
 }
+
+/*
+%!shared x, y
+%! x = find ([-1, 0, -2, 1, 3, -4] < 0);
+%! y = [1, 3, 6];
+%!assert (typeinfo (x), "lazy_index")
+%!assert (double (x), y)
+%!assert (single (x), single (y))
+%!assert (int8 (x), int8 (y))
+%!assert (int16 (x), int16 (y))
+%!assert (int32 (x), int32 (y))
+%!assert (int64 (x), int64 (y))
+%!assert (uint8 (x), uint8 (y))
+%!assert (uint16 (x), uint16 (y))
+%!assert (uint32 (x), uint32 (y))
+%!assert (uint64 (x), uint64 (y))
+*/
--- a/libinterp/octave-value/ov-lazy-idx.h	Thu Apr 19 08:39:45 2018 -0700
+++ b/libinterp/octave-value/ov-lazy-idx.h	Thu Apr 19 14:32:37 2018 -0400
@@ -187,6 +187,19 @@
     return make_value ().convert_to_str_internal (pad, force, type);
   }
 
+  octave_value as_double (void) const;
+  octave_value as_single (void) const;
+
+  octave_value as_int8 (void) const;
+  octave_value as_int16 (void) const;
+  octave_value as_int32 (void) const;
+  octave_value as_int64 (void) const;
+
+  octave_value as_uint8 (void) const;
+  octave_value as_uint16 (void) const;
+  octave_value as_uint32 (void) const;
+  octave_value as_uint64 (void) const;
+
   void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const
   {
     return make_value ().print_raw (os, pr_as_read_syntax);