aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2025-03-28 17:36:30 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2025-03-28 17:48:52 +0300
commit1e214be59cbf130bee433c422b42f16148e5acff (patch)
treead64b8e01252b7db921f3336688769a928c5b6d7
parenta3709f79ab2678b16c3b2b57e43dd977d08bf7bf (diff)
downloadydb-1e214be59cbf130bee433c422b42f16148e5acff.tar.gz
Intermediate changes
commit_hash:75947792e236bf8588efbadca3b510178fca782a
-rw-r--r--library/cpp/coroutine/engine/coroutine_ut.cpp2
-rw-r--r--yt/yt/core/misc/range_helpers-inl.h51
-rw-r--r--yt/yt/core/misc/range_helpers.h4
3 files changed, 51 insertions, 6 deletions
diff --git a/library/cpp/coroutine/engine/coroutine_ut.cpp b/library/cpp/coroutine/engine/coroutine_ut.cpp
index de56d0ed2bb..656e3943c05 100644
--- a/library/cpp/coroutine/engine/coroutine_ut.cpp
+++ b/library/cpp/coroutine/engine/coroutine_ut.cpp
@@ -112,7 +112,7 @@ void TCoroTest::TestException() {
auto f2 = [&unc, &f2run](TCont*) {
f2run = true;
- unc = std::uncaught_exception();
+ unc = std::uncaught_exceptions();
// check segfault
try {
diff --git a/yt/yt/core/misc/range_helpers-inl.h b/yt/yt/core/misc/range_helpers-inl.h
index 6ce1d498f1b..6f9e054d23f 100644
--- a/yt/yt/core/misc/range_helpers-inl.h
+++ b/yt/yt/core/misc/range_helpers-inl.h
@@ -9,26 +9,59 @@ namespace NDetail {
////////////////////////////////////////////////////////////////////////////////
+template <class TContainer>
+struct TAppendTo
+{ };
+
+template <class TContainer>
+ requires requires (TContainer container, typename TContainer::value_type value) {
+ container.push_back(value);
+ }
+struct TAppendTo<TContainer>
+{
+ template <class TValue>
+ static void Append(TContainer& container, TValue&& value)
+ {
+ container.push_back(std::forward<TValue>(value));
+ }
+};
+
+template <class TContainer>
+ requires requires (TContainer container, typename TContainer::value_type value) {
+ container.insert(value);
+ }
+struct TAppendTo<TContainer>
+{
+ template <class TValue>
+ static void Append(TContainer& container, TValue&& value)
+ {
+ container.insert(std::forward<TValue>(value));
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
template <class TContainer, std::ranges::input_range TRange>
struct TRangeTo
{ };
template <class TContainer, std::ranges::input_range TRange>
- requires requires (TContainer container, size_t size) {
- container.reserve(size);
- container.push_back(std::declval<typename TContainer::value_type>());
+ requires requires (TContainer container, typename TContainer::value_type value) {
+ TAppendTo<TContainer>::Append(container, value);
}
struct TRangeTo<TContainer, TRange>
{
static auto ToContainer(TRange&& range)
{
TContainer container;
- if constexpr (requires { std::ranges::size(range); }) {
+ if constexpr (requires { std::ranges::size(range); } &&
+ requires { container.reserve(std::declval<size_t>()); })
+ {
container.reserve(std::ranges::size(range));
}
for (auto&& element : range) {
- container.push_back(std::forward<decltype(element)>(element));
+ TAppendTo<TContainer>::Append(container, std::forward<decltype(element)>(element));
}
return container;
@@ -54,6 +87,14 @@ auto RangeTo(TRange&& range)
return NDetail::TRangeTo<TContainer, TRange>::ToContainer(std::forward<TRange>(range));
}
+template <class TContainer, std::ranges::input_range TRange, class TTransformFunction>
+auto TransformRangeTo(TRange&& range, TTransformFunction&& function)
+{
+ return RangeTo<TContainer>(std::ranges::views::transform(
+ std::forward<TRange>(range),
+ std::forward<TTransformFunction>(function)));
+}
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT
diff --git a/yt/yt/core/misc/range_helpers.h b/yt/yt/core/misc/range_helpers.h
index 2de49738d28..c59fc54f772 100644
--- a/yt/yt/core/misc/range_helpers.h
+++ b/yt/yt/core/misc/range_helpers.h
@@ -22,6 +22,10 @@ auto ZipMutable(TRanges&&... ranges);
template <class TContainer, std::ranges::input_range TRange>
auto RangeTo(TRange&& range);
+//! Shortcut for `RangeTo(std::ranges::views::transform)`.
+template <class TContainer, std::ranges::input_range TRange, class TTransformFunction>
+auto TransformRangeTo(TRange&& range, TTransformFunction&& function);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT