diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-04-11 19:53:47 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-04-11 19:53:47 +0200 |
commit | fa6c98bfbc89611664d3754a9820b08cfb9e1fc6 (patch) | |
tree | 63f8ea153030697e721d36d84a3836bfe5f8130c | |
parent | 80c2856a671ca70f1862a99e23bc3e117fca7591 (diff) |
Use wrapper functions for access to multivalue::Value.
15 files changed, 73 insertions, 45 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h index b5799b9f3d2..091bf78a4dd 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h +++ b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h @@ -11,11 +11,11 @@ class Value { public: Value() noexcept : _v() {} Value(T v) noexcept : _v(v) { } - T value() const { return _v; } - const T& value_ref() const { return _v; } - T& value_ref() { return _v; } - operator T () const { return _v; } - operator T & () { return _v; } + T value() const noexcept { return _v; } + const T& value_ref() const noexcept { return _v; } + T& value_ref() noexcept { return _v; } + operator T () const noexcept { return _v; } + operator T & () noexcept { return _v; } bool operator ==(const Value<T> & rhs) const { return _v == rhs._v; } bool operator <(const Value<T> & rhs) const { return _v < rhs._v; } bool operator >(const Value<T> & rhs) const { return _v > rhs._v; } @@ -28,12 +28,12 @@ class WeightedValue { public: WeightedValue() noexcept : _v(), _w(1) { } WeightedValue(T v, int32_t w) noexcept : _v(v), _w(w) { } - T value() const { return _v; } - const T& value_ref() const { return _v; } - T& value_ref() { return _v; } - operator T () const { return _v; } - operator T & () { return _v; } - int32_t weight() const noexcept { return _w; } + T value() const noexcept { return _v; } + const T& value_ref() const noexcept { return _v; } + T& value_ref() noexcept { return _v; } + operator T () const noexcept { return _v; } + operator T & () noexcept { return _v; } + int32_t weight() const noexcept { return _w; } bool operator==(const WeightedValue<T> & rhs) const { return _v == rhs._v; } bool operator <(const WeightedValue<T> & rhs) const { return _v < rhs._v; } @@ -49,6 +49,24 @@ inline int32_t get_weight(const Value<T>&) noexcept { return 1; } template <typename T> inline int32_t get_weight(const WeightedValue<T>& value) noexcept { return value.weight(); } +template <typename T> +inline T get_value(const Value<T> &value) noexcept { return value.value(); } + +template <typename T> +inline T get_value(const WeightedValue<T>& value) noexcept { return value.value(); } + +template <typename T> +inline const T& get_value_ref(const Value<T> &value) noexcept { return value.value_ref(); } + +template <typename T> +inline const T& get_value_ref(const WeightedValue<T>& value) noexcept { return value.value_ref(); } + +template <typename T> +inline T& get_value_ref(Value<T> &value) noexcept { return value.value_ref(); } + +template <typename T> +inline T& get_value_ref(WeightedValue<T>& value) noexcept { return value.value_ref(); } + template <typename M> struct ValueBuilder; diff --git a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp index 9a331295fd0..8d137530dd0 100644 --- a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp @@ -62,7 +62,7 @@ void FlagAttributeT<B>::clearOldValues(DocId doc) { const typename B::WType * values(nullptr); for (uint32_t i(0), m(this->get(doc, values)); i < m; i++) { - BitVector * bv = _bitVectors[getOffset(values[i].value())]; + BitVector * bv = _bitVectors[getOffset(multivalue::get_value(values[i]))]; if (bv != nullptr) { bv->clearBitAndMaintainCount(doc); } diff --git a/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h b/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h index 64e4586021f..5b393d8bdb2 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h @@ -36,7 +36,7 @@ public: int32_t find(DocId doc, int32_t elemId, int32_t & weight) const { auto indices(_mv_mapping_read_view.get(doc)); for (uint32_t i(elemId); i < indices.size(); i++) { - T v = _enum_store.get_value(indices[i].value_ref().load_acquire()); + T v = _enum_store.get_value(multivalue::get_value_ref(indices[i]).load_acquire()); if (this->match(v)) { weight = multivalue::get_weight(indices[i]); return i; @@ -49,7 +49,7 @@ public: int32_t find(DocId doc, int32_t elemId) const { auto indices(_mv_mapping_read_view.get(doc)); for (uint32_t i(elemId); i < indices.size(); i++) { - T v = _enum_store.get_value(indices[i].value_ref().load_acquire()); + T v = _enum_store.get_value(multivalue::get_value_ref(indices[i]).load_acquire()); if (this->match(v)) { return i; } diff --git a/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h b/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h index 8ad70a4242d..b2c76a120f9 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h @@ -33,7 +33,7 @@ public: int32_t find(DocId doc, int32_t elemId, int32_t & weight) const { auto values(_mv_mapping_read_view.get(doc)); for (uint32_t i(elemId); i < values.size(); i++) { - if (this->match(values[i].value())) { + if (this->match(multivalue::get_value(values[i]))) { weight = multivalue::get_weight(values[i]); return i; } @@ -45,7 +45,7 @@ public: int32_t find(DocId doc, int32_t elemId) const { auto values(_mv_mapping_read_view.get(doc)); for (uint32_t i(elemId); i < values.size(); i++) { - if (this->match(values[i].value())) { + if (this->match(multivalue::get_value(values[i]))) { return i; } } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp index a781fd54534..b0761db7e5d 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp @@ -24,10 +24,10 @@ remap_enum_store_refs(const EnumIndexRemapper& remapper, AttributeVector& v, att for (uint32_t doc = 0; doc < v.getNumDocs(); ++doc) { vespalib::ArrayRef<WeightedIndex> indices(multi_value_mapping.get_writable(doc)); for (auto& entry : indices) { - EnumIndex ref = entry.value_ref().load_relaxed(); + EnumIndex ref = multivalue::get_value_ref(entry).load_relaxed(); if (ref.valid() && filter.has(ref)) { ref = remapper.remap(ref); - entry.value_ref().store_release(ref); + multivalue::get_value_ref(entry).store_release(ref); } } } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h index 5bfc326ad94..ee8f3181fd9 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h @@ -74,7 +74,7 @@ public: if (indices.size() == 0) { return std::numeric_limits<uint32_t>::max(); } else { - return indices[0].value_ref().load_acquire().ref(); + return multivalue::get_value_ref(indices[0]).load_acquire().ref(); } } @@ -82,7 +82,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - e[i] = indices[i].value_ref().load_acquire().ref(); + e[i] = multivalue::get_value_ref(indices[i]).load_acquire().ref(); } return valueCount; } @@ -90,7 +90,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - e[i] = WeightedEnum(indices[i].value_ref().load_acquire().ref(), multivalue::get_weight(indices[i])); + e[i] = WeightedEnum(multivalue::get_value_ref(indices[i]).load_acquire().ref(), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp index 34c46ac994e..c1cb6b1f75b 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp @@ -60,10 +60,10 @@ MultiValueEnumAttribute<B, M>::applyValueChanges(const DocIndices& docIndices, E uint32_t valueCount = oldIndices.size(); this->_mvMapping.set(doc_values.first, doc_values.second); for (uint32_t i = 0; i < doc_values.second.size(); ++i) { - updater.inc_ref_count(doc_values.second[i].value_ref().load_relaxed()); + updater.inc_ref_count(multivalue::get_value_ref(doc_values.second[i]).load_relaxed()); } for (uint32_t i = 0; i < valueCount; ++i) { - updater.dec_ref_count(oldIndices[i].value_ref().load_relaxed()); + updater.dec_ref_count(multivalue::get_value_ref(oldIndices[i]).load_relaxed()); } } } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp index d48e119a544..64358e15a3c 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp @@ -68,7 +68,7 @@ public: if (_indexes.size() >= _indexes.capacity()) { flush(); } - _indexes.push_back(valueRef.value_ref().load_acquire()); + _indexes.push_back(multivalue::get_value_ref(valueRef).load_acquire()); } } }; diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h index b2530db0054..e07498d9ca4 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h @@ -77,15 +77,15 @@ public: //------------------------------------------------------------------------- T get(DocId doc) const override { MultiValueArrayRef values(this->_mvMapping.get(doc)); - return ((values.size() > 0) ? values[0].value() : T()); + return ((values.size() > 0) ? multivalue::get_value(values[0]) : T()); } largeint_t getInt(DocId doc) const override { MultiValueArrayRef values(this->_mvMapping.get(doc)); - return static_cast<largeint_t>((values.size() > 0) ? values[0].value() : T()); + return static_cast<largeint_t>((values.size() > 0) ? multivalue::get_value(values[0]) : T()); } double getFloat(DocId doc) const override { MultiValueArrayRef values(this->_mvMapping.get(doc)); - return static_cast<double>((values.size() > 0) ? values[0].value() : T()); + return static_cast<double>((values.size() > 0) ? multivalue::get_value(values[0]) : T()); } EnumHandle getEnum(DocId doc) const override { (void) doc; @@ -105,7 +105,7 @@ public: MultiValueArrayRef handle(this->_mvMapping.get(doc)); uint32_t ret = handle.size(); for(size_t i(0), m(std::min(sz, ret)); i < m; i++) { - buffer[i] = static_cast<BufferType>(handle[i].value()); + buffer[i] = static_cast<BufferType>(multivalue::get_value(handle[i])); } return ret; } @@ -139,7 +139,7 @@ public: MultiValueArrayRef handle(this->_mvMapping.get(doc)); uint32_t ret = handle.size(); for(size_t i(0), m(std::min(sz, ret)); i < m; i++) { - buffer[i] = WeightedType(static_cast<ValueType>(handle[i].value()), + buffer[i] = WeightedType(static_cast<ValueType>(multivalue::get_value(handle[i])), multivalue::get_weight(handle[i])); } return ret; diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h index 2bee7498126..1786429af8e 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h @@ -58,7 +58,7 @@ public: if (indices.size() == 0) { return T(); } else { - return this->_enumStore.get_value(indices[0].value_ref().load_acquire()); + return this->_enumStore.get_value(multivalue::get_value_ref(indices[0]).load_acquire()); } } largeint_t getInt(DocId doc) const override { @@ -73,7 +73,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for(uint32_t i = 0, m = std::min(sz, valueCount); i < m; i++) { - buffer[i] = static_cast<BufferType>(this->_enumStore.get_value(indices[i].value_ref().load_acquire())); + buffer[i] = static_cast<BufferType>(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire())); } return valueCount; } @@ -92,7 +92,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - buffer[i] = WeightedType(static_cast<ValueType>(this->_enumStore.get_value(indices[i].value_ref().load_acquire())), multivalue::get_weight(indices[i])); + buffer[i] = WeightedType(static_cast<ValueType>(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire())), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multistringattribute.h b/searchlib/src/vespa/searchlib/attribute/multistringattribute.h index 1cd2e98d4b3..82c3bebbf76 100644 --- a/searchlib/src/vespa/searchlib/attribute/multistringattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multistringattribute.h @@ -59,7 +59,7 @@ public: if (indices.size() == 0) { return NULL; } else { - return this->_enumStore.get_value(indices[0].value_ref().load_acquire()); + return this->_enumStore.get_value(multivalue::get_value_ref(indices[0]).load_acquire()); } } @@ -75,7 +75,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for(uint32_t i = 0, m = std::min(sz, valueCount); i < m; i++) { - buffer[i] = this->_enumStore.get_value(indices[i].value_ref().load_acquire()); + buffer[i] = this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire()); } return valueCount; } @@ -92,7 +92,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - buffer[i] = WeightedType(this->_enumStore.get_value(indices[i].value_ref().load_acquire()), multivalue::get_weight(indices[i])); + buffer[i] = WeightedType(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire()), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp index 7cd68afbf0e..8cf86f66236 100644 --- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp @@ -127,14 +127,14 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_array(DocumentValues& docV culled.reserve(new_values.size()); if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { for (size_t i = 0; i < new_values.size(); ++i) { - auto iter = tombstones.find(new_values[i].value()); + auto iter = tombstones.find(multivalue::get_value(new_values[i])); if (iter == tombstones.end() || (iter->second <= i)) { culled.emplace_back(new_values[i]); } } } else { for (size_t i = 0; i < new_values.size(); ++i) { - auto iter = tombstones.find(new_values[i].value_ref().load_relaxed()); + auto iter = tombstones.find(multivalue::get_value_ref(new_values[i]).load_relaxed()); if (iter == tombstones.end() || (iter->second <= i)) { culled.emplace_back(new_values[i]); } @@ -173,9 +173,9 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_wset(DocumentValues& docVa wset_inserted.resize((old_values.size() + max_elems_inserted) * 2); for (const auto& e : old_values) { if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { - wset_inserted[e.value()] = multivalue::get_weight(e); + wset_inserted[multivalue::get_value(e)] = multivalue::get_weight(e); } else { - wset_inserted[e.value_ref().load_relaxed()] = multivalue::get_weight(e); + wset_inserted[multivalue::get_value_ref(e).load_relaxed()] = multivalue::get_weight(e); } } // iterate through all changes for this document diff --git a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp index 312ae56fa2d..62d6e3364a2 100644 --- a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp +++ b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp @@ -18,7 +18,7 @@ template <typename WeightedIndex> struct CompareValue { bool operator()(const WeightedIndex& lhs, const WeightedIndex& rhs) const { - return lhs.value_ref().load_relaxed() < rhs.value_ref().load_relaxed(); + return multivalue::get_value_ref(lhs).load_relaxed() < multivalue::get_value_ref(rhs).load_relaxed(); }; }; @@ -178,7 +178,7 @@ private: { const WeightedIndex *srce = src + sz; for (const WeightedIndex *i = src; i < srce; ++i) { - dst.emplace_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(mapEnumIndex(i->value_ref().load_relaxed())), multivalue::get_weight(*i))); + dst.emplace_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(mapEnumIndex(multivalue::get_value_ref(*i).load_relaxed())), multivalue::get_weight(*i))); } } @@ -205,10 +205,10 @@ class MergeDupIterator { Entry _entry; bool _valid; void merge() { - EnumIndex idx = _cur->value_ref().load_relaxed(); + EnumIndex idx = multivalue::get_value_ref(*_cur).load_relaxed(); int32_t weight = multivalue::get_weight(*_cur); ++_cur; - while (_cur != _end && _cur->value_ref().load_relaxed() == idx) { + while (_cur != _end && multivalue::get_value_ref(*_cur).load_relaxed() == idx) { // sum weights together. Overflow is not handled. weight += multivalue::get_weight(*_cur); ++_cur; diff --git a/searchlib/src/vespa/searchlib/features/attributefeature.cpp b/searchlib/src/vespa/searchlib/features/attributefeature.cpp index ea88bfb6aa6..2349e8f1398 100644 --- a/searchlib/src/vespa/searchlib/features/attributefeature.cpp +++ b/searchlib/src/vespa/searchlib/features/attributefeature.cpp @@ -245,7 +245,7 @@ MultiAttributeExecutor<BaseType>::execute(uint32_t docId) { auto values = _array_read_view->get_raw_values(docId); auto o = outputs().get_bound(); - o[0].as_number = __builtin_expect(_idx < values.size(), true) ? values[_idx].value() : 0; + o[0].as_number = __builtin_expect(_idx < values.size(), true) ? multivalue::get_value(values[_idx]) : 0; } void diff --git a/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp b/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp index 635c8fed4c3..739d0f01cee 100644 --- a/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp +++ b/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp @@ -62,11 +62,21 @@ RawExecutor<BaseType>::RawExecutor(const ArrayReadView* array_read_view, const I { } +namespace { + +template <typename T> +inline T get_array_element_value(const multivalue::Value<T>& value) noexcept { return multivalue::get_value(value); } + +template <typename T> +inline T get_array_element_value(const search::attribute::WeightedType<T>& value) noexcept { return value.value(); } + +} + template<typename A, typename V> feature_t maxProduct(const A &array, size_t count, const V &query) { feature_t val = -std::numeric_limits<double>::max(); for (size_t i = 0; i < count; ++i) { - auto itr = query.getDimMap().find(array[i].value()); + auto itr = query.getDimMap().find(get_array_element_value(array[i])); if (itr != query.getDimMap().end()) { feature_t v = itr->second; // weight from attribute is assumed to be 1.0 if (v > val) { |