aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/threading/future
diff options
context:
space:
mode:
authorAlexSm <alex@ydb.tech>2023-12-27 23:31:58 +0100
committerGitHub <noreply@github.com>2023-12-27 23:31:58 +0100
commitd67bfb4b4b7549081543e87a31bc6cb5c46ac973 (patch)
tree8674f2f1570877cb653e7ddcff37ba00288de15a /library/cpp/threading/future
parent1f6bef05ed441c3aa2d565ac792b26cded704ac7 (diff)
downloadydb-d67bfb4b4b7549081543e87a31bc6cb5c46ac973.tar.gz
Import libs 4 (#758)
Diffstat (limited to 'library/cpp/threading/future')
-rw-r--r--library/cpp/threading/future/core/future-inl.h8
-rw-r--r--library/cpp/threading/future/core/future.h2
-rw-r--r--library/cpp/threading/future/future_ut.cpp22
3 files changed, 27 insertions, 5 deletions
diff --git a/library/cpp/threading/future/core/future-inl.h b/library/cpp/threading/future/core/future-inl.h
index a98175af2dc..db58b3156c9 100644
--- a/library/cpp/threading/future/core/future-inl.h
+++ b/library/cpp/threading/future/core/future-inl.h
@@ -729,16 +729,16 @@ namespace NThreading {
}
template <typename R>
- inline TFuture<R> TFuture<void>::Return(const R& value) const {
- auto promise = NewPromise<R>();
- Subscribe([=](const TFuture<void>& future) mutable {
+ inline TFuture<std::remove_cvref_t<R>> TFuture<void>::Return(R&& value) const {
+ auto promise = NewPromise<std::remove_cvref_t<R>>();
+ Subscribe([promise, value = std::forward<R>(value)](const TFuture<void>& future) mutable {
try {
future.TryRethrow();
} catch (...) {
promise.SetException(std::current_exception());
return;
}
- promise.SetValue(value);
+ promise.SetValue(std::move(value));
});
return promise;
}
diff --git a/library/cpp/threading/future/core/future.h b/library/cpp/threading/future/core/future.h
index c803b28b756..598336282a0 100644
--- a/library/cpp/threading/future/core/future.h
+++ b/library/cpp/threading/future/core/future.h
@@ -169,7 +169,7 @@ namespace NThreading {
TFuture<TFutureType<TFutureCallResult<F, void>>> Apply(F&& func) const;
template <typename R>
- TFuture<R> Return(const R& value) const;
+ TFuture<std::remove_cvref_t<R>> Return(R&& value) const;
TFuture<void> IgnoreResult() const {
return *this;
diff --git a/library/cpp/threading/future/future_ut.cpp b/library/cpp/threading/future/future_ut.cpp
index 05950a568d4..26f8fa9e9c3 100644
--- a/library/cpp/threading/future/future_ut.cpp
+++ b/library/cpp/threading/future/future_ut.cpp
@@ -635,6 +635,28 @@ namespace {
TestApplyLvalueCopyImpl<void>();
TestApplyLvalueCopyImpl<int>();
}
+
+ Y_UNIT_TEST(ReturnForwardingTypeDeduction) {
+ const TString e = TString(80, 'a');
+ TString l = TString(80, 'a');
+
+ TFuture<TString> futureL = MakeFuture().Return(l);
+ UNIT_ASSERT_VALUES_EQUAL(futureL.GetValue(), e);
+ UNIT_ASSERT_VALUES_EQUAL(l, e);
+
+ TFuture<TString> futureR = MakeFuture().Return(std::move(l));
+ UNIT_ASSERT_VALUES_EQUAL(futureR.GetValue(), e);
+ }
+
+ Y_UNIT_TEST(ReturnForwardingCopiesCount) {
+ size_t numCopies = 0;
+ TCopyCounter copyCounter(&numCopies);
+
+ auto returnedCounter = MakeFuture().Return(std::move(copyCounter)).ExtractValueSync();
+ Y_DO_NOT_OPTIMIZE_AWAY(returnedCounter);
+
+ UNIT_ASSERT_VALUES_EQUAL(numCopies, 0);
+ }
}
}