GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
symrec.h
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1993-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if ! defined (octave_symrec_h)
27#define octave_symrec_h 1
28
29#include "octave-config.h"
30
31#include <deque>
32#include <list>
33#include <memory>
34#include <string>
35
37
38#include "ov.h"
39#include "ovl.h"
40
42
43class OCTINTERP_API symbol_record
44{
45public:
46
47 typedef std::size_t context_id;
48
49 enum symrec_t : unsigned char
50 {
51 // generic variable
52 LOCAL = 1,
53 // formal parameter
54 FORMAL = 2,
55 // this symbol may NOT become a variable.
56 // (symbol added to a static workspace)
57 ADDED_STATIC = 4,
58 // this symbol was recognized as a variable from syntax
59 VARIABLE = 8
60 };
61
62private:
63
64 class symbol_record_rep
65 {
66 public:
67
68 symbol_record_rep () = delete;
69
70 symbol_record_rep (const std::string& nm, symrec_t sc)
71 : m_frame_offset (0), m_data_offset (0), m_storage_class (sc),
72 m_name (nm)
73 { }
74
75 OCTAVE_DEFAULT_COPY_MOVE_DELETE (symbol_record_rep)
76
77 // FIXME: use special storage class instead?
78 bool is_valid () const { return ! m_name.empty (); }
79
80 void set_frame_offset (std::size_t offset) { m_frame_offset = offset; }
81
82 std::size_t frame_offset () const { return m_frame_offset; }
83
84 void set_data_offset (std::size_t offset) { m_data_offset = offset; }
85
86 std::size_t data_offset () const { return m_data_offset; }
87
88 bool is_local () const
89 {
90 return m_storage_class & LOCAL;
91 }
92
93 bool is_formal () const
94 {
95 return m_storage_class & FORMAL;
96 }
97
98 bool is_added_static () const
99 {
100 return m_storage_class & ADDED_STATIC;
101 }
102
103 bool is_variable () const
104 {
105 return m_storage_class & VARIABLE;
106 }
107
108 void mark_local ()
109 {
110 m_storage_class = static_cast<symrec_t> (m_storage_class | LOCAL);
111 }
112
113 void mark_formal ()
114 {
115 // Formal parameters are also variables.
116 m_storage_class = static_cast<symrec_t> (m_storage_class
117 | FORMAL | VARIABLE);
118 }
119
120 void mark_added_static ()
121 {
122 m_storage_class = static_cast<symrec_t> (m_storage_class
123 | ADDED_STATIC);
124 }
125
126 void mark_variable ()
127 {
128 m_storage_class = static_cast<symrec_t> (m_storage_class | VARIABLE);
129 }
130
131 OCTAVE_DEPRECATED (10, "symbol_record_rep::mark_as_variable is obsolete, use mark_variable")
132 void mark_as_variable ()
133 {
134 m_storage_class = static_cast<symrec_t> (m_storage_class | VARIABLE);
135 }
136
137
138 void unmark_local ()
139 {
140 m_storage_class = static_cast<symrec_t> (m_storage_class & ~LOCAL);
141 }
142
143 void unmark_formal ()
144 {
145 m_storage_class = static_cast<symrec_t> (m_storage_class & ~FORMAL);
146 }
147
148 void unmark_added_static ()
149 {
150 m_storage_class = static_cast<symrec_t> (m_storage_class
151 & ~ADDED_STATIC);
152 }
153
154 void unmark_variable ()
155 {
156 m_storage_class = static_cast<symrec_t> (m_storage_class & ~VARIABLE);
157 }
158
159 OCTAVE_DEPRECATED (10, "symbol_record_rep::unmark_as_variable is obsolete, use unmark_variable")
160 void unmark_as_variable ()
161 {
162 m_storage_class = static_cast<symrec_t> (m_storage_class & ~VARIABLE);
163 }
164
165 unsigned int storage_class () const { return m_storage_class; }
166
167 std::shared_ptr<symbol_record_rep> dup () const;
168
169 octave_value dump () const;
170
171 std::string name () const { return m_name; }
172
173 void rename (const std::string& new_name) { m_name = new_name; }
174
175 private:
176
177 std::size_t m_frame_offset;
178 std::size_t m_data_offset;
179
180 symrec_t m_storage_class;
181
182 std::string m_name;
183 };
184
185public:
186
187 symbol_record (const std::string& nm = "", symrec_t sc = LOCAL)
188 : m_rep (new symbol_record_rep (nm, sc))
189 { }
190
191 symbol_record (const std::string& nm, const octave_value&,
192 symrec_t sc = LOCAL)
193 : m_rep (new symbol_record_rep (nm, sc))
194 { }
195
196 symbol_record (const symbol_record&) = default;
197
198 symbol_record& operator = (const symbol_record&) = default;
199
200 ~symbol_record () = default;
201
202 bool is_valid () const { return m_rep->is_valid (); }
203
204 explicit operator bool () const { return is_valid (); }
205
206 void set_frame_offset (std::size_t offset)
207 { m_rep->set_frame_offset (offset); }
208
209 std::size_t frame_offset () const { return m_rep->frame_offset (); }
210
211 void set_data_offset (std::size_t offset)
212 { m_rep->set_data_offset (offset); }
213
214 std::size_t data_offset () const { return m_rep->data_offset (); }
215
216 symbol_record dup () const { return symbol_record (m_rep->dup ()); }
217
218 std::string name () const { return m_rep->name (); }
219
220 void rename (const std::string& new_name) { m_rep->rename (new_name); }
221
222 bool is_local () const { return m_rep->is_local (); }
223 bool is_formal () const { return m_rep->is_formal (); }
224 bool is_added_static () const { return m_rep->is_added_static (); }
225 bool is_variable () const { return m_rep->is_variable (); }
226
227 void mark_local () { m_rep->mark_local (); }
228 void mark_formal () { m_rep->mark_formal (); }
229 void mark_added_static () { m_rep->mark_added_static (); }
230 void mark_variable () { m_rep->mark_variable (); }
231 OCTAVE_DEPRECATED (10, "symbol_record::mark_as_variable is obsolete, use mark_variable")
232 void mark_as_variable () { m_rep->mark_variable (); }
233
234 void unmark_local () { m_rep->unmark_local (); }
235 void unmark_formal () { m_rep->unmark_formal (); }
236 void unmark_added_static () { m_rep->unmark_added_static (); }
237 void unmark_variable () { m_rep->unmark_variable (); }
238 OCTAVE_DEPRECATED (10, "symbol_record::unmark_as_variable is obsolete, use unmark_variable")
239 void unmark_as_variable () { m_rep->unmark_variable (); }
240
241 unsigned int storage_class () const { return m_rep->storage_class (); }
242
243 octave_value dump () const { return m_rep->dump (); }
244
245private:
246
247 std::shared_ptr<symbol_record_rep> m_rep;
248
249 // NEW_REP must be dynamically allocated or nullptr.
250 symbol_record (const std::shared_ptr<symbol_record_rep>& new_rep)
251 : m_rep (new_rep)
252 { }
253};
254
255OCTAVE_END_NAMESPACE(octave)
256
257#endif
octave_value dump() const
Definition ov.h:1454
void mark_formal()
Definition symrec.h:228
bool is_local() const
Definition symrec.h:222
symbol_record(const symbol_record &)=default
bool is_variable() const
Definition symrec.h:225
symbol_record(const std::string &nm="", symrec_t sc=LOCAL)
Definition symrec.h:187
unsigned int storage_class() const
Definition symrec.h:241
bool is_valid() const
Definition symrec.h:202
symbol_record dup() const
Definition symrec.h:216
void set_data_offset(std::size_t offset)
Definition symrec.h:211
std::string name() const
Definition symrec.h:218
std::size_t context_id
Definition symrec.h:47
void unmark_added_static()
Definition symrec.h:236
void set_frame_offset(std::size_t offset)
Definition symrec.h:206
bool is_added_static() const
Definition symrec.h:224
void unmark_variable()
Definition symrec.h:237
void unmark_local()
Definition symrec.h:234
void mark_variable()
Definition symrec.h:230
void rename(const std::string &new_name)
Definition symrec.h:220
void mark_added_static()
Definition symrec.h:229
std::size_t frame_offset() const
Definition symrec.h:209
void unmark_formal()
Definition symrec.h:235
std::size_t data_offset() const
Definition symrec.h:214
bool is_formal() const
Definition symrec.h:223
symbol_record(const std::string &nm, const octave_value &, symrec_t sc=LOCAL)
Definition symrec.h:191
octave_value dump() const
Definition symrec.h:243
void mark_local()
Definition symrec.h:227
~symbol_record()=default
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
int rename(const std::string &from, const std::string &to)
Definition file-ops.cc:582