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: