diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-03-18 22:09:00 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-03-18 22:09:00 +0000 |
commit | 94579ec02f1b9cf90a2ef40dcb9d66ce8dce85e2 (patch) | |
tree | 73f127aa97e76b351d693fcb5816690e465f1f9c /vespalib | |
parent | 3a785aa5363cb143a04988b39975f33431a54bf4 (diff) |
Use vespalib::hash_set instead of std::set to reduce number of allocation and epeed it up. Also use faster 2^N AND based hash tables.
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/hash_test.cpp | 3 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hash_map.hpp | 5 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/hash_set.h | 1 |
3 files changed, 7 insertions, 2 deletions
diff --git a/vespalib/src/tests/stllike/hash_test.cpp b/vespalib/src/tests/stllike/hash_test.cpp index 017a16ee7b6..b39b6859623 100644 --- a/vespalib/src/tests/stllike/hash_test.cpp +++ b/vespalib/src/tests/stllike/hash_test.cpp @@ -356,6 +356,9 @@ TEST("test hash set find") EXPECT_TRUE(*set.find(S(1)) == S(1)); auto cit = set.find<uint32_t>(7); EXPECT_TRUE(*cit == S(7)); + + EXPECT_EQUAL(1u, set.count(S(7))); + EXPECT_EQUAL(0u, set.count(S(10007))); } TEST("test hash set range constructor") diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp index 08edcf3c837..0b474afa750 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp +++ b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp @@ -74,10 +74,11 @@ hash_map<K, V, H, EQ, M>::getMemoryUsed() const vespalib::hashtable<K, std::pair<K,V>, H, E, vespalib::Select1st<std::pair<K,V>>, M>::insert(std::pair<K,V> &&); \ template vespalib::hashtable<K, std::pair<K,V>, H, E, vespalib::Select1st<std::pair<K,V>>, M>::insert_result \ vespalib::hashtable<K, std::pair<K,V>, H, E, vespalib::Select1st<std::pair<K,V>>, M>::insertInternal(std::pair<K,V> &&); \ - template class vespalib::Array<vespalib::hash_node<std::pair<K,V>>>; #define VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, E) \ - VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, vespalib::hashtable_base::prime_modulator) + template class vespalib::Array<vespalib::hash_node<std::pair<K,V>>>; \ + VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, vespalib::hashtable_base::prime_modulator) \ + VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, vespalib::hashtable_base::and_modulator) #define VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, H) VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, std::equal_to<>) diff --git a/vespalib/src/vespa/vespalib/stllike/hash_set.h b/vespalib/src/vespa/vespalib/stllike/hash_set.h index 8d315ebfd07..08288086bf3 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_set.h +++ b/vespalib/src/vespa/vespalib/stllike/hash_set.h @@ -42,6 +42,7 @@ public: template<typename InputIt> void insert(InputIt first, InputIt last); void erase(const K & key); + size_t count(const K & key) const { return _ht.find(key) != end() ? 1 : 0; } iterator find(const K & key) { return _ht.find(key); } const_iterator find(const K & key) const { return _ht.find(key); } |