diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-07-19 09:02:42 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-07-19 09:02:42 +0000 |
commit | cb74e361ca517a8734ef97e99092c76f907ea631 (patch) | |
tree | c55cbd51df21218c8dfae2611c7885184b4bffcf /searchlib | |
parent | 69d705ef0d9679a1a73f6c00ec2eabb584a6576a (diff) |
- Add noexcept and some constexpr.
- Use BitWord as helper class instead of inheriting in many static methods.
Diffstat (limited to 'searchlib')
5 files changed, 39 insertions, 38 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitword.cpp b/searchlib/src/vespa/searchlib/common/bitword.cpp index fbace5fcc56..8acf3cc3ef4 100644 --- a/searchlib/src/vespa/searchlib/common/bitword.cpp +++ b/searchlib/src/vespa/searchlib/common/bitword.cpp @@ -22,6 +22,6 @@ BitWord::Init::Init() fillUp(BitWord::_checkTab, std::numeric_limits<BitWord::Word>::max()); } -BitWord::Word BitWord::_checkTab[BitWord::WordLen]; +constexpr BitWord::Word BitWord::_checkTab[BitWord::WordLen]; } diff --git a/searchlib/src/vespa/searchlib/common/bitword.h b/searchlib/src/vespa/searchlib/common/bitword.h index cba6cf7723f..06071e4cae8 100644 --- a/searchlib/src/vespa/searchlib/common/bitword.h +++ b/searchlib/src/vespa/searchlib/common/bitword.h @@ -12,16 +12,16 @@ class BitWord { public: using Word = uint64_t; using Index = uint32_t; - static Word checkTab(Index index) { return _checkTab[bitNum(index)]; } - static Word startBits(Index index) { return (std::numeric_limits<Word>::max() >> 1) >> (WordLen - 1 - bitNum(index)); } + static Word checkTab(Index index) noexcept { return _checkTab[bitNum(index)]; } + static constexpr Word startBits(Index index) noexcept { return (std::numeric_limits<Word>::max() >> 1) >> (WordLen - 1 - bitNum(index)); } static constexpr size_t WordLen = sizeof(Word)*8; - static uint8_t bitNum(Index idx) { return (idx % WordLen); } - static Word endBits(Index index) { return (std::numeric_limits<Word>::max() - 1) << bitNum(index); } - static Word allBits() { return std::numeric_limits<Word>::max(); } - static Index wordNum(Index idx) { return idx >> numWordBits(); } - static Word mask(Index idx) { return Word(1) << bitNum(idx); } - static constexpr uint8_t size_bits(uint8_t n) { return (n > 1) ? (1 + size_bits(n >> 1)) : 0; } - static uint8_t numWordBits() { return size_bits(WordLen); } + static constexpr uint8_t bitNum(Index idx) noexcept { return (idx % WordLen); } + static constexpr Word endBits(Index index) noexcept { return (std::numeric_limits<Word>::max() - 1) << bitNum(index); } + static constexpr Word allBits() noexcept { return std::numeric_limits<Word>::max(); } + static constexpr Index wordNum(Index idx) noexcept { return idx >> numWordBits(); } + static constexpr Word mask(Index idx) noexcept { return Word(1) << bitNum(idx); } + static constexpr uint8_t size_bits(uint8_t n) noexcept { return (n > 1) ? (1 + size_bits(n >> 1)) : 0; } + static constexpr uint8_t numWordBits() noexcept { return size_bits(WordLen); } private: static Word _checkTab[WordLen]; diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp index 4203a6361b2..8b8db0f293a 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -29,12 +29,12 @@ public: memset(_lastWords, 0, sizeof(_lastWords)); } protected: - void updateLastValue(uint32_t docId); - void strictSeek(uint32_t docId); + void updateLastValue(uint32_t docId) noexcept; + void strictSeek(uint32_t docId) noexcept; private: void doSeek(uint32_t docId) override; Trinary is_strict() const override { return Trinary::False; } - bool acceptExtraFilter() const override { return Update::isAnd(); } + bool acceptExtraFilter() const noexcept final { return Update::isAnd(); } Update _update; const IAccelrated & _accel; alignas(64) Word _lastWords[8]; @@ -42,7 +42,7 @@ private: }; template<typename Update> -class MultiBitVectorIteratorStrict : public MultiBitVectorIterator<Update> +class MultiBitVectorIteratorStrict final : public MultiBitVectorIterator<Update> { public: explicit MultiBitVectorIteratorStrict(MultiSearch::Children children) @@ -55,36 +55,36 @@ private: struct And { using Word = BitWord::Word; - void operator () (const IAccelrated & accel, size_t offset, const std::vector<std::pair<const void *, bool>> & src, void *dest) { + void operator () (const IAccelrated & accel, size_t offset, const std::vector<std::pair<const void *, bool>> & src, void *dest) noexcept { accel.and64(offset, src, dest); } - static bool isAnd() { return true; } + static bool isAnd() noexcept { return true; } }; struct Or { using Word = BitWord::Word; - void operator () (const IAccelrated & accel, size_t offset, const std::vector<std::pair<const void *, bool>> & src, void *dest) { + void operator () (const IAccelrated & accel, size_t offset, const std::vector<std::pair<const void *, bool>> & src, void *dest) noexcept { accel.or64(offset, src, dest); } - static bool isAnd() { return false; } + static bool isAnd() noexcept { return false; } }; template<typename Update> -void MultiBitVectorIterator<Update>::updateLastValue(uint32_t docId) +void MultiBitVectorIterator<Update>::updateLastValue(uint32_t docId) noexcept { if (docId >= _lastMaxDocIdLimit) { if (__builtin_expect(docId >= _numDocs, false)) { setAtEnd(); return; } - const uint32_t index(wordNum(docId)); + const uint32_t index(BitWord::wordNum(docId)); if (docId >= _lastMaxDocIdLimitRequireFetch) { uint32_t baseIndex = index & ~(NumWordsInBatch - 1); _update(_accel, baseIndex*sizeof(Word), _bvs, _lastWords); - _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * WordLen; + _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * BitWord::WordLen; } _lastValue = _lastWords[index % NumWordsInBatch]; - _lastMaxDocIdLimit = (index + 1) * WordLen; + _lastMaxDocIdLimit = (index + 1) * BitWord::WordLen; } } @@ -94,7 +94,7 @@ MultiBitVectorIterator<Update>::doSeek(uint32_t docId) { updateLastValue(docId); if (__builtin_expect( ! isAtEnd(), true)) { - if (_lastValue & mask(docId)) { + if (_lastValue & BitWord::mask(docId)) { setDocId(docId); } } @@ -102,13 +102,13 @@ MultiBitVectorIterator<Update>::doSeek(uint32_t docId) template<typename Update> void -MultiBitVectorIterator<Update>::strictSeek(uint32_t docId) +MultiBitVectorIterator<Update>::strictSeek(uint32_t docId) noexcept { - for (updateLastValue(docId), _lastValue = _lastValue & checkTab(docId); + for (updateLastValue(docId), _lastValue = _lastValue & BitWord::checkTab(docId); (_lastValue == 0) && __builtin_expect(! isAtEnd(), true); updateLastValue(_lastMaxDocIdLimit)); if (__builtin_expect(!isAtEnd(), true)) { - docId = _lastMaxDocIdLimit - WordLen + vespalib::Optimized::lsbIdx(_lastValue); + docId = _lastMaxDocIdLimit - BitWord::WordLen + vespalib::Optimized::lsbIdx(_lastValue); if (__builtin_expect(docId >= _numDocs, false)) { setAtEnd(); } else { diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h index d75a9ddd357..d99e439af0b 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h @@ -8,7 +8,7 @@ namespace search::queryeval { -class MultiBitVectorIteratorBase : public MultiSearch, protected BitWord +class MultiBitVectorIteratorBase : public MultiSearch { public: ~MultiBitVectorIteratorBase() override; @@ -20,7 +20,8 @@ public: */ static SearchIterator::UP optimize(SearchIterator::UP parent); protected: - MultiBitVectorIteratorBase(Children hildren); + using Word = BitWord::Word; + MultiBitVectorIteratorBase(Children children); using MetaWord = std::pair<const void *, bool>; uint32_t _numDocs; @@ -29,7 +30,7 @@ protected: Word _lastValue; // Last value computed std::vector<MetaWord> _bvs; private: - virtual bool acceptExtraFilter() const = 0; + virtual bool acceptExtraFilter() const noexcept = 0; UP andWith(UP filter, uint32_t estimate) override; void doUnpack(uint32_t docid) override; static SearchIterator::UP optimizeMultiSearch(SearchIterator::UP parent); diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h index b58d7ceed43..4ab066727af 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h @@ -56,7 +56,7 @@ protected: * * @param id docid for hit **/ - void setDocId(uint32_t id) { _docid = id; } + void setDocId(uint32_t id) noexcept { _docid = id; } /** * Used to adjust the end of the legal docid range. @@ -64,13 +64,13 @@ protected: * * @param end_id the first docid outside the legal iterator range */ - void setEndId(uint32_t end_id) { _endid = end_id; } + void setEndId(uint32_t end_id) noexcept { _endid = end_id; } /** * Will terminate the iterator by setting it past the end. * Further calls to isAtEnd() will then return true. */ - void setAtEnd() { _docid = search::endDocId; } + void setAtEnd() noexcept { _docid = search::endDocId; } public: using Trinary=vespalib::Trinary; @@ -180,7 +180,7 @@ public: /** * The constructor sets the current document id to @ref beginId. **/ - SearchIterator() : _docid(0), _endid(0) { } + SearchIterator() noexcept : _docid(0), _endid(0) { } SearchIterator(const SearchIterator &) = delete; SearchIterator &operator=(const SearchIterator &) = delete; @@ -192,15 +192,15 @@ public: * * @return constant **/ - static uint32_t beginId() { return beginDocId; } + static uint32_t beginId() noexcept { return beginDocId; } /** * Tell if the iterator has reached the end. * * @return true if the iterator has reached its end. **/ - bool isAtEnd() const { return isAtEnd(_docid); } - bool isAtEnd(uint32_t docid) const { + bool isAtEnd() const noexcept { return isAtEnd(_docid); } + bool isAtEnd(uint32_t docid) const noexcept { if (__builtin_expect(docid >= _endid, false)) { return true; } @@ -214,9 +214,9 @@ public: * * @return current document id **/ - uint32_t getDocId() const { return _docid; } + uint32_t getDocId() const noexcept { return _docid; } - uint32_t getEndId() const { return _endid; } + uint32_t getEndId() const noexcept { return _endid; } /** * Check if the given document id is a hit. If it is a hit, the |