# HG changeset patch # User John W. Eaton # Date 1524162757 14400 # Node ID f692728de1133dc905ae1eb256c9f933480d1c25 # Parent 44c0aca121cc57f6284e972ae0116d156ece621c 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. diff -r 44c0aca121cc -r f692728de113 libinterp/octave-value/ov-lazy-idx.cc --- 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)) +*/ diff -r 44c0aca121cc -r f692728de113 libinterp/octave-value/ov-lazy-idx.h --- 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);