diff libinterp/octave-value/ov-ref.h @ 32141:e1aacfd46471

new value class to manage references to octave_value objects * ov-ref.h, ov-ref.cc: New files. * libinterp/octave-value/module.mk: Update. * ov-base.h, ov-base.cc (octave_base_value::is_ref, octave_base_value::ref_rep): New virtual functions. * ov.h (octave_value::is_ref, octave_value::ref_rep): New functions.
author Petter T. <petter.vilhelm@gmail.com>
date Mon, 19 Jun 2023 13:13:03 -0400
parents
children 72dcb1cef2c9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/octave-value/ov-ref.h	Mon Jun 19 13:13:03 2023 -0400
@@ -0,0 +1,117 @@
+////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 1996-2023 The Octave Project Developers
+//
+// See the file COPYRIGHT.md in the top-level directory of this
+// distribution or <https://octave.org/copyright/>.
+//
+// This file is part of Octave.
+//
+// Octave is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Octave is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Octave; see the file COPYING.  If not, see
+// <https://www.gnu.org/licenses/>.
+//
+////////////////////////////////////////////////////////////////////////
+
+#if ! defined (octave_ov_ref_h)
+#define octave_ov_ref_h 1
+
+#include "octave-config.h"
+
+#include "ov-base.h"
+#include "ovl.h"
+#include "symscope.h"
+
+#include <string>
+#include <memory>
+
+// octave_value_ref is to be used by the VM to implement
+// global and persistent values.
+//
+// octave_value_ref need to overload any virtual call
+// used by the assign and push slot op-codes.
+//
+// Any octave_value_ref should never leave the VM slots
+// on the VM stack.
+
+// Abstract type
+class OCTINTERP_API
+octave_value_ref : public octave_base_value
+{
+public:
+    octave_value_ref () = default;
+    ~octave_value_ref () = default;
+
+    octave_value_ref * ref_rep () { return this; }
+    bool is_ref () const { return true; }
+
+    virtual octave_value deref () = 0;
+    virtual void set_value (octave_value val) = 0;
+    virtual octave_value & ref () = 0;
+    virtual void maybe_save_state  () {};
+
+    virtual bool is_global_ref () { return false; }
+    virtual bool is_persistent_ref () { return false; }
+
+    void maybe_call_dtor ();
+    octave_value simple_subsasgn (char type, octave_value_list& idx, const octave_value& rhs);
+    octave_value subsasgn (const std::string& type, const std::list<octave_value_list>& idx, const octave_value& rhs);
+    octave_base_value * unique_clone ();
+    bool is_defined () const;
+    bool is_maybe_function (void) const;
+};
+
+class OCTINTERP_API
+octave_value_ref_global : public octave_value_ref
+{
+public:
+    octave_value_ref_global () = default;
+    ~octave_value_ref_global () = default;
+    octave_value_ref_global (std::string name)
+        : m_name (name) {};
+
+    octave_value deref ();
+    octave_value & ref ();
+    void set_value (octave_value val);
+    
+    bool is_global_ref () { return true; }
+
+private:
+    std::string m_name;
+
+    DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+};
+
+class OCTINTERP_API
+octave_value_ref_persistent : public octave_value_ref
+{
+public:
+    octave_value_ref_persistent () = default;
+    ~octave_value_ref_persistent () = default;
+    octave_value_ref_persistent (octave::symbol_scope scope, int offset)
+        : m_offset (offset), m_scope (scope) {};
+
+    octave_value deref ();
+    octave_value & ref ();
+    void set_value (octave_value val);
+    
+    bool is_persistent_ref () { return true; }
+
+private:
+    int m_offset;
+    octave::symbol_scope m_scope;
+
+    DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+};
+
+#endif