changeset 32138:45d89e3bebfd

new functions for accessing double values * ov.h (octave_value::as_double_or_copy, octave_value::maybe_update_double): New functions. * ov-base.h (octave_base_value::as_double_or_copy, octave_base_value::maybe_update_double): New virtual functions. * ov-scalar.h, ov-scalar.cc (octave_scalar::as_double_or_copy, octave_scalar::maybe_update_double): New functions.
author Petter T. <petter.vilhelm@gmail.com>
date Mon, 19 Jun 2023 11:17:32 -0400
parents 644ad8448c49
children 1a370dc10d83
files libinterp/octave-value/ov-base.cc libinterp/octave-value/ov-base.h libinterp/octave-value/ov-scalar.cc libinterp/octave-value/ov-scalar.h libinterp/octave-value/ov.h
diffstat 5 files changed, 49 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base.cc	Mon Jun 19 10:45:49 2023 -0400
+++ b/libinterp/octave-value/ov-base.cc	Mon Jun 19 11:17:32 2023 -0400
@@ -158,6 +158,13 @@
 }
 
 octave_value
+octave_base_value::as_double_or_copy (void)
+{
+  const octave_base_value * cthis = this;
+  return cthis->as_double ();
+}
+
+octave_value
 octave_base_value::as_single () const
 {
   err_invalid_conversion (type_name (), "single");
@@ -275,6 +282,12 @@
   octave::err_invalid_index (nm.c_str ());
 }
 
+bool 
+octave_base_value::maybe_update_double (double)
+{
+  return false;
+}
+
 octave_value
 octave_base_value::simple_subsasgn (char type, octave_value_list& idx,
                                     const octave_value& rhs)
--- a/libinterp/octave-value/ov-base.h	Mon Jun 19 10:45:49 2023 -0400
+++ b/libinterp/octave-value/ov-base.h	Mon Jun 19 11:17:32 2023 -0400
@@ -297,6 +297,11 @@
 
   virtual octave_value full_value () const;
 
+  // Will return a copy of it-self when the representation
+  // allready is a scalar (.i.e. double). The const variant
+  // as_double () would allocate a new octave value.
+  virtual octave_value as_double_or_copy (void);
+
   virtual octave_value as_double () const;
   virtual octave_value as_single () const;
 
@@ -800,6 +805,8 @@
 
   virtual octave_base_value * make_storable_value (void);
 
+  virtual bool maybe_update_double (double d);
+
   // Standard mappers.  Register new ones here.
   enum unary_mapper_t
   {
--- a/libinterp/octave-value/ov-scalar.cc	Mon Jun 19 10:45:49 2023 -0400
+++ b/libinterp/octave-value/ov-scalar.cc	Mon Jun 19 11:17:32 2023 -0400
@@ -54,6 +54,7 @@
 #include "xdiv.h"
 #include "xpow.h"
 #include "ops.h"
+#include "ov-inline.h"
 
 #include "ls-oct-text.h"
 #include "ls-hdf5.h"
@@ -125,7 +126,13 @@
 }
 
 octave_value
-octave_scalar::as_double () const
+octave_scalar::as_double_or_copy (void)
+{
+  return octave_value_factory::make_copy (this);
+}
+
+octave_value
+octave_scalar::as_double (void) const
 {
   return scalar;
 }
--- a/libinterp/octave-value/ov-scalar.h	Mon Jun 19 10:45:49 2023 -0400
+++ b/libinterp/octave-value/ov-scalar.h	Mon Jun 19 11:17:32 2023 -0400
@@ -223,6 +223,16 @@
     return boolNDArray (dim_vector (1, 1), scalar);
   }
 
+  octave_value as_double_or_copy (void);
+
+  bool maybe_update_double (double d) 
+  { 
+    if (m_count != 1)
+      return false;
+    scalar = d;
+    return true;
+  }
+
   octave_value as_double () const;
   octave_value as_single () const;
 
--- a/libinterp/octave-value/ov.h	Mon Jun 19 10:45:49 2023 -0400
+++ b/libinterp/octave-value/ov.h	Mon Jun 19 11:17:32 2023 -0400
@@ -435,6 +435,11 @@
 
   // Type conversions.
 
+  // Returns a copy of a scalar (double), or makes a scalar
+  // for other types.
+  octave_value as_double_or_copy (void) const
+  { return m_rep->as_double_or_copy (); }
+
   octave_value as_double () const { return m_rep->as_double (); }
   octave_value as_single () const { return m_rep->as_single (); }
 
@@ -1565,6 +1570,12 @@
   checked_full_matrix_elem (octave_idx_type i, octave_idx_type j) const
   { return m_rep->checked_full_matrix_elem (i, j); }
 
+  bool
+  maybe_update_double (double d)
+  {
+    return m_rep->maybe_update_double (d);
+  }
+
   //! The real representation.
   octave_base_value *m_rep;