summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-07-19 09:02:42 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-07-19 09:02:42 +0000
commitcb74e361ca517a8734ef97e99092c76f907ea631 (patch)
treec55cbd51df21218c8dfae2611c7885184b4bffcf /searchlib
parent69d705ef0d9679a1a73f6c00ec2eabb584a6576a (diff)
- Add noexcept and some constexpr.
- Use BitWord as helper class instead of inheriting in many static methods.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/common/bitword.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/common/bitword.h18
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h18
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