summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-12-28 00:04:08 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2018-01-03 09:08:48 +0100
commitf5e8faf58ead944a57364cbff5dd2411b452570f (patch)
treeb64d47d48a92f6773b0e0d2b646e04df3890f66e
parente77379005bccd3d5009b1484038183a05856b4cd (diff)
Add a for_each method for more efficient iteration.
-rw-r--r--document/src/test/resources/tensor/multi_cell_tensor__cppbin107 -> 107 bytes
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp1
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_map.h4
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hashtable.h3
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hashtable.hpp15
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
index c0b2b3a165a..d4c7c5fbbe5 100644
--- a/document/src/test/resources/tensor/multi_cell_tensor__cpp
+++ b/document/src/test/resources/tensor/multi_cell_tensor__cpp
Binary files differ
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)