aboutsummaryrefslogtreecommitdiffstats
path: root/util/generic
diff options
context:
space:
mode:
authorignatloskutov <ignatloskutov@yandex-team.com>2023-06-02 13:31:58 +0300
committerignatloskutov <ignatloskutov@yandex-team.com>2023-06-02 13:31:58 +0300
commit267e363c49116d6b7b64c43012b622cd17c76542 (patch)
tree1435092d07a8f02c61c3931fcd6acf1e6ee1c7f6 /util/generic
parent4170d875a85af95c7ac004ecbd22029641fa8bb1 (diff)
downloadydb-267e363c49116d6b7b64c43012b622cd17c76542.tar.gz
TMapOps::Value: better return type
Выбирается общий тип, а не тип значения в мапе (но не ссылка, потому что auto), что позволяет писать код в духе: ```cpp TMaybe<int> Foo(THashMap<long, int>& map, long key) { return map.Value(key, TMaybe<int>()); } ```
Diffstat (limited to 'util/generic')
-rw-r--r--util/generic/mapfindptr.h9
-rw-r--r--util/generic/mapfindptr_ut.cpp1
2 files changed, 5 insertions, 5 deletions
diff --git a/util/generic/mapfindptr.h b/util/generic/mapfindptr.h
index bc10cac60f..57a5805de4 100644
--- a/util/generic/mapfindptr.h
+++ b/util/generic/mapfindptr.h
@@ -1,6 +1,7 @@
#pragma once
#include <type_traits>
+#include <utility>
/** MapFindPtr usage:
@@ -38,11 +39,9 @@ struct TMapOps {
}
template <class K, class DefaultValue>
- inline auto Value(const K& key, const DefaultValue& defaultValue) const -> std::remove_reference_t<decltype(*this->FindPtr(key))> {
- if (auto found = FindPtr(key)) {
- return *found;
- }
- return defaultValue;
+ inline auto Value(const K& key, DefaultValue&& defaultValue) const {
+ auto found = FindPtr(key);
+ return found ? *found : std::forward<DefaultValue>(defaultValue);
}
template <class K, class V>
diff --git a/util/generic/mapfindptr_ut.cpp b/util/generic/mapfindptr_ut.cpp
index 613da7a96b..4178f3a0cc 100644
--- a/util/generic/mapfindptr_ut.cpp
+++ b/util/generic/mapfindptr_ut.cpp
@@ -50,6 +50,7 @@ Y_UNIT_TEST_SUITE(TMapFindPtrTest) {
UNIT_ASSERT_VALUES_EQUAL(a.Value(1, "123"), "lol");
UNIT_ASSERT_VALUES_EQUAL(a.Value(2, "123"), "123");
+ UNIT_ASSERT_VALUES_EQUAL(a.Value(2, "123"sv), "123"sv);
}
Y_UNIT_TEST(TestValueRef) {