diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 573a4dfe96d..df4b5fcc0c7 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -47,8 +47,10 @@ ExprIdToken::ExprIdToken(const Token* tok) : tok(tok), exprid(tok ? tok->exprId() : 0) {} +ExprIdToken::ExprIdToken(nonneg int exprId) : exprid(exprId) {} + nonneg int ExprIdToken::getExpressionId() const { - return tok ? tok->exprId() : exprid; + return exprid; } std::size_t ExprIdToken::Hash::operator()(ExprIdToken etok) const @@ -239,16 +241,12 @@ void ProgramMemory::copyOnWrite() ProgramMemory::Map::const_iterator ProgramMemory::find(nonneg int exprid) const { const auto& cvalues = utils::as_const(*mValues); - return std::find_if(cvalues.cbegin(), cvalues.cend(), [&exprid](const Map::value_type& entry) { - return entry.first.getExpressionId() == exprid; - }); + return cvalues.find(ExprIdToken::create(exprid)); } ProgramMemory::Map::iterator ProgramMemory::find(nonneg int exprid) { - return std::find_if(mValues->begin(), mValues->end(), [&exprid](const Map::value_type& entry) { - return entry.first.getExpressionId() == exprid; - }); + return mValues->find(ExprIdToken::create(exprid)); } static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm, const Settings& settings); diff --git a/lib/programmemory.h b/lib/programmemory.h index 1bd7ca78a4b..bc0a5537f7b 100644 --- a/lib/programmemory.h +++ b/lib/programmemory.h @@ -90,6 +90,15 @@ struct ExprIdToken { struct Hash { std::size_t operator()(ExprIdToken etok) const; }; + + /** create object for hashed lookups */ + static ExprIdToken create(nonneg int exprId) { + return ExprIdToken(exprId); + } + +private: + // for hashed lookups only + explicit ExprIdToken(nonneg int exprId); }; struct CPPCHECKLIB ProgramMemory {