Mercurial > octave
diff libinterp/octave-value/ov.cc @ 28646:e26201931ea3
new template class for octave_range objects
* ov-range.h, ov-range.cc (class octave_range): Convert to template.
For now, use specializations to preserve existing behavior for
double-precision ranges. Change all uses.
* ov.h, ov.cc: Update range constructors to create range objects for
integer and float ranges. Provide value extractor functions for
range<T> types that forward to virtual functions in the
octave_base_value class.
* ov-base.cc: Provide virtual value extractor functions for range<T>
types.
* ov-range-traits.h: New file.
* libinterp/octave-value/module.mk: Update.
* Range.h, Range.cc (Range::Range): Deprecate public constructors.
* pt-eval.h, pt-eval.cc (tree_evaluator::execute_range_loop):
New template function.
(tree_evaluator::visit_simple_for_command): Use it to handle looping
when the loop variable expression is a range.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 12 Aug 2020 12:14:17 -0400 |
parents | 7ebe185e3818 |
children | 43ad651cf5a0 |
line wrap: on
line diff
--- a/libinterp/octave-value/ov.cc Thu Aug 20 17:42:26 2020 -0400 +++ b/libinterp/octave-value/ov.cc Wed Aug 12 12:14:17 2020 -0400 @@ -1069,7 +1069,7 @@ } octave_value::octave_value (double base, double limit, double inc) - : rep (new octave_range (base, limit, inc)) + : rep (new ov_range<double> (octave::range<double> (base, inc, limit))) { maybe_mutate (); } @@ -1081,7 +1081,7 @@ error ("invalid range"); if (force_range || ! Vdisable_range) - rep = dynamic_cast<octave_base_value *> (new octave_range (r)); + rep = dynamic_cast<octave_base_value *> (new ov_range<double> (octave::range<double> (r.base (), r.increment (), r.limit ()))); else rep = dynamic_cast<octave_base_value *> (new octave_matrix (r.matrix_value ())); @@ -1107,7 +1107,7 @@ octave_value::octave_value (const octave::range<float>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_float_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<float> (r)) : dynamic_cast<octave_base_value *> (new octave_float_matrix (r.array_value ()))) { maybe_mutate (); @@ -1115,7 +1115,7 @@ octave_value::octave_value (const octave::range<double>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_double_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<double> (r)) : dynamic_cast<octave_base_value *> (new octave_matrix (r.array_value ()))) { maybe_mutate (); @@ -1124,7 +1124,7 @@ octave_value::octave_value (const octave::range<octave_int8>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_int8_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_int8> (r)) : dynamic_cast<octave_base_value *> (new octave_int8_matrix (r.array_value ()))) { maybe_mutate (); @@ -1133,7 +1133,7 @@ octave_value::octave_value (const octave::range<octave_int16>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_int16_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_int16> (r)) : dynamic_cast<octave_base_value *> (new octave_int16_matrix (r.array_value ()))) { maybe_mutate (); @@ -1142,7 +1142,7 @@ octave_value::octave_value (const octave::range<octave_int32>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_int32_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_int32> (r)) : dynamic_cast<octave_base_value *> (new octave_int32_matrix (r.array_value ()))) { maybe_mutate (); @@ -1151,7 +1151,7 @@ octave_value::octave_value (const octave::range<octave_int64>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_int64_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_int64> (r)) : dynamic_cast<octave_base_value *> (new octave_int64_matrix (r.array_value ()))) { maybe_mutate (); @@ -1160,7 +1160,7 @@ octave_value::octave_value (const octave::range<octave_uint8>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_uint8_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_uint8> (r)) : dynamic_cast<octave_base_value *> (new octave_uint8_matrix (r.array_value ()))) { maybe_mutate (); @@ -1169,7 +1169,7 @@ octave_value::octave_value (const octave::range<octave_uint16>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_uint16_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_uint16> (r)) : dynamic_cast<octave_base_value *> (new octave_uint16_matrix (r.array_value ()))) { maybe_mutate (); @@ -1178,7 +1178,7 @@ octave_value::octave_value (const octave::range<octave_uint32>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_uint32_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_uint32> (r)) : dynamic_cast<octave_base_value *> (new octave_uint32_matrix (r.array_value ()))) { maybe_mutate (); @@ -1187,7 +1187,7 @@ octave_value::octave_value (const octave::range<octave_uint64>& r, bool force_range) : rep (force_range || ! Vdisable_range - ? dynamic_cast<octave_base_value *> (new octave_uint64_range (r)) + ? dynamic_cast<octave_base_value *> (new ov_range<octave_uint64> (r)) : dynamic_cast<octave_base_value *> (new octave_uint64_matrix (r.array_value ()))) { maybe_mutate (); @@ -2193,7 +2193,16 @@ XVALUE_EXTRACTOR (Cell, xcell_value, cell_value) XVALUE_EXTRACTOR (Array<std::string>, xcellstr_value, cellstr_value) +XVALUE_EXTRACTOR (octave::range<float>, xfloat_range_value, float_range_value) XVALUE_EXTRACTOR (octave::range<double>, xrange_value, range_value) +XVALUE_EXTRACTOR (octave::range<octave_int8>, xint8_range_value, int8_range_value) +XVALUE_EXTRACTOR (octave::range<octave_int16>, xint16_range_value, int16_range_value) +XVALUE_EXTRACTOR (octave::range<octave_int32>, xint32_range_value, int32_range_value) +XVALUE_EXTRACTOR (octave::range<octave_int64>, xint64_range_value, int64_range_value) +XVALUE_EXTRACTOR (octave::range<octave_uint8>, xuint8_range_value, uint8_range_value) +XVALUE_EXTRACTOR (octave::range<octave_uint16>, xuint16_range_value, uint16_range_value) +XVALUE_EXTRACTOR (octave::range<octave_uint32>, xuint32_range_value, uint32_range_value) +XVALUE_EXTRACTOR (octave::range<octave_uint64>, xuint64_range_value, uint64_range_value) XVALUE_EXTRACTOR (octave_map, xmap_value, map_value) XVALUE_EXTRACTOR (octave_scalar_map, xscalar_map_value, scalar_map_value) @@ -3174,7 +3183,16 @@ octave_diag_matrix::register_type (ti); octave_complex_matrix::register_type (ti); octave_complex_diag_matrix::register_type (ti); - octave_range::register_type (ti); + ov_range<float>::register_type (ti); + ov_range<double>::register_type (ti); + ov_range<octave_int8>::register_type (ti); + ov_range<octave_int16>::register_type (ti); + ov_range<octave_int32>::register_type (ti); + ov_range<octave_int64>::register_type (ti); + ov_range<octave_uint8>::register_type (ti); + ov_range<octave_uint16>::register_type (ti); + ov_range<octave_uint32>::register_type (ti); + ov_range<octave_uint64>::register_type (ti); octave_bool::register_type (ti); octave_bool_matrix::register_type (ti); octave_char_matrix_str::register_type (ti);