diff options
author | robot-piglet <robot-piglet@yandex-team.com> | 2025-03-28 17:36:30 +0300 |
---|---|---|
committer | robot-piglet <robot-piglet@yandex-team.com> | 2025-03-28 17:48:52 +0300 |
commit | 1e214be59cbf130bee433c422b42f16148e5acff (patch) | |
tree | ad64b8e01252b7db921f3336688769a928c5b6d7 | |
parent | a3709f79ab2678b16c3b2b57e43dd977d08bf7bf (diff) | |
download | ydb-1e214be59cbf130bee433c422b42f16148e5acff.tar.gz |
Intermediate changes
commit_hash:75947792e236bf8588efbadca3b510178fca782a
-rw-r--r-- | library/cpp/coroutine/engine/coroutine_ut.cpp | 2 | ||||
-rw-r--r-- | yt/yt/core/misc/range_helpers-inl.h | 51 | ||||
-rw-r--r-- | yt/yt/core/misc/range_helpers.h | 4 |
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 |