summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-01-03 09:44:53 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2018-01-03 09:44:53 +0100
commitb5cfeb6ee3174197bbf9de2978b22a0fc9425ad8 (patch)
treee7b4f4287b51cd1073776ad2c20d05afb269f7d7 /vespalib
parentf5e8faf58ead944a57364cbff5dd2411b452570f (diff)
Add a test for for_each
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/stllike/hash_test.cpp27
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_map.h4
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_set.h3
3 files changed, 27 insertions, 7 deletions
diff --git a/vespalib/src/tests/stllike/hash_test.cpp b/vespalib/src/tests/stllike/hash_test.cpp
index b405ac84797..af889754530 100644
--- a/vespalib/src/tests/stllike/hash_test.cpp
+++ b/vespalib/src/tests/stllike/hash_test.cpp
@@ -402,8 +402,7 @@ TEST("test hash set iterators stl compatible")
EXPECT_TRUE((equal_types<iter_traits::value_type, int>::value));
EXPECT_TRUE((equal_types<iter_traits::reference, int&>::value));
EXPECT_TRUE((equal_types<iter_traits::pointer, int*>::value));
- EXPECT_TRUE((equal_types<iter_traits::iterator_category,
- std::forward_iterator_tag>::value));
+ EXPECT_TRUE((equal_types<iter_traits::iterator_category, std::forward_iterator_tag>::value));
typedef set_type::const_iterator const_iter_type;
typedef std::iterator_traits<const_iter_type> const_iter_traits;
@@ -411,8 +410,28 @@ TEST("test hash set iterators stl compatible")
EXPECT_TRUE((equal_types<const_iter_traits::value_type, const int>::value));
EXPECT_TRUE((equal_types<const_iter_traits::reference, const int&>::value));
EXPECT_TRUE((equal_types<const_iter_traits::pointer, const int*>::value));
- EXPECT_TRUE((equal_types<const_iter_traits::iterator_category,
- std::forward_iterator_tag>::value));
+ EXPECT_TRUE((equal_types<const_iter_traits::iterator_category, std::forward_iterator_tag>::value));
+}
+
+void
+verify_sum(const hash_map<size_t, size_t> & m, size_t expexted_sum) {
+ size_t computed_sum = 0;
+ std::for_each(m.begin(), m.end(), [&computed_sum](const auto & v) { computed_sum += v.second; });
+ EXPECT_EQUAL(expexted_sum, computed_sum);
+ computed_sum = 0;
+ m.for_each([&computed_sum](const auto & v) { computed_sum += v.second; });
+ EXPECT_EQUAL(expexted_sum, computed_sum);
+}
+
+TEST("test that for_each member works as std::for_each") {
+ hash_map<size_t, size_t> m;
+ size_t expected_sum(0);
+ for (size_t i(0); i < 1000; i++) {
+ TEST_DO(verify_sum(m, expected_sum));
+ m[i] = i;
+ expected_sum += i;
+ }
+ TEST_DO(verify_sum(m, expected_sum));
}
using IntHashSet = hash_set<int>;
diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.h b/vespalib/src/vespa/vespalib/stllike/hash_map.h
index 321f92a419f..f00b7ec224d 100644
--- a/vespalib/src/vespa/vespalib/stllike/hash_map.h
+++ b/vespalib/src/vespa/vespalib/stllike/hash_map.h
@@ -39,9 +39,7 @@ public:
template <typename InputIt>
void insert(InputIt first, InputIt last);
template <typename Func>
- void for_each(Func func) const {
- _ht.for_each(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/hash_set.h b/vespalib/src/vespa/vespalib/stllike/hash_set.h
index bde2a62c37b..a8d855d5ddd 100644
--- a/vespalib/src/vespa/vespalib/stllike/hash_set.h
+++ b/vespalib/src/vespa/vespalib/stllike/hash_set.h
@@ -43,6 +43,9 @@ public:
iterator find(const K & key) { return _ht.find(key); }
const_iterator find(const K & key) const { return _ht.find(key); }
+ template <typename Func>
+ void for_each(Func func) const { _ht.for_each(func); }
+
template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
const_iterator find(const AltKey & key) const { return _ht.template find<AltKey, AltExtract, AltHash, AltEqual>(key); }