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,