diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-12-28 00:04:08 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-01-03 09:08:48 +0100 |
commit | f5e8faf58ead944a57364cbff5dd2411b452570f (patch) | |
tree | b64d47d48a92f6773b0e0d2b646e04df3890f66e | |
parent | e77379005bccd3d5009b1484038183a05856b4cd (diff) |
Add a for_each method for more efficient iteration.
-rw-r--r-- | document/src/test/resources/tensor/multi_cell_tensor__cpp | bin | 107 -> 107 bytes | |||
-rw-r--r-- | eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp | 4 | ||||
-rw-r--r-- | eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp | 1 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hash_map.h | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hashtable.h | 3 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hashtable.hpp | 15 |
6 files changed, 23 insertions, 4 deletions
diff --git a/document/src/test/resources/tensor/multi_cell_tensor__cpp b/document/src/test/resources/tensor/multi_cell_tensor__cpp Binary files differindex c0b2b3a165a..d4c7c5fbbe5 100644 --- a/document/src/test/resources/tensor/multi_cell_tensor__cpp +++ b/document/src/test/resources/tensor/multi_cell_tensor__cpp diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp index 1aa05bf4f61..b69b1cdab05 100644 --- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp +++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp @@ -82,9 +82,7 @@ double SparseTensor::as_double() const { double result = 0.0; - for (const auto &cell : _cells) { - result += cell.second; - } + _cells.for_each([&result](const auto & v) { result += v.second; }); return result; } diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp index e0de63b90d2..aafb87c9d67 100644 --- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp +++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp @@ -3,7 +3,6 @@ #include "sparse_tensor_address_combiner.h" #include "sparse_tensor_address_decoder.h" #include <vespa/eval/eval/value_type.h> -#include <cassert> namespace vespalib::tensor::sparse { diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.h b/vespalib/src/vespa/vespalib/stllike/hash_map.h index 023594d3018..321f92a419f 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_map.h +++ b/vespalib/src/vespa/vespalib/stllike/hash_map.h @@ -38,6 +38,10 @@ public: insert_result insert(const value_type & value) { return _ht.insert(value); } template <typename InputIt> void insert(InputIt first, InputIt last); + template <typename Func> + void for_each(Func func) const { + _ht.for_each(func); + } const V & operator [] (const K & key) const { return _ht.find(key)->second; } V & operator [] (const K & key) { return _ht.insert(value_type(key, V())).first->second; } void erase(const K & key); diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.h b/vespalib/src/vespa/vespalib/stllike/hashtable.h index 15949067a60..41781e649f3 100644 --- a/vespalib/src/vespa/vespalib/stllike/hashtable.h +++ b/vespalib/src/vespa/vespalib/stllike/hashtable.h @@ -249,6 +249,9 @@ public: insert_result insert(V && node) { return insertInternal(std::forward<V>(node)); } + template <typename Func> + void for_each(Func func) const; + void erase(const Key & key); void reserve(size_t sz) { if (sz > _nodes.capacity()) { diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.hpp b/vespalib/src/vespa/vespalib/stllike/hashtable.hpp index f499ba35f3f..2fbe83eb226 100644 --- a/vespalib/src/vespa/vespalib/stllike/hashtable.hpp +++ b/vespalib/src/vespa/vespalib/stllike/hashtable.hpp @@ -201,6 +201,21 @@ void hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::reclaim(MoveHand } template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator > +template <typename Func> +void hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::for_each(Func func) const +{ + uint32_t i(0); + for (; i < _modulator.getTableSize(); i++) { + if (_nodes[i].valid()) { + func(_nodes[i].getValue()); + } + } + for (; i < _nodes.size(); i++) { + func(_nodes[i].getValue()); + } +} + +template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator > template <typename MoveHandler> void hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::erase(MoveHandler & moveHandler, next_t h, const const_iterator & it) |