diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-01-03 09:44:53 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-01-03 09:44:53 +0100 |
commit | b5cfeb6ee3174197bbf9de2978b22a0fc9425ad8 (patch) | |
tree | e7b4f4287b51cd1073776ad2c20d05afb269f7d7 /vespalib | |
parent | f5e8faf58ead944a57364cbff5dd2411b452570f (diff) |
Add a test for for_each
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/hash_test.cpp | 27 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hash_map.h | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hash_set.h | 3 |
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); } |