Mercurial > octave
changeset 32139:1a370dc10d83
octave_trivial_range functions omitted from changeset f31cbed22bf6
These functions were accidentally omitted by jwe when committing
changeset f31cbed22bf6.
* ov-base.h (octave_base_value::is_trivial_range): New virtual function.
* ov-range.cc (ov_range<T>::could_be_trivial_range,
ov_range<T>::as_trivial_range): New templates.
(ov_range<double>::could_be_trivial_range,
ov_range<double>::as_trivial_range): New specializations.
* ov.h, ov.cc (octave_value::maybe_as_trivial_range,
octave_value::is_trivial_range): New functions.
(install_types): Register octave_trivial_range data type.
author | Petter T. <petter.vilhelm@gmail.com> |
---|---|
date | Mon, 19 Jun 2023 11:36:39 -0400 |
parents | 45d89e3bebfd |
children | 8877fb5301b6 |
files | libinterp/octave-value/ov-base.h libinterp/octave-value/ov-range.cc libinterp/octave-value/ov.cc libinterp/octave-value/ov.h |
diffstat | 4 files changed, 67 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base.h Mon Jun 19 11:17:32 2023 -0400 +++ b/libinterp/octave-value/ov-base.h Mon Jun 19 11:36:39 2023 -0400 @@ -807,6 +807,8 @@ virtual bool maybe_update_double (double d); + virtual bool is_trivial_range () const { return false; }; + // Standard mappers. Register new ones here. enum unary_mapper_t {
--- a/libinterp/octave-value/ov-range.cc Mon Jun 19 11:17:32 2023 -0400 +++ b/libinterp/octave-value/ov-range.cc Mon Jun 19 11:36:39 2023 -0400 @@ -53,6 +53,7 @@ #include "ops.h" #include "ovl.h" #include "oct-hdf5.h" +#include "ov-inline.h" #include "ov-range-traits.h" #include "ov-range.h" #include "ov-re-mat.h" @@ -977,6 +978,47 @@ return retval; } +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_trivial_range, + "trivial range", "double"); + +template <typename T> +bool +ov_range<T>::could_be_trivial_range () { return false; } + +template <> +bool +ov_range<double>::could_be_trivial_range () +{ + octave_idx_type n = m_range.numel (); + if (n > std::numeric_limits<int>::max()) + return false; + if (n <= 1) + return false; + + double f = m_range.final_value (); + if (f > std::numeric_limits<int>::max() + || f < std::numeric_limits<int>::min()) + return false; + if (std::isnan (f)) + return false; + + return true; +} + +template <typename T> +octave_value +ov_range<T>::as_trivial_range () +{ + error ("Type error returning trivial range"); +} + +template <> +octave_value +ov_range<double>::as_trivial_range () +{ + return octave_value (new octave_trivial_range (m_range.numel (), m_range.base (), m_range.increment ())); +} + template <typename T> octave_value ov_range<T>::fast_elem_extract (octave_idx_type n) const
--- a/libinterp/octave-value/ov.cc Mon Jun 19 11:17:32 2023 -0400 +++ b/libinterp/octave-value/ov.cc Mon Jun 19 11:36:39 2023 -0400 @@ -1487,6 +1487,21 @@ } octave_value +octave_value::maybe_as_trivial_range () +{ + if (m_rep->is_trivial_range ()) + return *this; + if (!is_range ()) + return *this; + + ov_range<double> range = range_value (); + if (!range.could_be_trivial_range ()) + return *this; + + return range.as_trivial_range (); +} + +octave_value octave_value::next_subsref (bool auto_add, const std::string& type, const std::list<octave_value_list>& idx, std::size_t skip) @@ -3557,6 +3572,7 @@ octave_lazy_index::register_type (ti); octave_oncleanup::register_type (ti); octave_java::register_type (ti); + octave_trivial_range::register_type (ti); } OCTAVE_BEGIN_NAMESPACE(octave)
--- a/libinterp/octave-value/ov.h Mon Jun 19 11:17:32 2023 -0400 +++ b/libinterp/octave-value/ov.h Mon Jun 19 11:36:39 2023 -0400 @@ -1576,7 +1576,13 @@ return m_rep->maybe_update_double (d); } - //! The real representation. + octave_value + maybe_as_trivial_range (); + + bool + is_trivial_range () { return m_rep->is_trivial_range (); } + +//! The real representation. octave_base_value *m_rep; private: