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;
46 #if defined(PACKIO_HAS_CO_AWAIT)
48 struct is_awaitable : std::false_type {
51 template <
typename... Args>
52 struct is_awaitable<net::awaitable<Args...>> : std::true_type {
55 template <
typename,
typename =
void>
56 struct is_coroutine : std::false_type {
60 struct is_coroutine<T, std::enable_if_t<func_traits_v<T>>>
61 : is_awaitable<typename func_traits<T>::result_type> {
65 constexpr
bool is_coroutine_v = is_coroutine<T>::value;
66 #endif // defined(PACKIO_HAS_CO_AWAIT)
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;
83 template <
typename A,
typename... Bs>
84 struct shift_tuple<std::tuple<A, Bs...>> {
85 using type = std::tuple<Bs...>;
89 using shift_tuple_t =
typename shift_tuple<T>::type;
94 template <
typename... Args>
95 struct decay_tuple<std::tuple<Args...>> {
96 using type = std::tuple<std::decay_t<Args>...>;
100 using decay_tuple_t =
typename decay_tuple<T>::type;
102 template <
typename T>
103 void set_no_delay(T&)
108 inline void set_no_delay(net::ip::tcp::socket& socket)
110 socket.set_option(net::ip::tcp::no_delay{
true});
113 template <
typename T>
114 std::unique_ptr<std::decay_t<T>> to_unique_ptr(T&& value)
116 return std::make_unique<std::decay_t<T>>(std::forward<T>(value));
122 #endif // PACKIO_UTILS_H