aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorosidorkin <osidorkin@yandex-team.com>2023-09-15 18:30:05 +0300
committerosidorkin <osidorkin@yandex-team.com>2023-09-15 18:59:47 +0300
commit81da3699b0acccb745f4fe1a51bccdc931043acc (patch)
treef06e39482efa5b5c628ffad8d50297d916ced7ca
parenta4cc6e01c8ca4271c8c9596c519f8317fb68dd67 (diff)
downloadydb-81da3699b0acccb745f4fe1a51bccdc931043acc.tar.gz
Add THashMultiMap::equal_range_i so new element could be emplaced after checking multiple elements with the given key withoute extra hashing
По аналогии с find_i: хочется после проверки набора значений с данным ключом, вставить (или не вставлять) еще одно с тем же ключом. Добавляю метод, который позволит не считать хэш при вставке
-rw-r--r--util/generic/hash_multi_map.h5
-rw-r--r--util/generic/hash_table.h11
2 files changed, 16 insertions, 0 deletions
diff --git a/util/generic/hash_multi_map.h b/util/generic/hash_multi_map.h
index 12f08ea1a8..6b027073cb 100644
--- a/util/generic/hash_multi_map.h
+++ b/util/generic/hash_multi_map.h
@@ -200,6 +200,11 @@ public:
}
template <class TKey>
+ std::pair<iterator, iterator> equal_range_i(const TKey& key, insert_ctx& ins) {
+ return rep.equal_range_i(key, ins);
+ }
+
+ template <class TKey>
std::pair<const_iterator, const_iterator> equal_range(const TKey& key) const {
return rep.equal_range(key);
}
diff --git a/util/generic/hash_table.h b/util/generic/hash_table.h
index a09c5e73d6..0fbbef6789 100644
--- a/util/generic/hash_table.h
+++ b/util/generic/hash_table.h
@@ -808,6 +808,9 @@ public:
std::pair<const_iterator, const_iterator> equal_range(const OtherKey& key) const;
template <class OtherKey>
+ std::pair<iterator, iterator> equal_range_i(const OtherKey& key, insert_ctx& ins);
+
+ template <class OtherKey>
size_type erase(const OtherKey& key);
template <class OtherKey>
@@ -1100,8 +1103,16 @@ __yhashtable_iterator<V> THashTable<V, K, HF, Ex, Eq, A>::find_i(const OtherKey&
template <class V, class K, class HF, class Ex, class Eq, class A>
template <class OtherKey>
std::pair<__yhashtable_iterator<V>, __yhashtable_iterator<V>> THashTable<V, K, HF, Ex, Eq, A>::equal_range(const OtherKey& key) {
+ insert_ctx ctx;
+ return equal_range_i(key, ctx);
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+template <class OtherKey>
+std::pair<__yhashtable_iterator<V>, __yhashtable_iterator<V>> THashTable<V, K, HF, Ex, Eq, A>::equal_range_i(const OtherKey& key, insert_ctx& ins) {
using pii = std::pair<iterator, iterator>;
const size_type n = bkt_num_key(key);
+ ins = &buckets[n];
node* first = buckets[n];
if (first) /*y*/