Mercurial > octave
changeset 32126:b1e1830e2cff
new subsref and subsasgn functions to handle simple case
These new functions allow std::list and std::string ctors to be avoided
when they are not needed.
* ov-base-mat.h, ov-base-mat.cc
(base_base_matrix<MT>::simple_subsref): New function.
* ov.h, ov.cc (octave_value::simple_subsref,
octave_value::simple_subsasgn): New functions.
* ov-base.h, ov-base.cc (octave_base_value::simple_subsref,
octave_base_value::simple_subsasgn): New virtual functions.
author | Petter T. <petter.vilhelm@gmail.com> |
---|---|
date | Thu, 15 Jun 2023 11:28:16 -0400 |
parents | fc5a9a9e5cea |
children | 408aa8a98b58 |
files | libinterp/octave-value/ov-base-mat.cc libinterp/octave-value/ov-base-mat.h libinterp/octave-value/ov-base.cc libinterp/octave-value/ov-base.h libinterp/octave-value/ov.cc libinterp/octave-value/ov.h |
diffstat | 6 files changed, 68 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base-mat.cc Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov-base-mat.cc Thu Jun 15 11:28:16 2023 -0400 @@ -42,6 +42,29 @@ #include "pr-output.h" template <typename MT> +octave_value_list +octave_base_matrix<MT>::simple_subsref (char type, octave_value_list& idx, int) +{ + switch (type) + { + case '(': + return do_index_op (idx); + break; + + case '{': + case '.': + { + std::string nm = type_name (); + error ("%s cannot be indexed with %c", nm.c_str (), type); + } + break; + + default: + panic_impossible (); + } +} + +template <typename MT> octave_value octave_base_matrix<MT>::subsref (const std::string& type, const std::list<octave_value_list>& idx)
--- a/libinterp/octave-value/ov-base-mat.h Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov-base-mat.h Thu Jun 15 11:28:16 2023 -0400 @@ -89,6 +89,9 @@ OCTINTERP_API octave_value subsref (const std::string& type, const std::list<octave_value_list>& idx); + octave_value_list + simple_subsref (char type, octave_value_list& idx, int nargout); + octave_value_list subsref (const std::string& type, const std::list<octave_value_list>& idx, int) { return subsref (type, idx); }
--- a/libinterp/octave-value/ov-base.cc Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov-base.cc Thu Jun 15 11:28:16 2023 -0400 @@ -210,6 +210,15 @@ return octave::dims_to_numel (dims (), idx); } +octave_value_list +octave_base_value:: +simple_subsref (char type, octave_value_list& idx, int nargout) +{ + std::list<octave_value_list> idx_list; + idx_list.push_back (idx); + return subsref (std::string {type}, idx_list, nargout); +} + octave_value octave_base_value::subsref (const std::string&, const std::list<octave_value_list>&) @@ -250,6 +259,16 @@ } octave_value +octave_base_value::simple_subsasgn (char type, octave_value_list& idx, + const octave_value& rhs) +{ + std::list<octave_value_list> idx_list; + idx_list.push_back (idx); + + return subsasgn (std::string {type}, idx_list, rhs); +} + +octave_value octave_base_value::subsasgn (const std::string& type, const std::list<octave_value_list>& idx, const octave_value& rhs)
--- a/libinterp/octave-value/ov-base.h Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov-base.h Thu Jun 15 11:28:16 2023 -0400 @@ -334,6 +334,9 @@ const std::list<octave_value_list>& idx, bool auto_add); + virtual octave_value_list + simple_subsref (char type, octave_value_list& idx, int nargout); + virtual octave_value do_index_op (const octave_value_list& idx, bool resize_ok = false); @@ -345,6 +348,10 @@ const octave_value& rhs); virtual octave_value + simple_subsasgn (char type, octave_value_list& idx, + const octave_value& rhs); + + virtual octave_value undef_subsasgn (const std::string& type, const std::list<octave_value_list>& idx, const octave_value& rhs);
--- a/libinterp/octave-value/ov.cc Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov.cc Thu Jun 15 11:28:16 2023 -0400 @@ -1448,6 +1448,13 @@ } octave_value_list +octave_value:: +simple_subsref (char type, octave_value_list& idx, int nargout) +{ + return m_rep->simple_subsref (type, idx, nargout); +} + +octave_value_list octave_value::subsref (const std::string& type, const std::list<octave_value_list>& idx, int nargout) {
--- a/libinterp/octave-value/ov.h Thu Jun 15 10:53:23 2023 -0400 +++ b/libinterp/octave-value/ov.h Thu Jun 15 11:28:16 2023 -0400 @@ -473,6 +473,9 @@ subsref (const std::string& type, const std::list<octave_value_list>& idx, int nargout); + octave_value_list + simple_subsref (char type, octave_value_list& idx, int nargout); + OCTINTERP_API octave_value next_subsref (const std::string& type, const std::list<octave_value_list>& idx, std::size_t skip = 1); @@ -494,6 +497,12 @@ subsasgn (const std::string& type, const std::list<octave_value_list>& idx, const octave_value& rhs); + octave_value + simple_subsasgn (char type, octave_value_list& idx, const octave_value& rhs) + { + return m_rep->simple_subsasgn (type, idx, rhs); + } + OCTINTERP_API octave_value undef_subsasgn (const std::string& type, const std::list<octave_value_list>& idx,