Index: clang-tools-extra/clangd/index/MemIndex.cpp =================================================================== --- clang-tools-extra/clangd/index/MemIndex.cpp +++ clang-tools-extra/clangd/index/MemIndex.cpp @@ -10,7 +10,7 @@ #include "MemIndex.h" #include "../FuzzyMatch.h" #include "../Logger.h" -#include +#include "../Quality.h" namespace clang { namespace clangd { @@ -26,7 +26,7 @@ assert(!StringRef(Req.Query).contains("::") && "There must be no :: in query."); - std::priority_queue> Top; + TopN> Top(Req.MaxCandidateCount); FuzzyMatcher Filter(Req.Query); bool More = false; for (const auto Pair : Index) { @@ -39,15 +39,14 @@ continue; if (auto Score = Filter.match(Sym->Name)) { - Top.emplace(-*Score * quality(*Sym), Sym); - if (Top.size() > Req.MaxCandidateCount) { + // Top.push(...) returns true if the capacity is reached and the heap had + // to pop() and item before inserting a new one. + if (Top.push({*Score * quality(*Sym), Sym})) More = true; - Top.pop(); - } } } - for (; !Top.empty(); Top.pop()) - Callback(*Top.top().second); + for (const auto &Item : std::move(Top).items()) + Callback(*Item.second); return More; }