10 #include <type_traits>
19 template <
typename,
typename =
void>
20 struct func_traits : std::false_type {
24 struct func_traits<T, std::void_t<decltype(&std::decay_t<T>::operator())>>
25 : func_traits<decltype(&std::decay_t<T>::operator())> {
28 template <
typename C,
typename R,
typename... Args>
29 struct func_traits<R (C::*)(Args...)> : func_traits<R (*)(Args...)> {
32 template <
typename C,
typename R,
typename... Args>
33 struct func_traits<R (C::*)(Args...) const> : func_traits<R (*)(Args...)> {
36 template <
typename R,
typename... Args>
37 struct func_traits<R (*)(Args...)> : std::true_type {
38 using result_type = R;
39 using args_type = std::tuple<Args...>;
40 static constexpr
auto args_count = std::tuple_size_v<args_type>;
44 constexpr
bool func_traits_v = func_traits<T>::value;
47 struct is_awaitable : std::false_type {
50 #if defined(PACKIO_HAS_CO_AWAIT)
51 template <
typename... Args>
52 struct is_awaitable<net::awaitable<Args...>> : std::true_type {
56 template <
typename,
typename =
void>
57 struct is_coroutine : std::false_type {
61 struct is_coroutine<T, std::enable_if_t<func_traits_v<T>>>
62 : is_awaitable<typename func_traits<T>::result_type> {
66 constexpr
bool is_coroutine_v = is_coroutine<T>::value;
68 template <
typename T,
typename =
void>
69 struct is_tuple : std::false_type {
73 struct is_tuple<T, std::void_t<decltype(std::tuple_size<std::decay_t<T>>::value)>>
78 constexpr
auto is_tuple_v = is_tuple<T>::value;
81 struct left_shift_tuple;
83 template <
typename A,
typename... Bs>
84 struct left_shift_tuple<std::tuple<A, Bs...>> {
85 using type = std::tuple<Bs...>;
89 using left_shift_tuple_t =
typename left_shift_tuple<T>::type;
91 template <
template <
typename...>
class Map,
typename T>
94 template <
template <
typename...>
class Map,
typename... Args>
95 struct map_tuple<Map, std::tuple<Args...>> {
96 using type = std::tuple<Map<Args>...>;
99 template <
template <
typename...>
class Map,
typename T>
100 using map_tuple_t =
typename map_tuple<Map, T>::type;
102 template <
typename T>
103 using decay_tuple_t = map_tuple_t<std::decay_t, T>;
105 template <
typename... Args>
106 struct always_false : std::false_type {
109 template <
typename... Args>
110 constexpr
auto always_false_v = always_false<Args...>::value;
112 template <
typename T>
113 void set_no_delay(T&)
118 inline void set_no_delay(net::ip::tcp::socket& socket)
121 socket.set_option(net::ip::tcp::no_delay{
true}, ec);
123 PACKIO_WARN(
"error setting tcp nodelay option: {}", ec.message());
127 template <
typename T>
128 std::unique_ptr<std::decay_t<T>> to_unique_ptr(T&& value)
130 return std::make_unique<std::decay_t<T>>(std::forward<T>(value));
133 template <
typename Executor,
typename Obj>
134 auto bind_executor(Executor&& executor, Obj&& obj)
136 return net::bind_executor(
137 any_io_executor(std::forward<Executor>(executor)),
138 std::forward<Obj>(obj));
The packio namespace.
Definition: arg.h:14