GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
symtab.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_symtab_h)
27#define octave_symtab_h 1
28
29#include "octave-config.h"
30
31#include <deque>
32#include <list>
33#include <map>
34#include <set>
35#include <string>
36
37#include "glob-match.h"
38#include "lo-regexp.h"
39#include "oct-refcount.h"
40
43
44#include "fcn-info.h"
45#include "ov.h"
46#include "ovl.h"
47#include "symscope.h"
48
50
51class interpreter;
52
53class OCTINTERP_API symbol_table
54{
55public:
56
57 // Make symbol_table::scope and symbol_table::fcn_info valid type names.
58 typedef octave::symbol_scope scope;
59 typedef octave::fcn_info fcn_info;
60
61 symbol_table (interpreter& interp);
62
63 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (symbol_table)
64
65 ~symbol_table () = default;
66
67 symbol_scope current_scope () const;
68
69 bool is_built_in_function_name (const std::string& name);
70
71 octave_value find_scoped_function (const std::string& name,
72 const symbol_scope& search_scope);
73
74 octave_value find_private_function (const std::string& dir_name,
75 const std::string& name);
76
77 // FIXME: this function only finds legacy class methods, not
78 // classdef methods.
79 octave_value find_method (const std::string& name,
80 const std::string& dispatch_type);
81
82 octave_value find_built_in_function (const std::string& name);
83
84 octave_value find_autoload (const std::string& name);
85
87 builtin_find (const std::string& name,
88 const symbol_scope& search_scope = symbol_scope::invalid ());
89
91 fcn_table_find (const std::string& name,
92 const octave_value_list& args = ovl (),
93 const symbol_scope& search_scope = symbol_scope::invalid ());
94
95 // If NAME is of the form @CLASS/FUNCTION, call
96 //
97 // find_method (FUNCTION, CLASS)
98 //
99 // otherwise call
100 //
101 // find_function (NAME, ovl ())
102
104 find_function (const std::string& name,
105 const symbol_scope& search_scope = symbol_scope::invalid ());
106
107 // NAME should just be function name; dispatch type determined
108 // from types of ARGS.
109
111 find_function (const std::string& name,
112 const octave_value_list& args,
113 const symbol_scope& search_scope = symbol_scope::invalid ());
114
115 octave_value find_user_function (const std::string& name);
116
117 octave_value find_cmdline_function (const std::string& name);
118
119 void install_cmdline_function (const std::string& name,
120 const octave_value& fcn);
121
122 // Install local function FCN named NAME. FILE_NAME is the name of
123 // the file containing the local function.
124
125 void install_local_function (const std::string& name,
126 const octave_value& fcn,
127 const std::string& file_name);
128
129 void install_user_function (const std::string& name,
130 const octave_value& fcn);
131
132 // FIXME: should we ensure that FCN really is a built-in function
133 // object?
134 void install_built_in_function (const std::string& name,
135 const octave_value& fcn);
136
137 // This is written as two separate functions instead of a single
138 // function with default values so that it will work properly with
139 // unwind_protect.
140
141 void clear_functions (bool force = false);
142
143 void clear_function (const std::string& name);
144
145 void clear_function_pattern (const std::string& pat);
146
147 void clear_function_regexp (const std::string& pat);
148
149 void clear_user_function (const std::string& name);
150
151 // This clears oct and mex files, including autoloads.
152 void clear_dld_function (const std::string& name);
153
154 void clear_mex_functions ();
155
156 bool set_class_relationship (const std::string& sup_class,
157 const std::string& inf_class);
158
159 bool is_superiorto (const std::string& a, const std::string& b);
160
161 void alias_built_in_function (const std::string& alias,
162 const std::string& name);
163
164 void install_built_in_dispatch (const std::string& name,
165 const std::string& klass);
166
167 std::list<std::string> user_function_names ();
168
169 std::list<std::string> built_in_function_names ();
170
171 std::list<std::string> cmdline_function_names ();
172
173 octave_value dump () const;
174
175 void add_to_parent_map (const std::string& classname,
176 const std::list<std::string>& parent_list);
177
178 std::list<std::string> parent_classes (const std::string& dispatch_type);
179
180 void cleanup ();
181
182 fcn_info * get_fcn_info (const std::string& name);
183
184private:
185
186 interpreter& m_interpreter;
187
188 typedef std::map<std::string, octave_value>::const_iterator
189 global_symbols_const_iterator;
190 typedef std::map<std::string, octave_value>::iterator
191 global_symbols_iterator;
192
193 typedef std::map<std::string, fcn_info>::const_iterator
194 fcn_table_const_iterator;
195 typedef std::map<std::string, fcn_info>::iterator
196 fcn_table_iterator;
197
198 // Map from function names to function info (private
199 // functions, class constructors, class methods, etc.)
200 // Note that subfunctions are defined in the scope that contains
201 // them.
202 std::map<std::string, fcn_info> m_fcn_table;
203
204 // Map from class names to set of classes that have lower
205 // precedence.
206 std::map<std::string, std::set<std::string>> m_class_precedence_table;
207
208 typedef std::map<std::string, std::set<std::string>>::const_iterator
209 class_precedence_table_const_iterator;
210 typedef std::map<std::string, std::set<std::string>>::iterator
211 class_precedence_table_iterator;
212
213 // Map from class names to parent class names.
214 std::map<std::string, std::list<std::string>> m_parent_map;
215
216 typedef std::map<std::string, std::list<std::string>>::const_iterator
217 const_parent_map_iterator;
218 typedef std::map<std::string, std::list<std::string>>::iterator
219 parent_map_iterator;
220
221 octave_value dump_fcn_table_map () const;
222
223 // This function is generated automatically by mk-builtins.pl.
224 void install_builtins ();
225};
226
227OCTAVE_END_NAMESPACE(octave)
228
229#endif
static symbol_scope invalid()
Definition symscope.h:400
octave::fcn_info fcn_info
Definition symtab.h:59
octave::symbol_scope scope
Definition symtab.h:58
~symbol_table()=default
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
Definition ovl.h:217