Skip to content

Commit 8dfc24b

Browse files
authored
fixed #14089 - ProgramMemory: restored usage of hash lookups / use cached expression ID (danmar#7769)
1 parent 3529cd6 commit 8dfc24b

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

lib/programmemory.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@
4747

4848
ExprIdToken::ExprIdToken(const Token* tok) : tok(tok), exprid(tok ? tok->exprId() : 0) {}
4949

50+
ExprIdToken::ExprIdToken(nonneg int exprId) : exprid(exprId) {}
51+
5052
nonneg int ExprIdToken::getExpressionId() const {
51-
return tok ? tok->exprId() : exprid;
53+
return exprid;
5254
}
5355

5456
std::size_t ExprIdToken::Hash::operator()(ExprIdToken etok) const
@@ -239,16 +241,12 @@ void ProgramMemory::copyOnWrite()
239241
ProgramMemory::Map::const_iterator ProgramMemory::find(nonneg int exprid) const
240242
{
241243
const auto& cvalues = utils::as_const(*mValues);
242-
return std::find_if(cvalues.cbegin(), cvalues.cend(), [&exprid](const Map::value_type& entry) {
243-
return entry.first.getExpressionId() == exprid;
244-
});
244+
return cvalues.find(ExprIdToken::create(exprid));
245245
}
246246

247247
ProgramMemory::Map::iterator ProgramMemory::find(nonneg int exprid)
248248
{
249-
return std::find_if(mValues->begin(), mValues->end(), [&exprid](const Map::value_type& entry) {
250-
return entry.first.getExpressionId() == exprid;
251-
});
249+
return mValues->find(ExprIdToken::create(exprid));
252250
}
253251

254252
static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm, const Settings& settings);

lib/programmemory.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ struct ExprIdToken {
9090
struct Hash {
9191
std::size_t operator()(ExprIdToken etok) const;
9292
};
93+
94+
/** create object for hashed lookups */
95+
static ExprIdToken create(nonneg int exprId) {
96+
return ExprIdToken(exprId);
97+
}
98+
99+
private:
100+
// for hashed lookups only
101+
explicit ExprIdToken(nonneg int exprId);
93102
};
94103

95104
struct CPPCHECKLIB ProgramMemory {

0 commit comments

Comments
 (0)