kbobyrev created this revision. kbobyrev added reviewers: ioeric, ilya-biryukov. Herald added subscribers: arphaman, jkorous, MaskRay.
This patch allows processing DocIDs from iterator using callback so that they are not stored in a vector if actual DocIDs are not needed. Such overhead is the case for https://reviews.llvm.org/D50337 patch: `fuzzyFindLongQuery` stores `SymbolDocIDs` but they are thrown away later, because what the index really needs is `std::vector<std::pair<float, const Symbol *>> Scores;` and it can be filled on-the-fly in `matchSymbols`. https://reviews.llvm.org/D50576 Files: clang-tools-extra/clangd/index/dex/Iterator.cpp clang-tools-extra/clangd/index/dex/Iterator.h Index: clang-tools-extra/clangd/index/dex/Iterator.h =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.h +++ clang-tools-extra/clangd/index/dex/Iterator.h @@ -101,8 +101,14 @@ virtual llvm::raw_ostream &dump(llvm::raw_ostream &OS) const = 0; }; -/// Advances the iterator until it is either exhausted or the number of -/// requested items is reached. The result contains sorted DocumentIDs. +/// Advances given iterator until it is exhausted or the requested number of +/// symbols is already seen while using callback on each processed DocID. +void matchSymbols(Iterator &It, + llvm::function_ref<void(const DocID &)> Callback, + size_t Limit = std::numeric_limits<size_t>::max()); + +/// Advances given iterator until it is either exhausted or the number of +/// requested items is reached and returns all seen DocIDs. std::vector<DocID> consume(Iterator &It, size_t Limit = std::numeric_limits<size_t>::max()); Index: clang-tools-extra/clangd/index/dex/Iterator.cpp =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.cpp +++ clang-tools-extra/clangd/index/dex/Iterator.cpp @@ -220,10 +220,16 @@ std::vector<DocID> consume(Iterator &It, size_t Limit) { std::vector<DocID> Result; + matchSymbols(It, [&](const DocID &ID) { Result.push_back(ID); }, Limit); + return Result; +} + +void matchSymbols(Iterator &It, + llvm::function_ref<void(const DocID &)> Callback, + size_t Limit) { for (size_t Retrieved = 0; !It.reachedEnd() && Retrieved < Limit; It.advance(), ++Retrieved) - Result.push_back(It.peek()); - return Result; + Callback(It.peek()); } std::unique_ptr<Iterator> create(PostingListRef Documents) {
Index: clang-tools-extra/clangd/index/dex/Iterator.h =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.h +++ clang-tools-extra/clangd/index/dex/Iterator.h @@ -101,8 +101,14 @@ virtual llvm::raw_ostream &dump(llvm::raw_ostream &OS) const = 0; }; -/// Advances the iterator until it is either exhausted or the number of -/// requested items is reached. The result contains sorted DocumentIDs. +/// Advances given iterator until it is exhausted or the requested number of +/// symbols is already seen while using callback on each processed DocID. +void matchSymbols(Iterator &It, + llvm::function_ref<void(const DocID &)> Callback, + size_t Limit = std::numeric_limits<size_t>::max()); + +/// Advances given iterator until it is either exhausted or the number of +/// requested items is reached and returns all seen DocIDs. std::vector<DocID> consume(Iterator &It, size_t Limit = std::numeric_limits<size_t>::max()); Index: clang-tools-extra/clangd/index/dex/Iterator.cpp =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.cpp +++ clang-tools-extra/clangd/index/dex/Iterator.cpp @@ -220,10 +220,16 @@ std::vector<DocID> consume(Iterator &It, size_t Limit) { std::vector<DocID> Result; + matchSymbols(It, [&](const DocID &ID) { Result.push_back(ID); }, Limit); + return Result; +} + +void matchSymbols(Iterator &It, + llvm::function_ref<void(const DocID &)> Callback, + size_t Limit) { for (size_t Retrieved = 0; !It.reachedEnd() && Retrieved < Limit; It.advance(), ++Retrieved) - Result.push_back(It.peek()); - return Result; + Callback(It.peek()); } std::unique_ptr<Iterator> create(PostingListRef Documents) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits