11#ifndef OPENSMT_TERMNAMES_H
22#define OPENSMT_TERMNAMES_H
33
4+ #include " InternalToUserTermMap.h"
45#include " ScopedVector.h"
56#include " TypeUtils.h"
67
@@ -19,12 +20,15 @@ using TermName = std::string;
1920
2021class TermNames {
2122public:
22- TermNames (SMTConfig const & conf) : config{conf} {}
23+ TermNames (SMTConfig const & conf, InternalToUserTermMap const & map ) : config{conf}, internalToUserTermMap{map } {}
2324
2425 bool isGlobal () const { return config.declarations_are_global (); }
2526
2627 bool contains (TermName const & name) const { return nameToTerm.contains (name); }
27- bool contains (PTRef term) const { return termToNames.contains (term); }
28+ bool contains (PTRef term) const {
29+ term = internalToUserTermMap.getUserTerm (term);
30+ return termToNames.contains (term);
31+ }
2832
2933 [[deprecated(" Use tryInsert" )]]
3034 void insert (TermName const & name, PTRef term) {
@@ -48,6 +52,8 @@ class TermNames {
4852 }
4953
5054 std::vector<TermName> const & namesForTerm (PTRef term) const {
55+ assert (contains (term));
56+ term = internalToUserTermMap.getUserTerm (term);
5157 assert (contains (term));
5258 return termToNames.at (term);
5359 }
@@ -72,6 +78,7 @@ class TermNames {
7278
7379 // std::optional does not work with references so we must use pointers
7480 std::vector<TermName> const * tryGetNamesForTerm (PTRef term) const {
81+ term = internalToUserTermMap.getUserTerm (term);
7582 if (auto it = termToNames.find (term); it != termToNames.end ()) { return &it->second ; }
7683
7784 return nullptr ;
@@ -121,16 +128,26 @@ class TermNames {
121128 if (isGlobal ()) { return ; }
122129 scopedNamesAndTerms.popScope ([this ](auto const & p) {
123130 auto const & [name, term] = p;
124- auto it = nameToTerm.find (name);
125- if (it == nameToTerm.end ()) { return ; }
126- auto & names_ = _namesForTerm (term);
127- names_.erase (std::find (names_.begin (), names_.end (), name));
128- nameToTerm.erase (it);
131+ assert (not contains (term) or nameToTerm.find (name)->second .x == term.x );
132+ eraseTermName (name);
129133 });
130134 }
131135
136+ bool eraseTermName (TermName const & name) {
137+ auto termIt = nameToTerm.find (name);
138+ if (termIt == nameToTerm.end ()) { return false ; }
139+
140+ auto const & term = termIt->second ;
141+ auto & names_ = _namesForTerm (term);
142+ names_.erase (std::find (names_.begin (), names_.end (), name));
143+ nameToTerm.erase (termIt);
144+ return true ;
145+ }
146+
132147 SMTConfig const & config;
133148
149+ InternalToUserTermMap const & internalToUserTermMap;
150+
134151 ScopedNamesAndTerms scopedNamesAndTerms;
135152 NameToTermMap nameToTerm;
136153 TermToNamesMap termToNames;
0 commit comments