5#include <libcopp/utils/config/libcopp_build_features.h>
11#if defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS
21#if defined(LIBCOPP_MACRO_ENABLE_STD_COROUTINE) && LIBCOPP_MACRO_ENABLE_STD_COROUTINE
23LIBCOPP_COPP_NAMESPACE_BEGIN
25template <
class TWAITING_CONTAINER>
26struct LIBCOPP_COPP_API_HEAD_ONLY some_waiting_container_traits {
27 using element_type =
typename std::remove_pointer<decltype(gsl::data(std::declval<TWAITING_CONTAINER>()))>::type;
28 using value_type =
typename std::remove_reference<
29 typename std::decay<
decltype(pick_some_reference<typename std::remove_reference<element_type>::type>::unwrap(
30 std::declval<
typename std::add_lvalue_reference<element_type>::type>()))>::type>::type;
33# if defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS
34template <
class TREADY_ELEMENT,
class TWAITING_ELEMENT>
35concept SomeContainerConvertible =
36 std::same_as<TWAITING_ELEMENT, TREADY_ELEMENT> || std::convertible_to<TWAITING_ELEMENT*, TREADY_ELEMENT*>;
38template <
class TREADY_ELEMENT,
class TWAITING_ELEMENT>
39struct LIBCOPP_COPP_API_HEAD_ONLY some_container_convertible
40 : std::enable_if<std::is_same<TWAITING_ELEMENT, TREADY_ELEMENT>::value ||
41 std::is_convertible<TWAITING_ELEMENT*, TREADY_ELEMENT*>::value> {};
44template <
class TREADY_CONTAINER,
class TWAITING_CONTAINER
45# if !(defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS)
47 class =
typename some_container_convertible<
48 typename some_ready_container<TREADY_CONTAINER>::value_type,
49 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type>::type
52LIBCOPP_COPP_API_HEAD_ONLY
inline callable_future<promise_status> some(TREADY_CONTAINER&& ready_futures,
54 TWAITING_CONTAINER&& pending_futures)
55# if defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS
57 requires SomeContainerConvertible<
58 typename some_ready_container<TREADY_CONTAINER>::value_type,
59 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type
64 return some_delegate<typename some_ready_container<TREADY_CONTAINER>::value_type>::run(
65 std::forward<TREADY_CONTAINER>(ready_futures), ready_count, &pending_futures);
68template <
class TREADY_CONTAINER,
class TWAITING_CONTAINER
69# if !(defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS)
71 class =
typename some_container_convertible<
72 typename some_ready_container<TREADY_CONTAINER>::value_type,
73 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type>::type
76LIBCOPP_COPP_API_HEAD_ONLY
inline callable_future<promise_status> any(TREADY_CONTAINER&& ready_futures,
77 TWAITING_CONTAINER&& pending_futures)
78# if defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS
80 requires SomeContainerConvertible<
81 typename some_ready_container<TREADY_CONTAINER>::value_type,
82 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type
87 return some_delegate<typename some_ready_container<TREADY_CONTAINER>::value_type>::run(
88 std::forward<TREADY_CONTAINER>(ready_futures), 1, &pending_futures);
91template <
class TREADY_CONTAINER,
class TWAITING_CONTAINER
92# if !(defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS)
94 class =
typename some_container_convertible<
95 typename some_ready_container<TREADY_CONTAINER>::value_type,
96 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type>::type
99LIBCOPP_COPP_API_HEAD_ONLY
inline callable_future<promise_status> all(TREADY_CONTAINER&& ready_futures,
100 TWAITING_CONTAINER&& pending_futures)
101# if defined(LIBCOPP_MACRO_ENABLE_CONCEPTS) && LIBCOPP_MACRO_ENABLE_CONCEPTS
103 requires SomeContainerConvertible<
104 typename some_ready_container<TREADY_CONTAINER>::value_type,
105 typename some_waiting_container_traits<TWAITING_CONTAINER>::value_type
110 return some_delegate<typename some_ready_container<TREADY_CONTAINER>::value_type>::run(
111 std::forward<TREADY_CONTAINER>(ready_futures),
gsl::size(pending_futures), &pending_futures);
114LIBCOPP_COPP_NAMESPACE_END
constexpr auto size(TCONTAINER &&container) -> decltype(container.size())
std::shared_ptr< cli::cmd_option_value > value_type