@@ -241,16 +241,14 @@ namespace hpx::execution::experimental {
241241 // get_completion_scheduler<set_value_t> and obtain the scheduler
242242 // that originated the work.
243243 HPX_CXX_CORE_EXPORT template <typename Future, typename Scheduler>
244- struct as_sender_sender_with_scheduler ;
245-
246- template <typename T, typename Scheduler>
247- struct as_sender_sender_with_scheduler <hpx::future<T>, Scheduler>
248- : public as_sender_sender_base<hpx::future<T>>
244+ requires hpx::traits::is_future_v<std::decay_t <Future>>
245+ struct as_sender_sender_with_scheduler
246+ : public as_sender_sender_base<std::decay_t <Future>>
249247 {
250248 using sender_concept = hpx::execution::experimental::sender_t ;
251- using future_type = hpx::future<T >;
249+ using future_type = std:: decay_t <Future >;
252250 using scheduler_type = std::decay_t <Scheduler>;
253- using base_type = as_sender_sender_base<hpx::future<T >>;
251+ using base_type = as_sender_sender_base<std:: decay_t <Future >>;
254252 using base_type::future_;
255253
256254 HPX_NO_UNIQUE_ADDRESS scheduler_type scheduler_;
@@ -261,107 +259,28 @@ namespace hpx::execution::experimental {
261259 {
262260 scheduler_type const & sched;
263261
264- auto query (hpx::execution::experimental::get_domain_t )
265- const noexcept
266- {
267- return hpx::execution::experimental::get_domain (sched);
268- }
269-
270- template <typename CPO>
271- requires std::is_same_v<CPO,
272- hpx::execution::experimental::
273- set_value_t > ||
274- std::is_same_v<CPO,
275- hpx::execution::experimental::set_stopped_t >
276262 auto query (
277- hpx::execution::experimental::
278- get_completion_scheduler_t <CPO>) const noexcept
279- {
280- return sched;
281- }
282- };
283-
284- template <typename Future_, typename Scheduler_,
285- typename = std::enable_if_t <!std::is_same_v<
286- std::decay_t <Future_>,
287- as_sender_sender_with_scheduler>>>
288- explicit as_sender_sender_with_scheduler (
289- Future_&& future, Scheduler_&& scheduler)
290- : base_type{HPX_FORWARD (Future_, future)}
291- , scheduler_(HPX_FORWARD(Scheduler_, scheduler))
292- {
293- }
294-
295- as_sender_sender_with_scheduler (
296- as_sender_sender_with_scheduler&&) = default ;
297- as_sender_sender_with_scheduler& operator =(
298- as_sender_sender_with_scheduler&&) = default ;
299- as_sender_sender_with_scheduler (
300- as_sender_sender_with_scheduler const &) = delete ;
301- as_sender_sender_with_scheduler& operator =(
302- as_sender_sender_with_scheduler const &) = delete ;
303-
304- template <typename Self, typename ... Env>
305- static consteval auto get_completion_signatures () noexcept ->
306- typename base_type::completion_signatures
307- {
308- return {};
309- }
310-
311- template <typename Receiver>
312- auto connect (Receiver&& receiver) &&
313- {
314- return as_sender_operation_state<Receiver, future_type>{
315- HPX_FORWARD (Receiver, receiver), HPX_MOVE (future_)};
316- }
317-
318- constexpr auto get_env () const noexcept
319- {
320- return env{scheduler_};
321- }
322- };
323-
324- template <typename T, typename Scheduler>
325- struct as_sender_sender_with_scheduler <hpx::shared_future<T>, Scheduler>
326- : public as_sender_sender_base<hpx::shared_future<T>>
327- {
328- using sender_concept = hpx::execution::experimental::sender_t ;
329- using future_type = hpx::shared_future<T>;
330- using scheduler_type = std::decay_t <Scheduler>;
331- using base_type =
332- as_sender_sender_base<hpx::shared_future<T>>;
333- using base_type::future_;
334-
335- HPX_NO_UNIQUE_ADDRESS scheduler_type scheduler_;
336-
337- struct env
338- {
339- scheduler_type const & sched;
340-
341- auto query (hpx::execution::experimental::get_domain_t )
342- const noexcept
263+ hpx::execution::experimental::get_domain_t ) const noexcept
343264 {
344265 return hpx::execution::experimental::get_domain (sched);
345266 }
346267
347268 template <typename CPO>
348269 requires std::is_same_v<CPO,
349- hpx::execution::experimental::
350- set_value_t > ||
351- std::is_same_v<CPO,
352- hpx::execution::experimental::set_stopped_t >
270+ hpx::execution::experimental::set_value_t > ||
271+ std::is_same_v<CPO,
272+ hpx::execution::experimental::set_stopped_t >
353273 auto query (
354- hpx::execution::experimental::
355- get_completion_scheduler_t < CPO>) const noexcept
274+ hpx::execution::experimental::get_completion_scheduler_t <
275+ CPO>) const noexcept
356276 {
357277 return sched;
358278 }
359279 };
360280
361- template <typename Future_, typename Scheduler_,
362- typename = std::enable_if_t <!std::is_same_v<
363- std::decay_t <Future_>,
364- as_sender_sender_with_scheduler>>>
281+ template <typename Future_, typename Scheduler_>
282+ requires (!std::is_same_v<std::decay_t <Future_>,
283+ as_sender_sender_with_scheduler>)
365284 explicit as_sender_sender_with_scheduler (
366285 Future_&& future, Scheduler_&& scheduler)
367286 : base_type{HPX_FORWARD (Future_, future)}
@@ -432,15 +351,13 @@ namespace hpx::execution::experimental {
432351 // environment exposes the given scheduler as completion scheduler.
433352 template <typename Future, typename Scheduler>
434353 requires hpx::traits::is_future_v<std::decay_t <Future>> &&
435- hpx::execution::experimental::scheduler<
436- std::decay_t <Scheduler>>
354+ hpx::execution::experimental::scheduler<std::decay_t <Scheduler>>
437355 constexpr HPX_FORCEINLINE auto operator ()(
438356 Future&& future, Scheduler&& scheduler) const
439357 {
440- return detail::as_sender_sender_with_scheduler<
441- std::decay_t <Future>, std::decay_t <Scheduler>>(
442- HPX_FORWARD (Future, future),
443- HPX_FORWARD (Scheduler, scheduler));
358+ return detail::as_sender_sender_with_scheduler<std::decay_t <Future>,
359+ std::decay_t <Scheduler>>(
360+ HPX_FORWARD (Future, future), HPX_FORWARD (Scheduler, scheduler));
444361 }
445362
446363 constexpr HPX_FORCEINLINE auto operator ()() const
0 commit comments