diff --git a/parallel_hashmap/phmap.h b/parallel_hashmap/phmap.h index 653ae5e..cc37297 100644 --- a/parallel_hashmap/phmap.h +++ b/parallel_hashmap/phmap.h @@ -3094,6 +3094,29 @@ public: return std::get<2>(res); } + // Extension API: support iterating over all values + // + // flat_hash_set s; + // s.insert(...); + // s.for_each([](auto const & key) { + // // Safely iterates over all the keys + // }); + template + void for_each(F&& fCallback) const { + for (auto const& inner : sets_) { + typename Lockable::SharedLock m(const_cast(inner)); + std::for_each(inner.set_.begin(), inner.set_.end(), fCallback); + } + } + + // this version allows to modify the values + void for_each_m(std::function && fCallback) { + for (auto& inner : sets_) { + typename Lockable::UniqueLock m(const_cast(inner)); + std::for_each(inner.set_.begin(), inner.set_.end(), fCallback); + } + } + // Extension API: support for heterogeneous keys. // // std::unordered_set s; diff --git a/tests/parallel_hash_map_test.cc b/tests/parallel_hash_map_test.cc index 4e060db..a740d4d 100644 --- a/tests/parallel_hash_map_test.cc +++ b/tests/parallel_hash_map_test.cc @@ -100,6 +100,22 @@ TEST(THIS_TEST_NAME, ThreadSafeContains) { EXPECT_EQ(m[5], 0); } + { + // ------------- + // test for_each + // ------------- + Map m = { {1, 7}, {2, 8}, {5, 11} }; + + // increment all values by 1 + m.for_each_m([](auto &pair) { ++pair.second; }); + + int counter = 0; + m.for_each([&counter](auto const &pair) { + ++counter; + EXPECT_EQ(pair.first + 7, pair.second); + }); + EXPECT_EQ(counter, 3); + } } } // namespace