# HG changeset patch # User Petter T. # Date 1687187852 14400 # Node ID 45d89e3bebfd09a4331717e7a39c16cf410988fd # Parent 644ad8448c49b4f0e9838e9dcba426ca6a72b3e9 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. diff -r 644ad8448c49 -r 45d89e3bebfd libinterp/octave-value/ov-base.cc --- 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) diff -r 644ad8448c49 -r 45d89e3bebfd libinterp/octave-value/ov-base.h --- 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 { diff -r 644ad8448c49 -r 45d89e3bebfd libinterp/octave-value/ov-scalar.cc --- 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; } diff -r 644ad8448c49 -r 45d89e3bebfd libinterp/octave-value/ov-scalar.h --- 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; diff -r 644ad8448c49 -r 45d89e3bebfd libinterp/octave-value/ov.h --- 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;