# HG changeset patch # User John W. Eaton # Date 1647499459 14400 # Node ID 2989202f92f8059d26f757f940acfbb22efa28af # Parent f1a9e55d850cb607f69e1ed8d2dc275db0498fbb only allow range to be instantiated * Range.h, Range.cc: Limit range to floating point values. * range-fwd.h: Update forward declaration of range. * ov-base.h, ov-base.cc, ov-range.h, ov-range.cc, ov.h, ov.cc, pt-eval.cc: Temporarily comment out code that uses range objects. diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov-base.cc --- a/libinterp/octave-value/ov-base.cc Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov-base.cc Thu Mar 17 02:44:19 2022 -0400 @@ -811,18 +811,22 @@ err_wrong_type_arg ("octave_base_value::cellstr_value()", type_name ()); } +octave::range +octave_base_value::range_value (void) const +{ + err_wrong_type_arg ("octave_base_value::range_value()", type_name ()); +} + +// For now, disable all but range. + +#if 0 + octave::range octave_base_value::float_range_value (void) const { err_wrong_type_arg ("octave_base_value::float_range_value()", type_name ()); } -octave::range -octave_base_value::range_value (void) const -{ - err_wrong_type_arg ("octave_base_value::range_value()", type_name ()); -} - octave::range octave_base_value::int8_range_value (void) const { @@ -871,6 +875,8 @@ err_wrong_type_arg ("octave_base_value::uint64_range_value()", type_name ()); } +#endif + octave_map octave_base_value::map_value (void) const { diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov-base.h --- a/libinterp/octave-value/ov-base.h Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov-base.h Thu Mar 17 02:44:19 2022 -0400 @@ -629,9 +629,13 @@ virtual Array cellstr_value (void) const; - virtual octave::range float_range_value (void) const; + virtual octave::range range_value (void) const; + + // For now, disable all but range. - virtual octave::range range_value (void) const; +#if 0 + + virtual octave::range float_range_value (void) const; virtual octave::range int8_range_value (void) const; @@ -649,6 +653,8 @@ virtual octave::range uint64_range_value (void) const; +#endif + virtual octave_map map_value (void) const; virtual octave_scalar_map scalar_map_value (void) const; diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov-range.cc --- a/libinterp/octave-value/ov-range.cc Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov-range.cc Thu Mar 17 02:44:19 2022 -0400 @@ -67,10 +67,14 @@ #if defined (HAVE_HDF5) template <> -octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_FLOAT; +octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_DOUBLE; + +// For now, disable all but ov_range. + +# if 0 template <> -octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_DOUBLE; +octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_FLOAT; template <> octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_INT8; @@ -96,15 +100,21 @@ template <> octave_hdf5_id ov_range::hdf5_save_type = H5T_NATIVE_UINT64; +# endif + #else template <> +octave_hdf5_id ov_range::hdf5_save_type = 0; + +// For now, disable all but ov_range. + +#if 0 + +template <> octave_hdf5_id ov_range::hdf5_save_type = 0; template <> -octave_hdf5_id ov_range::hdf5_save_type = 0; - -template <> octave_hdf5_id ov_range::hdf5_save_type = 0; template <> @@ -128,14 +138,20 @@ template <> octave_hdf5_id ov_range::hdf5_save_type = 0; +# endif + #endif +DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA (ov_range, + "range", "double"); + +// For now, disable all but ov_range. + +#if 0 + DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA (ov_range, "float_range", "single"); -DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA (ov_range, - "range", "double"); - DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA (ov_range, "int8_range", "int8"); @@ -160,6 +176,8 @@ DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA (ov_range, "uint64_range", "uint64"); +#endif + template static octave_base_value * default_numeric_conversion_function (const octave_base_value& a) @@ -395,6 +413,17 @@ } template +octave::range +ov_range::range_value (void) const +{ + err_wrong_type_arg ("ov_range::range_value()", type_name ()); +} + +// For now, disable all but ov_range. + +#if 0 + +template octave::range ov_range::float_range_value (void) const { @@ -402,13 +431,6 @@ } template -octave::range -ov_range::range_value (void) const -{ - err_wrong_type_arg ("ov_range::range_value()", type_name ()); -} - -template octave::range ov_range::int8_range_value (void) const { @@ -464,6 +486,8 @@ err_wrong_type_arg ("ov_range::uint64_range_value ()", type_name ()); } +#endif + template octave_value ov_range::convert_to_str_internal (bool pad, bool force, char type) const @@ -691,6 +715,10 @@ // specialize for saving with "reverse" flag +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::save_ascii (std::ostream& os) @@ -719,6 +747,8 @@ return xsave_ascii (os, m_range, true); } +#endif + template bool xload_ascii (std::istream& is, octave::range& r, const bool with_reverse) @@ -756,6 +786,10 @@ // specialize for loading with "reverse" flag +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::load_ascii (std::istream& is) @@ -784,6 +818,8 @@ return xload_ascii (is, m_range, true); } +#endif + /* %!test %! a = b = 1:4; @@ -844,6 +880,10 @@ return xsave_binary (os, save_as_floats, m_range, false); } +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::save_binary (std::ostream& os, bool save_as_floats) @@ -872,6 +912,8 @@ return xsave_binary (os, save_as_floats, m_range, true); } +#endif + template bool xload_binary (std::istream& is, bool swap, @@ -923,6 +965,10 @@ return xload_binary (is, swap, fmt, m_range, false); } +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::load_binary (std::istream& is, bool swap, @@ -955,6 +1001,8 @@ return xload_binary (is, swap, fmt, m_range, true); } +#endif + /* %!test %! a = b = 1:4; @@ -1101,6 +1149,10 @@ #endif } +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::save_hdf5 (octave_hdf5_id loc_id, const char *name, @@ -1177,6 +1229,8 @@ #endif } +#endif + #if defined (HAVE_HDF5) template @@ -1260,6 +1314,10 @@ #endif } +// For now, disable all but ov_range. + +#if 0 + template <> bool ov_range::load_hdf5 (octave_hdf5_id loc_id, const char *name) @@ -1324,6 +1382,8 @@ #endif } +#endif + /* %!testif HAVE_HDF5 %! a = b = 1:4; @@ -1383,15 +1443,19 @@ // Specializations. template <> -octave::range -ov_range::float_range_value (void) const +octave::range +ov_range::range_value (void) const { return m_range; } +// For now, disable all but ov_range. + +#if 0 + template <> -octave::range -ov_range::range_value (void) const +octave::range +ov_range::float_range_value (void) const { return m_range; } @@ -1452,6 +1516,8 @@ return m_range; } +#endif + template <> octave::idx_vector ov_range::index_vector (bool require_integers) const diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov-range.h --- a/libinterp/octave-value/ov-range.h Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov-range.h Thu Mar 17 02:44:19 2022 -0400 @@ -32,6 +32,7 @@ #include #include +#include #include "Array-fwd.h" #include "Range.h" @@ -50,7 +51,8 @@ class octave_value_list; -// Range values. +// For now, we only need ov_range but we don't attempt to +// enforce that restriction. template class @@ -384,9 +386,13 @@ return raw_array_value (); } - OCTINTERP_API octave::range float_range_value (void) const; + OCTINTERP_API octave::range range_value (void) const; + +// For now, disable all but ov_range. - OCTINTERP_API octave::range range_value (void) const; +#if 0 + + OCTINTERP_API octave::range float_range_value (void) const; OCTINTERP_API octave::range int8_range_value (void) const; @@ -404,6 +410,8 @@ OCTINTERP_API octave::range uint64_range_value (void) const; +#endif + OCTINTERP_API octave_value convert_to_str_internal (bool pad, bool force, char type) const; @@ -494,8 +502,13 @@ DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA }; +DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, double) + +// For now, disable all but ov_range. + +#if 0 + DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, float) -DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, double) DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, octave_int8) DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, octave_int16) DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, octave_int32) @@ -505,17 +518,23 @@ DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, octave_uint32) DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS (ov_range, octave_uint64) +#endif + // Specializations. template <> +OCTINTERP_API octave::range +ov_range::range_value (void) const; + +// For now, disable all but ov_range. + +#if 0 + +template <> OCTINTERP_API octave::range ov_range::float_range_value (void) const; template <> -OCTINTERP_API octave::range -ov_range::range_value (void) const; - -template <> OCTINTERP_API octave::range ov_range::int8_range_value (void) const; @@ -547,6 +566,8 @@ OCTINTERP_API octave::range ov_range::uint64_range_value (void) const; +#endif + // The following specializations are here to preserve previous Range // performance until solutions can be generalized for other types. @@ -576,8 +597,13 @@ ov_range::print_raw (std::ostream& os, bool pr_as_read_syntax) const; +typedef ov_range octave_double_range; + +// For now, disable all but ov_range. + +#if 0 + typedef ov_range octave_float_range; -typedef ov_range octave_double_range; typedef ov_range octave_int8_range; typedef ov_range octave_int16_range; @@ -589,6 +615,8 @@ typedef ov_range octave_uint32_range; typedef ov_range octave_uint64_range; +#endif + typedef octave_double_range octave_range; #endif diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov.cc --- a/libinterp/octave-value/ov.cc Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov.cc Thu Mar 17 02:44:19 2022 -0400 @@ -1093,23 +1093,18 @@ return dynamic_cast (new octave_matrix (r.matrix_value ())); } -octave_value::octave_value (const octave::range& r, char type, - bool /*force_range*/) -#if 0 - : m_rep (force_range || optimize_range - ? dynamic_cast (new octave_char_range (r, type)) - : dynamic_cast (type == '"' - ? new octave_char_matrix_dq_str (r.array_value ()) - : new octave_char_matrix_sq_str (r.array_value ()))) -#else - : m_rep (type == '"' - ? new octave_char_matrix_dq_str (r.array_value ()) - : new octave_char_matrix_sq_str (r.array_value ())) -#endif +octave_value::octave_value (const octave::range& r, bool force_range) + : m_rep (force_range || Voptimize_range + ? dynamic_cast (new ov_range (r)) + : dynamic_cast (new octave_matrix (r.array_value ()))) { maybe_mutate (); } +// For now, disable all but range. + +#if 0 + octave_value::octave_value (const octave::range& r, bool force_range) : m_rep (force_range || Voptimize_range ? dynamic_cast (new ov_range (r)) @@ -1118,14 +1113,6 @@ maybe_mutate (); } -octave_value::octave_value (const octave::range& r, bool force_range) - : m_rep (force_range || Voptimize_range - ? dynamic_cast (new ov_range (r)) - : dynamic_cast (new octave_matrix (r.array_value ()))) -{ - maybe_mutate (); -} - octave_value::octave_value (const octave::range& r, bool force_range) : m_rep (force_range || Voptimize_range @@ -1198,6 +1185,25 @@ maybe_mutate (); } +octave_value::octave_value (const octave::range& r, char type, + bool /*force_range*/) +#if 0 + : m_rep (force_range || optimize_range + ? dynamic_cast (new octave_char_range (r, type)) + : dynamic_cast (type == '"' + ? new octave_char_matrix_dq_str (r.array_value ()) + : new octave_char_matrix_sq_str (r.array_value ()))) +#else + : m_rep (type == '"' + ? new octave_char_matrix_dq_str (r.array_value ()) + : new octave_char_matrix_sq_str (r.array_value ())) +#endif +{ + maybe_mutate (); +} + +#endif + octave_value::octave_value (const octave_map& m) : m_rep (new octave_struct (m)) { @@ -2229,8 +2235,13 @@ XVALUE_EXTRACTOR (Cell, xcell_value, cell_value) XVALUE_EXTRACTOR (Array, xcellstr_value, cellstr_value) +XVALUE_EXTRACTOR (octave::range, xrange_value, range_value) + +// For now, disable all but ov_range. + +#if 0 + XVALUE_EXTRACTOR (octave::range, xfloat_range_value, float_range_value) -XVALUE_EXTRACTOR (octave::range, xrange_value, range_value) XVALUE_EXTRACTOR (octave::range, xint8_range_value, int8_range_value) XVALUE_EXTRACTOR (octave::range, xint16_range_value, int16_range_value) XVALUE_EXTRACTOR (octave::range, xint32_range_value, int32_range_value) @@ -2240,6 +2251,8 @@ XVALUE_EXTRACTOR (octave::range, xuint32_range_value, uint32_range_value) XVALUE_EXTRACTOR (octave::range, xuint64_range_value, uint64_range_value) +#endif + XVALUE_EXTRACTOR (octave_map, xmap_value, map_value) XVALUE_EXTRACTOR (octave_scalar_map, xscalar_map_value, scalar_map_value) @@ -3523,8 +3536,13 @@ octave_diag_matrix::register_type (ti); octave_complex_matrix::register_type (ti); octave_complex_diag_matrix::register_type (ti); + ov_range::register_type (ti); + + // For now, disable all but ov_range. + +#if 0 + ov_range::register_type (ti); - ov_range::register_type (ti); ov_range::register_type (ti); ov_range::register_type (ti); ov_range::register_type (ti); @@ -3533,6 +3551,9 @@ ov_range::register_type (ti); ov_range::register_type (ti); ov_range::register_type (ti); + +#endif + octave_bool::register_type (ti); octave_bool_matrix::register_type (ti); octave_char_matrix_str::register_type (ti); diff -r f1a9e55d850c -r 2989202f92f8 libinterp/octave-value/ov.h --- a/libinterp/octave-value/ov.h Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/octave-value/ov.h Thu Mar 17 02:44:19 2022 -0400 @@ -316,28 +316,44 @@ } #endif - OCTINTERP_API octave_value (const octave::range& r, char type, + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + + // For now, disable all but range. + +#if 0 + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); - OCTINTERP_API octave_value (const octave::range& r, - bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + OCTINTERP_API octave_value (const octave::range& r, bool force_range = false); + + OCTINTERP_API octave_value (const octave::range& r, char type, + bool force_range = false); +#endif + OCTINTERP_API octave_value (const octave_map& m); OCTINTERP_API octave_value (const octave_scalar_map& m); OCTINTERP_API octave_value (const std::map&); @@ -1008,12 +1024,16 @@ Array cellstr_value (void) const { return m_rep->cellstr_value (); } + octave::range range_value (void) const + { return m_rep->range_value (); } + + // For now, disable all but range. + +#if 0 + octave::range float_range_value (void) const { return m_rep->float_range_value (); } - octave::range range_value (void) const - { return m_rep->range_value (); } - octave::range int8_range_value (void) const { return m_rep->int8_range_value (); } @@ -1038,6 +1058,8 @@ octave::range uint64_range_value (void) const { return m_rep->uint64_range_value (); } +#endif + OCTINTERP_API octave_map map_value (void) const; OCTINTERP_API octave_scalar_map scalar_map_value (void) const; @@ -1269,12 +1291,16 @@ OCTINTERP_API Array xcellstr_value (const char *fmt, ...) const; + OCTINTERP_API octave::range + xrange_value (const char *fmt, ...) const; + + // For now, disable all but range. + +#if 0 + OCTINTERP_API octave::range xfloat_range_value (const char *fmt, ...) const; - OCTINTERP_API octave::range - xrange_value (const char *fmt, ...) const; - OCTINTERP_API octave::range xint8_range_value (const char *fmt, ...) const; @@ -1299,6 +1325,8 @@ OCTINTERP_API octave::range xuint64_range_value (const char *fmt, ...) const; +#endif + OCTINTERP_API octave_map xmap_value (const char *fmt, ...) const; OCTINTERP_API octave_scalar_map diff -r f1a9e55d850c -r 2989202f92f8 libinterp/parse-tree/pt-eval.cc --- a/libinterp/parse-tree/pt-eval.cc Sun Mar 13 12:57:22 2022 -0400 +++ b/libinterp/parse-tree/pt-eval.cc Thu Mar 17 02:44:19 2022 -0400 @@ -3096,6 +3096,9 @@ return; } + // For now, disable all but range. + +#if 0 if (rhs.is_int64_type ()) { execute_range_loop (rhs.int64_range_value (), line, ult, loop_body); @@ -3149,6 +3152,7 @@ execute_range_loop (rhs.float_range_value (), line, ult, loop_body); return; } +#endif } if (rhs.is_scalar_type ()) diff -r f1a9e55d850c -r 2989202f92f8 liboctave/array/Range.cc --- a/liboctave/array/Range.cc Sun Mar 13 12:57:22 2022 -0400 +++ b/liboctave/array/Range.cc Thu Mar 17 02:44:19 2022 -0400 @@ -328,6 +328,10 @@ xinit (m_base, m_limit, m_increment, m_reverse, m_final, m_numel); } + // For now, only define for float and double. + +#if 0 + template <> void range::init (void) @@ -384,6 +388,8 @@ xinit (m_base, m_limit, m_increment, m_reverse, m_final, m_numel); } +#endif + template <> bool range::is_storable (void) const diff -r f1a9e55d850c -r 2989202f92f8 liboctave/array/Range.h --- a/liboctave/array/Range.h Sun Mar 13 12:57:22 2022 -0400 +++ b/liboctave/array/Range.h Thu Mar 17 02:44:19 2022 -0400 @@ -29,6 +29,7 @@ #include "octave-config.h" #include +#include #include "Array-fwd.h" #include "dMatrix.h" @@ -39,8 +40,13 @@ namespace octave { + // For now, only define for floating point types. However, we only + // need range as a temporary local variable in make_float_range + // in ov.cc. + template - class range + class + range::value>::type> { public: @@ -123,9 +129,26 @@ return range (base, increment, final_val, numel, reverse); } - range (const range&) = default; + range (const range& r) + : m_base (r.m_base), m_increment (r.m_increment), + m_limit (r.m_limit), m_final (r.m_final), + m_numel (r.m_numel), m_reverse (r.m_reverse) + { } - range& operator = (const range&) = default; + range& operator = (const range& r) + { + if (this != &r) + { + m_base = r.m_base; + m_increment = r.m_increment; + m_limit = r.m_limit; + m_final = r.m_final; + m_numel = r.m_numel; + m_reverse = r.m_reverse; + } + + return *this; + } ~range (void) = default; @@ -370,6 +393,13 @@ template <> OCTAVE_API void range::init (void); template <> OCTAVE_API void range::init (void); + + // For now, only define for floating point types. However, we only + // need range as a temporary local variable in make_float_range + // in ov.cc. + +#if 0 + template <> OCTAVE_API void range::init (void); template <> OCTAVE_API void range::init (void); template <> OCTAVE_API void range::init (void); @@ -379,6 +409,8 @@ template <> OCTAVE_API void range::init (void); template <> OCTAVE_API void range::init (void); +#endif + template <> OCTAVE_API bool range::is_storable (void) const; template <> OCTAVE_API bool range::is_storable (void) const; diff -r f1a9e55d850c -r 2989202f92f8 liboctave/array/range-fwd.h --- a/liboctave/array/range-fwd.h Sun Mar 13 12:57:22 2022 -0400 +++ b/liboctave/array/range-fwd.h Thu Mar 17 02:44:19 2022 -0400 @@ -30,7 +30,7 @@ namespace octave { - template class OCTAVE_API range; + template class OCTAVE_API range; } #endif