From 0e31957a72309321bfcb23ede796f0ad10b936e7 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Fri, 8 Apr 2022 15:32:55 +0200 Subject: Update signatures for getAttributeValues member functions. --- .../vespa/searchlib/features/dotproductfeature.cpp | 65 +++++++++++----------- .../vespa/searchlib/features/dotproductfeature.h | 18 +++--- 2 files changed, 41 insertions(+), 42 deletions(-) (limited to 'searchlib') diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp index 59ea82c83bb..6bbfed60ecb 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp @@ -112,9 +112,8 @@ DotProductExecutorBase::~DotProductExecutorBase() = default; template void DotProductExecutorBase::execute(uint32_t docId) { feature_t val = 0; - const AT * values(nullptr); - uint32_t sz = getAttributeValues(docId, values); - for (size_t i = 0; i < sz; ++i) { + auto values = getAttributeValues(docId); + for (size_t i = 0; i < values.size(); ++i) { auto itr = _queryVector.getDimMap().find(values[i].value()); if (itr != _end) { val += values[i].weight() * itr->second; @@ -143,10 +142,12 @@ template DotProductExecutor::~DotProductExecutor() = default; template -size_t -DotProductExecutor::getAttributeValues(uint32_t docId, const AT * & values) +vespalib::ConstArrayRef::AT> +DotProductExecutor::getAttributeValues(uint32_t docId) { - return _attribute->getRawValues(docId, values); + const AT* values = nullptr; + auto size = _attribute->getRawValues(docId, values); + return vespalib::ConstArrayRef(values, size); } namespace { @@ -271,12 +272,11 @@ DotProductExecutorBase::~DotProductExecutorBase() = default; template void DotProductExecutorBase::execute(uint32_t docId) { - const AT *values(nullptr); - size_t count = getAttributeValues(docId, values); - size_t commonRange = std::min(count, _queryVector.size()); + auto values = getAttributeValues(docId); + size_t commonRange = std::min(values.size(), _queryVector.size()); static_assert(std::is_same::value); outputs().set_number(0, _multiplier.dotProduct( - &_queryVector[0], reinterpret_cast(values), commonRange)); + &_queryVector[0], reinterpret_cast(&values[0]), commonRange)); } template @@ -290,10 +290,12 @@ template DotProductExecutor::~DotProductExecutor() = default; template -size_t -DotProductExecutor::getAttributeValues(uint32_t docId, const AT * & values) +vespalib::ConstArrayRef::AT> +DotProductExecutor::getAttributeValues(uint32_t docId) { - return _attribute->getRawValues(docId, values); + const AT* values = nullptr; + auto size = _attribute->getRawValues(docId, values); + return vespalib::ConstArrayRef(values, size); } template @@ -308,17 +310,16 @@ template SparseDotProductExecutor::~SparseDotProductExecutor() = default; template -size_t -SparseDotProductExecutor::getAttributeValues(uint32_t docId, const AT * & values) +vespalib::ConstArrayRef::AT> +SparseDotProductExecutor::getAttributeValues(uint32_t docId) { - const AT *allValues(NULL); + const AT* allValues(nullptr); size_t count = this->_attribute->getRawValues(docId, allValues); - values = &_scratch[0]; size_t i(0); for (; (i < _queryIndexes.size()) && (_queryIndexes[i] < count); i++) { _scratch[i] = allValues[_queryIndexes[i]]; } - return i; + return vespalib::ConstArrayRef(&_scratch[0], i); } template @@ -332,16 +333,15 @@ template DotProductByCopyExecutor::~DotProductByCopyExecutor() = default; template -size_t -DotProductByCopyExecutor::getAttributeValues(uint32_t docId, const AT * & values) +vespalib::ConstArrayRef::AT> +DotProductByCopyExecutor::getAttributeValues(uint32_t docId) { size_t count = this->_attribute->getAll(docId, &_copy[0], _copy.size()); if (count > _copy.size()) { _copy.resize(count); count = this->_attribute->getAll(docId, &_copy[0], _copy.size()); } - values = reinterpret_cast(&_copy[0]); - return count; + return vespalib::ConstArrayRef(reinterpret_cast(&_copy[0]), count); } template @@ -355,8 +355,8 @@ template SparseDotProductByCopyExecutor::~SparseDotProductByCopyExecutor() = default; template -size_t -SparseDotProductByCopyExecutor::getAttributeValues(uint32_t docId, const AT * & values) +vespalib::ConstArrayRef::AT> +SparseDotProductByCopyExecutor::getAttributeValues(uint32_t docId) { size_t count = this->_attribute->getAll(docId, &_copy[0], _copy.size()); if (count > _copy.size()) { @@ -367,8 +367,7 @@ SparseDotProductByCopyExecutor::getAttributeValues(uint32_t docId, const AT * for (const IV & iv(this->_queryIndexes); (i < iv.size()) && (iv[i] < count); i++) { _copy[i] = _copy[iv[i]]; } - values = reinterpret_cast(&_copy[0]); - return i; + return vespalib::ConstArrayRef(reinterpret_cast(&_copy[0]), i); } template @@ -403,11 +402,11 @@ constexpr void sanity_check_reinterpret_cast_compatibility() { } template -size_t DotProductByContentFillExecutor::getAttributeValues(uint32_t docid, const AT * & values) { +vespalib::ConstArrayRef::AT> +DotProductByContentFillExecutor::getAttributeValues(uint32_t docid) { _filler.fill(*_attribute, docid); sanity_check_reinterpret_cast_compatibility(); - values = reinterpret_cast(_filler.data()); - return _filler.size(); + return vespalib::ConstArrayRef(reinterpret_cast(_filler.data()), _filler.size()); } template @@ -427,7 +426,9 @@ template SparseDotProductByContentFillExecutor::~SparseDotProductByContentFillExecutor() = default; template -size_t SparseDotProductByContentFillExecutor::getAttributeValues(uint32_t docid, const AT * & values) { +vespalib::ConstArrayRef::AT> +SparseDotProductByContentFillExecutor::getAttributeValues(uint32_t docid) +{ _filler.fill(*_attribute, docid); const size_t count = _filler.size(); @@ -438,11 +439,9 @@ size_t SparseDotProductByContentFillExecutor::getAttributeValues(uint3 } sanity_check_reinterpret_cast_compatibility(); - values = reinterpret_cast(data); - return i; + return vespalib::ConstArrayRef(reinterpret_cast(data), i); } - } namespace { diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.h b/searchlib/src/vespa/searchlib/features/dotproductfeature.h index ad5864f86c7..916efa54e11 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.h +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.h @@ -124,7 +124,7 @@ public: private: const V & _queryVector; const typename V::HashMap::const_iterator _end; - virtual size_t getAttributeValues(uint32_t docid, const AT * & count) = 0; + virtual vespalib::ConstArrayRef getAttributeValues(uint32_t docid) = 0; public: DotProductExecutorBase(const V & queryVector); ~DotProductExecutorBase() override; @@ -140,7 +140,7 @@ protected: const A * _attribute; private: std::unique_ptr _backing; - size_t getAttributeValues(uint32_t docid, const AT * & count) override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) override; public: DotProductExecutor(const A * attribute, const V & queryVector); DotProductExecutor(const A * attribute, std::unique_ptr queryVector); @@ -183,7 +183,7 @@ public: private: const vespalib::hwaccelrated::IAccelrated & _multiplier; V _queryVector; - virtual size_t getAttributeValues(uint32_t docid, const AT * & count) = 0; + virtual vespalib::ConstArrayRef getAttributeValues(uint32_t docid) = 0; public: DotProductExecutorBase(const V & queryVector); ~DotProductExecutorBase() override; @@ -201,7 +201,7 @@ public: protected: const A * _attribute; private: - size_t getAttributeValues(uint32_t docid, const AT * & count) override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) override; public: DotProductExecutor(const A * attribute, const V & queryVector); ~DotProductExecutor(); @@ -215,7 +215,7 @@ public: ~DotProductByCopyExecutor(); private: typedef typename DotProductExecutor::AT AT; - size_t getAttributeValues(uint32_t docid, const AT * & count) final override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) final override; std::vector _copy; }; @@ -240,7 +240,7 @@ public: DotProductByContentFillExecutor(const attribute::IAttributeVector * attribute, const V & queryVector); ~DotProductByContentFillExecutor(); private: - size_t getAttributeValues(uint32_t docid, const AT * & values) final override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) final override; const attribute::IAttributeVector* _attribute; ValueFiller _filler; @@ -255,7 +255,7 @@ public: ~SparseDotProductExecutor(); private: typedef typename DotProductExecutor::AT AT; - size_t getAttributeValues(uint32_t docid, const AT * & count) override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) override; protected: IV _queryIndexes; std::vector _scratch; @@ -270,7 +270,7 @@ public: ~SparseDotProductByCopyExecutor(); private: typedef typename DotProductExecutor::AT AT; - size_t getAttributeValues(uint32_t docid, const AT * & count) final override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) final override; std::vector _copy; }; @@ -291,7 +291,7 @@ public: const IV & queryIndexes); ~SparseDotProductByContentFillExecutor() override; private: - size_t getAttributeValues(uint32_t docid, const AT * & values) final override; + vespalib::ConstArrayRef getAttributeValues(uint32_t docid) final override; const attribute::IAttributeVector* _attribute; IV _queryIndexes; -- cgit v1.2.3 From 7757b76a328736913c4bb6e319199764fd289741 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Fri, 8 Apr 2022 18:02:10 +0200 Subject: Use data() member function to get pointer to the underlying array. --- searchlib/src/vespa/searchlib/features/dotproductfeature.cpp | 8 ++++---- vespalib/src/vespa/vespalib/util/arrayref.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'searchlib') diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp index 6bbfed60ecb..06e6e9157ae 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp @@ -276,7 +276,7 @@ void DotProductExecutorBase::execute(uint32_t docId) { size_t commonRange = std::min(values.size(), _queryVector.size()); static_assert(std::is_same::value); outputs().set_number(0, _multiplier.dotProduct( - &_queryVector[0], reinterpret_cast(&values[0]), commonRange)); + &_queryVector[0], reinterpret_cast(values.data()), commonRange)); } template @@ -319,7 +319,7 @@ SparseDotProductExecutor::getAttributeValues(uint32_t docId) for (; (i < _queryIndexes.size()) && (_queryIndexes[i] < count); i++) { _scratch[i] = allValues[_queryIndexes[i]]; } - return vespalib::ConstArrayRef(&_scratch[0], i); + return vespalib::ConstArrayRef(_scratch.data(), i); } template @@ -341,7 +341,7 @@ DotProductByCopyExecutor::getAttributeValues(uint32_t docId) _copy.resize(count); count = this->_attribute->getAll(docId, &_copy[0], _copy.size()); } - return vespalib::ConstArrayRef(reinterpret_cast(&_copy[0]), count); + return vespalib::ConstArrayRef(reinterpret_cast(_copy.data()), count); } template @@ -367,7 +367,7 @@ SparseDotProductByCopyExecutor::getAttributeValues(uint32_t docId) for (const IV & iv(this->_queryIndexes); (i < iv.size()) && (iv[i] < count); i++) { _copy[i] = _copy[iv[i]]; } - return vespalib::ConstArrayRef(reinterpret_cast(&_copy[0]), i); + return vespalib::ConstArrayRef(reinterpret_cast(_copy.data()), i); } template diff --git a/vespalib/src/vespa/vespalib/util/arrayref.h b/vespalib/src/vespa/vespalib/util/arrayref.h index bc1fc540a6c..337833d2457 100644 --- a/vespalib/src/vespa/vespalib/util/arrayref.h +++ b/vespalib/src/vespa/vespalib/util/arrayref.h @@ -50,6 +50,7 @@ public: const T *cend() const { return _v + _sz; } const T *begin() const { return _v; } const T *end() const { return _v + _sz; } + const T *data() const noexcept { return _v; } private: const T *_v; size_t _sz; -- cgit v1.2.3