Author: omtcyfz Date: Fri Aug 10 04:50:44 2018 New Revision: 339426 URL: http://llvm.org/viewvc/llvm-project?rev=339426&view=rev Log: [clangd] Allow consuming limited number of items
This patch modifies `consume` function to allow retrieval of limited number of symbols. This is the "cheap" implementation of top-level limiting iterator. In the future we would like to have a complete limit iterator implementation to insert it into the query subtrees, but in the meantime this version would be enough for a fully-functional proof-of-concept Dex implementation. Reviewers: ioeric, ilya-biryukov Reviewed by: ioeric Differential Revision: https://reviews.llvm.org/D50500 Modified: clang-tools-extra/trunk/clangd/index/dex/Iterator.cpp clang-tools-extra/trunk/clangd/index/dex/Iterator.h clang-tools-extra/trunk/unittests/clangd/DexIndexTests.cpp Modified: clang-tools-extra/trunk/clangd/index/dex/Iterator.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/dex/Iterator.cpp?rev=339426&r1=339425&r2=339426&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/dex/Iterator.cpp (original) +++ clang-tools-extra/trunk/clangd/index/dex/Iterator.cpp Fri Aug 10 04:50:44 2018 @@ -218,9 +218,10 @@ private: } // end namespace -std::vector<DocID> consume(Iterator &It) { +std::vector<DocID> consume(Iterator &It, size_t Limit) { std::vector<DocID> Result; - for (; !It.reachedEnd(); It.advance()) + for (size_t Retrieved = 0; !It.reachedEnd() && Retrieved < Limit; + It.advance(), ++Retrieved) Result.push_back(It.peek()); return Result; } Modified: clang-tools-extra/trunk/clangd/index/dex/Iterator.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/dex/Iterator.h?rev=339426&r1=339425&r2=339426&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/dex/Iterator.h (original) +++ clang-tools-extra/trunk/clangd/index/dex/Iterator.h Fri Aug 10 04:50:44 2018 @@ -101,9 +101,10 @@ private: virtual llvm::raw_ostream &dump(llvm::raw_ostream &OS) const = 0; }; -/// Exhausts given iterator and returns all processed DocIDs. The result -/// contains sorted DocumentIDs. -std::vector<DocID> consume(Iterator &It); +/// Advances the iterator until it is either exhausted or the number of +/// requested items is reached. The result contains sorted DocumentIDs. +std::vector<DocID> consume(Iterator &It, + size_t Limit = std::numeric_limits<size_t>::max()); /// Returns a document iterator over given PostingList. std::unique_ptr<Iterator> create(PostingListRef Documents); Modified: clang-tools-extra/trunk/unittests/clangd/DexIndexTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/DexIndexTests.cpp?rev=339426&r1=339425&r2=339426&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/DexIndexTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/DexIndexTests.cpp Fri Aug 10 04:50:44 2018 @@ -240,6 +240,27 @@ TEST(DexIndexIterators, StringRepresenta "(& (& [1, 3, 5, 8, 9] [1, 5, 7, 9]) (| [0, 5] [0, 1, 5] []))"); } +TEST(DexIndexIterators, Limit) { + const PostingList L0 = {4, 7, 8, 20, 42, 100}; + const PostingList L1 = {1, 3, 5, 8, 9}; + const PostingList L2 = {1, 5, 7, 9}; + const PostingList L3 = {0, 5}; + const PostingList L4 = {0, 1, 5}; + const PostingList L5; + + auto DocIterator = create(L0); + EXPECT_THAT(consume(*DocIterator, 42), ElementsAre(4, 7, 8, 20, 42, 100)); + + DocIterator = create(L0); + EXPECT_THAT(consume(*DocIterator), ElementsAre(4, 7, 8, 20, 42, 100)); + + DocIterator = create(L0); + EXPECT_THAT(consume(*DocIterator, 3), ElementsAre(4, 7, 8)); + + DocIterator = create(L0); + EXPECT_THAT(consume(*DocIterator, 0), ElementsAre()); +} + testing::Matcher<std::vector<Token>> trigramsAre(std::initializer_list<std::string> Trigrams) { std::vector<Token> Tokens; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits