Mercurial > octave
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