Skip to content

Commit b9622c0

Browse files
committed
fix universal: fix initialization of default values in FindOrDefault
1 parent 6dce31c commit b9622c0

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

universal/include/userver/utils/algo.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,17 @@ auto* FindOrNullptr(Container& container, const Key& key) {
5757
template <typename Container, typename Key, typename Default>
5858
auto FindOrDefault(Container& container, const Key& key, Default&& def) {
5959
const auto* ptr = USERVER_NAMESPACE::utils::FindOrNullptr(container, key);
60-
return (ptr ? *ptr : decltype(*ptr){std::forward<Default>(def)});
60+
using R = std::remove_cvref_t<decltype(*ptr)>;
61+
return (ptr ? *ptr : R(std::forward<Default>(def)));
6162
}
6263

6364
/// @brief Returns default value if no key in associative container, otherwise
6465
/// returns a copy of the stored value.
6566
template <typename Container, typename Key>
6667
auto FindOrDefault(Container& container, const Key& key) {
6768
const auto* ptr = USERVER_NAMESPACE::utils::FindOrNullptr(container, key);
68-
return (ptr ? *ptr : decltype(*ptr){});
69+
using R = std::remove_cvref_t<decltype(*ptr)>;
70+
return (ptr ? *ptr : R());
6971
}
7072

7173
/// @brief Returns std::nullopt if no key in associative container, otherwise

universal/src/utils/algo_test.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,26 @@ TEST(UtilsAlgo, FindOrNullptrSets) {
4848

4949
TEST(UtilsAlgo, FindOrDefaultMaps) {
5050
constexpr int kFallback = 42;
51+
constexpr int kDefault = int();
5152
std::map<std::string, int> m = {{"1", 2}};
5253
std::unordered_map<std::string, int> um = {{"1", 2}};
5354

5455
EXPECT_EQ(utils::FindOrDefault(m, "2", kFallback), kFallback);
5556
EXPECT_EQ(utils::FindOrDefault(um, "2", kFallback), kFallback);
5657

57-
ASSERT_EQ(utils::FindOrDefault(m, "1", kFallback), 2);
58-
ASSERT_EQ(utils::FindOrDefault(um, "1", kFallback), 2);
59-
6058
EXPECT_EQ(utils::FindOrDefault(m, "1", kFallback), 2);
6159
EXPECT_EQ(utils::FindOrDefault(um, "1", kFallback), 2);
60+
61+
EXPECT_EQ(utils::FindOrDefault(m, "2"), kDefault);
62+
EXPECT_EQ(utils::FindOrDefault(um, "2"), kDefault);
63+
64+
EXPECT_EQ(utils::FindOrDefault(m, "1"), 2);
65+
EXPECT_EQ(utils::FindOrDefault(um, "1"), 2);
6266
}
6367

6468
TEST(UtilsAlgo, FindOrDefaultSets) {
6569
constexpr int kFallback = 42;
70+
constexpr int kDefault = int();
6671
std::set<int> s = {1};
6772
std::unordered_set<int> us = {1};
6873

@@ -71,6 +76,12 @@ TEST(UtilsAlgo, FindOrDefaultSets) {
7176

7277
EXPECT_EQ(utils::FindOrDefault(s, 1, kFallback), 1);
7378
EXPECT_EQ(utils::FindOrDefault(us, 1, kFallback), 1);
79+
80+
EXPECT_EQ(utils::FindOrDefault(s, 2), kDefault);
81+
EXPECT_EQ(utils::FindOrDefault(us, 2), kDefault);
82+
83+
EXPECT_EQ(utils::FindOrDefault(s, 1), 1);
84+
EXPECT_EQ(utils::FindOrDefault(us, 1), 1);
7485
}
7586

7687
TEST(UtilsAlgo, FindOptionalMaps) {

0 commit comments

Comments
 (0)