55 class symbol_scope_rep
56 :
public std::enable_shared_from_this<symbol_scope_rep>
60 typedef std::map<std::string, symbol_record>::const_iterator
62 typedef std::map<std::string, symbol_record>::iterator
65 typedef std::map<std::string, octave_value>::const_iterator
66 subfunctions_const_iterator;
67 typedef std::map<std::string, octave_value>::iterator
68 subfunctions_iterator;
70 symbol_scope_rep (
const std::string& name =
"",
bool add_ans =
true)
71 : m_name (name), m_symbols (), m_subfunctions (),
72 m_persistent_values (), m_code (
nullptr), m_fcn_name (),
73 m_fcn_file_name (), m_dir_name (), m_parent (),
74 m_primary_parent (), m_children (), m_nesting_depth (0),
75 m_is_static (
false), m_is_primary_fcn_scope (
false)
82 OCTAVE_DISABLE_COPY_MOVE (symbol_scope_rep)
84 ~symbol_scope_rep () =
default;
86 std::size_t num_symbols ()
const {
return m_symbols.size (); }
94 bool is_nested ()
const {
return m_nesting_depth > 0; }
96 std::size_t nesting_depth ()
const {
return m_nesting_depth; }
98 void set_nesting_depth (std::size_t depth) { m_nesting_depth = depth; }
100 bool is_parent ()
const {
return ! m_children.empty (); }
102 bool is_static ()
const {
return m_is_static; }
104 void mark_static () { m_is_static =
true; }
106 std::shared_ptr<symbol_scope_rep> parent_scope_rep ()
const
108 return m_parent.lock ();
111 std::shared_ptr<symbol_scope_rep> primary_parent_scope_rep ()
const
113 return m_primary_parent.lock ();
116 std::shared_ptr<symbol_scope_rep> dup ()
const
118 std::shared_ptr<symbol_scope_rep> new_sid
119 = std::shared_ptr<symbol_scope_rep> (
new symbol_scope_rep (m_name));
121 for (
const auto& nm_sr : m_symbols)
122 new_sid->m_symbols[nm_sr.first] = nm_sr.second.dup ();
124 new_sid->m_subfunctions = m_subfunctions;
125 new_sid->m_persistent_values = m_persistent_values;
126 new_sid->m_subfunction_names = m_subfunction_names;
127 new_sid->m_code = m_code;
128 new_sid->m_fcn_name = m_fcn_name;
129 new_sid->m_fcn_file_name = m_fcn_file_name;
130 new_sid->m_dir_name = m_dir_name;
131 new_sid->m_parent = m_parent;
132 new_sid->m_primary_parent = m_primary_parent;
133 new_sid->m_children = m_children;
134 new_sid->m_nesting_depth = m_nesting_depth;
135 new_sid->m_is_static = m_is_static;
136 new_sid->m_is_primary_fcn_scope = m_is_primary_fcn_scope;
141 octave_value& persistent_varref (std::size_t data_offset)
143 return m_persistent_values[data_offset];
146 octave_value persistent_varval (std::size_t data_offset)
const
148 auto p = m_persistent_values.find (data_offset);
150 return p == m_persistent_values.end () ?
octave_value () : p->second;
155 auto p = m_symbols.find (name);
157 if (p == m_symbols.end ())
158 return insert (name);
165 auto p = m_symbols.find (name);
172 void rename (
const std::string& old_name,
const std::string& new_name)
174 auto p = m_symbols.find (old_name);
176 if (p != m_symbols.end ())
184 m_symbols[new_name] = sr;
188 void install_subfunction (
const std::string& name,
191 m_subfunctions[name] = fval;
194 void install_nestfunction (
const std::string& name,
198 m_subfunctions[name] = fval;
200 m_children.push_back (fcn_scope);
203 octave_value find_subfunction (
const std::string& name)
const;
205 void lock_subfunctions ()
207 for (
auto& nm_sf : m_subfunctions)
208 nm_sf.second.lock ();
211 void unlock_subfunctions ()
213 for (
auto& nm_sf : m_subfunctions)
214 nm_sf.second.unlock ();
218 std::map<std::string, octave_value> subfunctions ()
const
220 return m_subfunctions;
223 void erase_subfunctions ()
225 m_subfunctions.clear ();
228 void mark_subfunctions_in_scope_as_private (
const std::string& class_name);
230 bool has_subfunctions ()
const
232 return ! m_subfunction_names.empty ();
235 void stash_subfunction_names (
const std::list<std::string>& names)
237 m_subfunction_names = names;
240 std::list<std::string> subfunction_names ()
const
242 return m_subfunction_names;
245 std::list<octave_value> localfunctions ()
const;
249 std::string name ()
const {
return m_name; }
251 void cache_name (
const std::string& name) { m_name = name; }
253 std::string fcn_name ()
const {
return m_fcn_name; }
255 void cache_fcn_name (
const std::string& name) { m_fcn_name = name; }
257 std::list<std::string> parent_fcn_names ()
const;
263 void set_parent (
const std::shared_ptr<symbol_scope_rep>& parent);
265 void set_primary_parent (
const std::shared_ptr<symbol_scope_rep>& parent);
267 void cache_fcn_file_name (
const std::string& name)
269 m_fcn_file_name = name;
272 std::string fcn_file_name ()
const {
return m_fcn_file_name; }
274 void cache_dir_name (
const std::string& name);
276 std::string dir_name ()
const {
return m_dir_name; }
278 void mark_primary_fcn_scope () { m_is_primary_fcn_scope =
true; }
280 bool is_primary_fcn_scope ()
const {
return m_is_primary_fcn_scope; }
282 bool is_relative (
const std::shared_ptr<symbol_scope_rep>& scope)
const;
284 void mark_as_variable (
const std::string& nm);
285 void mark_as_variables (
const std::list<std::string>& lst);
287 bool is_variable (
const std::string& nm)
const;
291 bool look_nonlocal (
const std::string& name, std::size_t offset,
296 const std::map<std::string, symbol_record>& symbols ()
const
301 std::map<std::string, symbol_record>& symbols ()
306 std::list<symbol_record> symbol_list ()
const;
317 std::map<std::string, symbol_record> m_symbols;
321 std::map<std::string, octave_value> m_subfunctions;
324 std::map<std::size_t, octave_value> m_persistent_values;
329 std::list<std::string> m_subfunction_names;
337 std::string m_fcn_name;
341 std::string m_fcn_file_name;
345 std::string m_dir_name;
349 std::weak_ptr<symbol_scope_rep> m_parent;
354 std::weak_ptr<symbol_scope_rep> m_primary_parent;
358 std::vector<symbol_scope> m_children;
362 std::size_t m_nesting_depth;
369 bool m_is_primary_fcn_scope;
380 : m_rep (new symbol_scope_rep (name))
402 return symbol_scope (std::shared_ptr<symbol_scope_rep> (
nullptr));
412 explicit operator bool ()
const {
return is_valid (); }
416 return m_rep ? m_rep->num_symbols () : 0;
421 return m_rep ? m_rep->insert_local (name) :
symbol_record ();
427 m_rep->insert_symbol_record (sr);
432 return m_rep ? m_rep->is_nested () :
false;
437 return m_rep ? m_rep->is_parent () :
false;
443 m_rep->set_nesting_depth (depth);
448 return m_rep ? m_rep->nesting_depth () : 0;
453 return m_rep ? m_rep->is_static () :
false;
459 m_rep->mark_static ();
464 return m_rep ? m_rep->parent_scope_rep () :
nullptr;
469 return m_rep ? m_rep->primary_parent_scope_rep () :
nullptr;
481 return m_rep ? m_rep->persistent_varref (data_offset) : dummy_value;
486 return m_rep ? m_rep->persistent_varval (data_offset) :
octave_value ();
497 return m_rep ? m_rep->lookup_symbol (name) :
symbol_record ();
505 void rename (
const std::string& old_name,
const std::string& new_name)
508 m_rep->rename (old_name, new_name);
515 m_rep->install_subfunction (name, fval);
523 m_rep->install_nestfunction (name, fval, fcn_scope);
528 return m_rep ? m_rep->find_subfunction (name) :
octave_value ();
534 m_rep->lock_subfunctions ();
540 m_rep->unlock_subfunctions ();
546 ? m_rep->subfunctions ()
547 : std::map<std::string, octave_value> ());
553 m_rep->erase_subfunctions ();
559 m_rep->mark_subfunctions_in_scope_as_private (class_name);
564 return m_rep ? m_rep->has_subfunctions () :
false;
570 m_rep->stash_subfunction_names (names);
575 return m_rep ? m_rep->subfunction_names () : std::list<std::string> ();
579 std::list<octave_value> localfunctions ()
const;
588 return m_rep ? m_rep->name () :
"";
594 m_rep->cache_name (name);
599 return m_rep ? m_rep->fcn_name () :
"";
605 m_rep->cache_fcn_name (name);
610 return m_rep ? m_rep->parent_fcn_names () : std::list<std::string> ();
615 return m_rep ? m_rep->user_code () :
nullptr;
621 m_rep->set_user_code (code);
627 m_rep->set_parent (p.
get_rep ());
633 m_rep->set_primary_parent (p.
get_rep ());
639 m_rep->cache_fcn_file_name (name);
645 m_rep->cache_dir_name (name);
650 return m_rep ? m_rep->fcn_file_name () :
"";
655 return m_rep ? m_rep->dir_name () :
"";
661 m_rep->mark_primary_fcn_scope ();
666 return m_rep ? m_rep->is_primary_fcn_scope () :
false;
671 return m_rep ? m_rep->is_relative (scope.
get_rep ()) :
false;
677 m_rep->mark_as_variable (nm);
683 m_rep->mark_as_variables (lst);
688 return m_rep ? m_rep->is_variable (nm) :
false;
694 m_rep->update_nest ();
700 return m_rep ? m_rep->look_nonlocal (name, offset, result) :
false;
703 std::shared_ptr<symbol_scope_rep>
get_rep ()
const
710 return a.m_rep == b.m_rep;
715 return a.m_rep != b.m_rep;
718 const std::map<std::string, symbol_record>&
symbols ()
const
720 static const std::map<std::string, symbol_record> empty_map;
722 return m_rep ? m_rep->symbols () : empty_map;
725 std::map<std::string, symbol_record>&
symbols ()
727 static std::map<std::string, symbol_record> empty_map;
729 return m_rep ? m_rep->symbols () : empty_map;
734 static const std::list<symbol_record> empty_list;
736 return m_rep ? m_rep->symbol_list () : empty_list;
741 std::shared_ptr<symbol_scope_rep> m_rep;