60 static constexpr bool kRetryEnabled = !std::same_as<RetryPolicy, retry::NoRetry>;
64 using RetryConfigStorage = std::conditional_t<kRetryEnabled, RetryConfig, Empty>;
70 requires(kRetryEnabled)
71 : retry_config_(std::move(retry_config)) {}
73 auto&& SetExecutor(
this auto&& self, OptionalExecutor executor) {
74 self.executor_ = std::move(executor);
75 return std::forward<decltype(self)>(self);
81 auto&& Submit(
this auto&& self, F&& task) {
82 self.tasks_.emplace_back([&] {
83 if constexpr (!kRetryEnabled) {
84 return std::forward<F>(task);
86 return [retry_config = self.retry_config_,
87 task = std::forward<F>(task)]()
mutable -> Status {
88 return RetryRunner<RetryPolicy>(retry_config).Run(task);
92 return std::forward<decltype(self)>(self);
96 if (!executor_.has_value()) {
97 return internal::RunTasksSingleThreaded(std::move(tasks_));
99 return internal::RunTasksParallel(executor_->get(), std::move(tasks_));
103 std::vector<
FnOnce<Status()>> tasks_;
104 OptionalExecutor executor_;
105 [[no_unique_address]] RetryConfigStorage retry_config_;