packio
utils.h
1 // This Source Code Form is subject to the terms of the Mozilla Public
2 // License, v. 2.0. If a copy of the MPL was not distributed with this
3 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4 
5 #ifndef PACKIO_UTILS_H
6 #define PACKIO_UTILS_H
7 
8 #include <sstream>
9 #include <string_view>
10 #include <type_traits>
11 #include <vector>
12 
13 #include "config.h"
14 #include "log.h"
15 
16 namespace packio {
17 namespace internal {
18 
19 template <typename, typename = void>
20 struct func_traits : std::false_type {
21 };
22 
23 template <typename T>
24 struct func_traits<T, std::void_t<decltype(&std::decay_t<T>::operator())>>
25  : func_traits<decltype(&std::decay_t<T>::operator())> {
26 };
27 
28 template <typename C, typename R, typename... Args>
29 struct func_traits<R (C::*)(Args...)> : func_traits<R (*)(Args...)> {
30 };
31 
32 template <typename C, typename R, typename... Args>
33 struct func_traits<R (C::*)(Args...) const> : func_traits<R (*)(Args...)> {
34 };
35 
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>;
41 };
42 
43 template <typename T>
44 constexpr bool func_traits_v = func_traits<T>::value;
45 
46 #if defined(PACKIO_HAS_CO_AWAIT)
47 template <typename>
48 struct is_awaitable : std::false_type {
49 };
50 
51 template <typename... Args>
52 struct is_awaitable<net::awaitable<Args...>> : std::true_type {
53 };
54 
55 template <typename, typename = void>
56 struct is_coroutine : std::false_type {
57 };
58 
59 template <typename T>
60 struct is_coroutine<T, std::enable_if_t<func_traits_v<T>>>
61  : is_awaitable<typename func_traits<T>::result_type> {
62 };
63 
64 template <typename T>
65 constexpr bool is_coroutine_v = is_coroutine<T>::value;
66 #endif // defined(PACKIO_HAS_CO_AWAIT)
67 
68 template <typename T, typename = void>
69 struct is_tuple : std::false_type {
70 };
71 
72 template <typename T>
73 struct is_tuple<T, std::void_t<decltype(std::tuple_size<std::decay_t<T>>::value)>>
74  : std::true_type {
75 };
76 
77 template <typename T>
78 constexpr auto is_tuple_v = is_tuple<T>::value;
79 
80 template <typename T>
81 struct shift_tuple;
82 
83 template <typename A, typename... Bs>
84 struct shift_tuple<std::tuple<A, Bs...>> {
85  using type = std::tuple<Bs...>;
86 };
87 
88 template <typename T>
89 using shift_tuple_t = typename shift_tuple<T>::type;
90 
91 template <typename T>
92 struct decay_tuple;
93 
94 template <typename... Args>
95 struct decay_tuple<std::tuple<Args...>> {
96  using type = std::tuple<std::decay_t<Args>...>;
97 };
98 
99 template <typename T>
100 using decay_tuple_t = typename decay_tuple<T>::type;
101 
102 template <typename T>
103 void set_no_delay(T&)
104 {
105 }
106 
107 template <>
108 inline void set_no_delay(net::ip::tcp::socket& socket)
109 {
110  socket.set_option(net::ip::tcp::no_delay{true});
111 }
112 
113 template <typename T>
114 std::unique_ptr<std::decay_t<T>> to_unique_ptr(T&& value)
115 {
116  return std::make_unique<std::decay_t<T>>(std::forward<T>(value));
117 }
118 
119 } // internal
120 } // packio
121 
122 #endif // PACKIO_UTILS_H
packio
Definition: arg.h:14