Skip to content

Commit 990052b

Browse files
author
Your Name
committed
Reduce copies of the tokenlist
1 parent d863b06 commit 990052b

1 file changed

Lines changed: 23 additions & 20 deletions

File tree

lib/templatesimplifier.cpp

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4013,18 +4013,25 @@ void TemplateSimplifier::replaceTemplateUsage(
40134013
}
40144014
// remembered new token ranges that start in the erased tokens are gone
40154015
if (!mNewTokenRanges.empty() && !removeTokens.empty()) {
4016-
std::unordered_set<const Token*> erasedTokens;
4016+
std::unordered_set<const Token*> rangeStarts;
4017+
for (const auto& range : mNewTokenRanges)
4018+
rangeStarts.insert(range.first);
4019+
std::unordered_set<const Token*> erasedRangeStarts;
40174020
for (const auto& removeToken : removeTokens) {
4018-
for (const Token* tok = removeToken.first->next(); tok && tok != removeToken.second; tok = tok->next())
4019-
erasedTokens.insert(tok);
4020-
}
4021-
mNewTokenRanges.erase(
4022-
std::remove_if(mNewTokenRanges.begin(),
4023-
mNewTokenRanges.end(),
4024-
[&](const std::pair<Token*, Token*>& range) {
4025-
return erasedTokens.count(range.first) != 0;
4026-
}),
4027-
mNewTokenRanges.end());
4021+
for (const Token* tok = removeToken.first->next(); tok && tok != removeToken.second; tok = tok->next()) {
4022+
if (rangeStarts.count(tok) != 0)
4023+
erasedRangeStarts.insert(tok);
4024+
}
4025+
}
4026+
if (!erasedRangeStarts.empty()) {
4027+
mNewTokenRanges.erase(
4028+
std::remove_if(mNewTokenRanges.begin(),
4029+
mNewTokenRanges.end(),
4030+
[&](const std::pair<Token*, Token*>& range) {
4031+
return erasedRangeStarts.count(range.first) != 0;
4032+
}),
4033+
mNewTokenRanges.end());
4034+
}
40284035
}
40294036
while (!removeTokens.empty()) {
40304037
eraseTokens(removeTokens.back().first, removeTokens.back().second);
@@ -4739,16 +4746,12 @@ bool TemplateSimplifier::removeDeferredTemplateDeclarations(SymbolDatabase* symb
47394746

47404747
// the declarations could have been removed by a later simplification - make sure
47414748
// the tokens still exist before removing them
4742-
std::unordered_set<const Token*> liveTokens;
4743-
for (const Token* tok = mTokenList.front(); tok; tok = tok->next())
4744-
liveTokens.insert(tok);
4749+
const std::unordered_set<Token*> deferred(mDeferredRemovals.cbegin(), mDeferredRemovals.cend());
47454750
std::vector<Token*> declarations;
4746-
std::copy_if(mDeferredRemovals.cbegin(),
4747-
mDeferredRemovals.cend(),
4748-
std::back_inserter(declarations),
4749-
[&](const Token* declTok) {
4750-
return liveTokens.count(declTok) != 0;
4751-
});
4751+
for (Token* tok = mTokenList.front(); tok && declarations.size() < deferred.size(); tok = tok->next()) {
4752+
if (deferred.count(tok) != 0)
4753+
declarations.push_back(tok);
4754+
}
47524755
mDeferredRemovals.clear();
47534756

47544757
// all tokens that are going to be removed

0 commit comments

Comments
 (0)