Skip to content

Commit 22dbc4b

Browse files
ddvampapolukhin
authored andcommitted
fix universal: use std::addressof in FindOrNullptr
Fixes #1184 Tests: протестировано CI --- Pull Request resolved: #1196 Co-authored-by: antoshkka <antoshkka@userver.tech> Co-authored-by: antoshkka <antoshkka@userver.tech> Co-authored-by: antoshkka <antoshkka@userver.tech> commit_hash:94c5fac1d860840ea0d5a6f3df5e81070c1ad450
1 parent 10da651 commit 22dbc4b

4 files changed

Lines changed: 45 additions & 2 deletions

File tree

.mapping.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6006,6 +6006,7 @@
60066006
"universal/src/utils/not_null_test.cpp":"taxi/uservices/userver/universal/src/utils/not_null_test.cpp",
60076007
"universal/src/utils/numeric_cast_test.cpp":"taxi/uservices/userver/universal/src/utils/numeric_cast_test.cpp",
60086008
"universal/src/utils/optional_ref_test.cpp":"taxi/uservices/userver/universal/src/utils/optional_ref_test.cpp",
6009+
"universal/src/utils/overloaded_address_operator_test.hpp":"taxi/uservices/userver/universal/src/utils/overloaded_address_operator_test.hpp",
60096010
"universal/src/utils/overloaded_test.cpp":"taxi/uservices/userver/universal/src/utils/overloaded_test.cpp",
60106011
"universal/src/utils/projected_set_test.cpp":"taxi/uservices/userver/universal/src/utils/projected_set_test.cpp",
60116012
"universal/src/utils/rand.cpp":"taxi/uservices/userver/universal/src/utils/rand.cpp",

universal/include/userver/utils/algo.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <algorithm>
88
#include <cstddef>
99
#include <iterator>
10+
#include <memory>
1011
#include <optional>
1112
#include <string>
1213
#include <string_view>
@@ -46,9 +47,9 @@ template <typename Container, typename Key>
4647
auto* FindOrNullptr(Container& container, const Key& key) {
4748
const auto it = container.find(key);
4849
if constexpr (impl::HasMappedType<Container>) {
49-
return (it != container.end() ? &(it->second) : nullptr);
50+
return (it != container.end() ? std::addressof(it->second) : nullptr);
5051
} else {
51-
return (it != container.end() ? &(*it) : nullptr);
52+
return (it != container.end() ? std::addressof(*it) : nullptr);
5253
}
5354
}
5455

universal/src/utils/algo_test.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <unordered_set>
88
#include <vector>
99

10+
#include "overloaded_address_operator_test.hpp"
11+
1012
#include <gtest/gtest.h>
1113

1214
USERVER_NAMESPACE_BEGIN
@@ -46,6 +48,18 @@ TEST(UtilsAlgo, FindOrNullptrSets) {
4648
EXPECT_EQ(*utils::FindOrNullptr(us, "1"), "1");
4749
}
4850

51+
TEST(UtilsAlgo, FindOrNullptrMapAddressof) {
52+
const std::map<std::string, utils::OverloadedAddressOperator> m{{"1", {.payload = 1}}};
53+
const auto ptr = utils::FindOrNullptr(m, "1");
54+
ASSERT_TRUE(ptr);
55+
}
56+
57+
TEST(UtilsAlgo, FindOrNullptrSetAddressof) {
58+
const std::set<utils::OverloadedAddressOperator> s{{.payload = 1}};
59+
const auto ptr = utils::FindOrNullptr(s, utils::OverloadedAddressOperator{.payload = 1});
60+
ASSERT_TRUE(ptr);
61+
}
62+
4963
TEST(UtilsAlgo, FindOrDefaultMaps) {
5064
constexpr int kFallback = 42;
5165
std::map<std::string, int> m = {{"1", 2}};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include <userver/utils/assert.hpp>
4+
5+
USERVER_NAMESPACE_BEGIN
6+
7+
namespace utils {
8+
9+
struct OverloadedAddressOperator {
10+
int payload{0};
11+
12+
auto operator<=>(const OverloadedAddressOperator& other) const { return payload <=> other.payload; };
13+
14+
auto operator&() { // NOLINT(google-runtime-operator)
15+
UASSERT(false);
16+
return this;
17+
}
18+
19+
auto operator&() const { // NOLINT(google-runtime-operator)
20+
UASSERT(false);
21+
return this;
22+
}
23+
};
24+
25+
} // namespace utils
26+
27+
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)