diff options
author | ignatloskutov <ignatloskutov@yandex-team.com> | 2023-06-02 13:31:58 +0300 |
---|---|---|
committer | ignatloskutov <ignatloskutov@yandex-team.com> | 2023-06-02 13:31:58 +0300 |
commit | 267e363c49116d6b7b64c43012b622cd17c76542 (patch) | |
tree | 1435092d07a8f02c61c3931fcd6acf1e6ee1c7f6 /util/generic | |
parent | 4170d875a85af95c7ac004ecbd22029641fa8bb1 (diff) | |
download | ydb-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.h | 9 | ||||
-rw-r--r-- | util/generic/mapfindptr_ut.cpp | 1 |
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) { |