diff options
author | osidorkin <osidorkin@yandex-team.com> | 2023-09-15 18:30:05 +0300 |
---|---|---|
committer | osidorkin <osidorkin@yandex-team.com> | 2023-09-15 18:59:47 +0300 |
commit | 81da3699b0acccb745f4fe1a51bccdc931043acc (patch) | |
tree | f06e39482efa5b5c628ffad8d50297d916ced7ca | |
parent | a4cc6e01c8ca4271c8c9596c519f8317fb68dd67 (diff) | |
download | ydb-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.h | 5 | ||||
-rw-r--r-- | util/generic/hash_table.h | 11 |
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*/ |