is_buffer_sequence.hpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. //
  2. // detail/is_buffer_sequence.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
  11. #define ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include "asio/detail/config.hpp"
  16. #include "asio/detail/type_traits.hpp"
  17. #include "asio/detail/push_options.hpp"
  18. namespace asio {
  19. class mutable_buffer;
  20. class const_buffer;
  21. class mutable_registered_buffer;
  22. class const_registered_buffer;
  23. namespace detail {
  24. struct buffer_sequence_memfns_base
  25. {
  26. void begin();
  27. void end();
  28. void size();
  29. void max_size();
  30. void capacity();
  31. void data();
  32. void prepare();
  33. void commit();
  34. void consume();
  35. void grow();
  36. void shrink();
  37. };
  38. template <typename T>
  39. struct buffer_sequence_memfns_derived
  40. : T, buffer_sequence_memfns_base
  41. {
  42. };
  43. template <typename T, T>
  44. struct buffer_sequence_memfns_check
  45. {
  46. };
  47. #if defined(ASIO_HAS_DECLTYPE)
  48. template <typename>
  49. char buffer_sequence_begin_helper(...);
  50. template <typename T>
  51. char (&buffer_sequence_begin_helper(T* t,
  52. typename enable_if<!is_same<
  53. decltype(asio::buffer_sequence_begin(*t)),
  54. void>::value>::type*))[2];
  55. #else // defined(ASIO_HAS_DECLTYPE)
  56. template <typename>
  57. char (&buffer_sequence_begin_helper(...))[2];
  58. template <typename T>
  59. char buffer_sequence_begin_helper(T* t,
  60. buffer_sequence_memfns_check<
  61. void (buffer_sequence_memfns_base::*)(),
  62. &buffer_sequence_memfns_derived<T>::begin>*);
  63. #endif // defined(ASIO_HAS_DECLTYPE)
  64. #if defined(ASIO_HAS_DECLTYPE)
  65. template <typename>
  66. char buffer_sequence_end_helper(...);
  67. template <typename T>
  68. char (&buffer_sequence_end_helper(T* t,
  69. typename enable_if<!is_same<
  70. decltype(asio::buffer_sequence_end(*t)),
  71. void>::value>::type*))[2];
  72. #else // defined(ASIO_HAS_DECLTYPE)
  73. template <typename>
  74. char (&buffer_sequence_end_helper(...))[2];
  75. template <typename T>
  76. char buffer_sequence_end_helper(T* t,
  77. buffer_sequence_memfns_check<
  78. void (buffer_sequence_memfns_base::*)(),
  79. &buffer_sequence_memfns_derived<T>::end>*);
  80. #endif // defined(ASIO_HAS_DECLTYPE)
  81. template <typename>
  82. char (&size_memfn_helper(...))[2];
  83. template <typename T>
  84. char size_memfn_helper(
  85. buffer_sequence_memfns_check<
  86. void (buffer_sequence_memfns_base::*)(),
  87. &buffer_sequence_memfns_derived<T>::size>*);
  88. template <typename>
  89. char (&max_size_memfn_helper(...))[2];
  90. template <typename T>
  91. char max_size_memfn_helper(
  92. buffer_sequence_memfns_check<
  93. void (buffer_sequence_memfns_base::*)(),
  94. &buffer_sequence_memfns_derived<T>::max_size>*);
  95. template <typename>
  96. char (&capacity_memfn_helper(...))[2];
  97. template <typename T>
  98. char capacity_memfn_helper(
  99. buffer_sequence_memfns_check<
  100. void (buffer_sequence_memfns_base::*)(),
  101. &buffer_sequence_memfns_derived<T>::capacity>*);
  102. template <typename>
  103. char (&data_memfn_helper(...))[2];
  104. template <typename T>
  105. char data_memfn_helper(
  106. buffer_sequence_memfns_check<
  107. void (buffer_sequence_memfns_base::*)(),
  108. &buffer_sequence_memfns_derived<T>::data>*);
  109. template <typename>
  110. char (&prepare_memfn_helper(...))[2];
  111. template <typename T>
  112. char prepare_memfn_helper(
  113. buffer_sequence_memfns_check<
  114. void (buffer_sequence_memfns_base::*)(),
  115. &buffer_sequence_memfns_derived<T>::prepare>*);
  116. template <typename>
  117. char (&commit_memfn_helper(...))[2];
  118. template <typename T>
  119. char commit_memfn_helper(
  120. buffer_sequence_memfns_check<
  121. void (buffer_sequence_memfns_base::*)(),
  122. &buffer_sequence_memfns_derived<T>::commit>*);
  123. template <typename>
  124. char (&consume_memfn_helper(...))[2];
  125. template <typename T>
  126. char consume_memfn_helper(
  127. buffer_sequence_memfns_check<
  128. void (buffer_sequence_memfns_base::*)(),
  129. &buffer_sequence_memfns_derived<T>::consume>*);
  130. template <typename>
  131. char (&grow_memfn_helper(...))[2];
  132. template <typename T>
  133. char grow_memfn_helper(
  134. buffer_sequence_memfns_check<
  135. void (buffer_sequence_memfns_base::*)(),
  136. &buffer_sequence_memfns_derived<T>::grow>*);
  137. template <typename>
  138. char (&shrink_memfn_helper(...))[2];
  139. template <typename T>
  140. char shrink_memfn_helper(
  141. buffer_sequence_memfns_check<
  142. void (buffer_sequence_memfns_base::*)(),
  143. &buffer_sequence_memfns_derived<T>::shrink>*);
  144. template <typename, typename>
  145. char (&buffer_sequence_element_type_helper(...))[2];
  146. #if defined(ASIO_HAS_DECLTYPE)
  147. template <typename T, typename Buffer>
  148. char buffer_sequence_element_type_helper(T* t,
  149. typename enable_if<is_convertible<
  150. decltype(*asio::buffer_sequence_begin(*t)),
  151. Buffer>::value>::type*);
  152. #else // defined(ASIO_HAS_DECLTYPE)
  153. template <typename T, typename Buffer>
  154. char buffer_sequence_element_type_helper(
  155. typename T::const_iterator*,
  156. typename enable_if<is_convertible<
  157. typename T::value_type, Buffer>::value>::type*);
  158. #endif // defined(ASIO_HAS_DECLTYPE)
  159. template <typename>
  160. char (&const_buffers_type_typedef_helper(...))[2];
  161. template <typename T>
  162. char const_buffers_type_typedef_helper(
  163. typename T::const_buffers_type*);
  164. template <typename>
  165. char (&mutable_buffers_type_typedef_helper(...))[2];
  166. template <typename T>
  167. char mutable_buffers_type_typedef_helper(
  168. typename T::mutable_buffers_type*);
  169. template <typename T, typename Buffer>
  170. struct is_buffer_sequence_class
  171. : integral_constant<bool,
  172. sizeof(buffer_sequence_begin_helper<T>(0, 0)) != 1 &&
  173. sizeof(buffer_sequence_end_helper<T>(0, 0)) != 1 &&
  174. sizeof(buffer_sequence_element_type_helper<T, Buffer>(0, 0)) == 1>
  175. {
  176. };
  177. template <typename T, typename Buffer>
  178. struct is_buffer_sequence
  179. : conditional<is_class<T>::value,
  180. is_buffer_sequence_class<T, Buffer>,
  181. false_type>::type
  182. {
  183. };
  184. template <>
  185. struct is_buffer_sequence<mutable_buffer, mutable_buffer>
  186. : true_type
  187. {
  188. };
  189. template <>
  190. struct is_buffer_sequence<mutable_buffer, const_buffer>
  191. : true_type
  192. {
  193. };
  194. template <>
  195. struct is_buffer_sequence<const_buffer, const_buffer>
  196. : true_type
  197. {
  198. };
  199. template <>
  200. struct is_buffer_sequence<const_buffer, mutable_buffer>
  201. : false_type
  202. {
  203. };
  204. template <>
  205. struct is_buffer_sequence<mutable_registered_buffer, mutable_buffer>
  206. : true_type
  207. {
  208. };
  209. template <>
  210. struct is_buffer_sequence<mutable_registered_buffer, const_buffer>
  211. : true_type
  212. {
  213. };
  214. template <>
  215. struct is_buffer_sequence<const_registered_buffer, const_buffer>
  216. : true_type
  217. {
  218. };
  219. template <>
  220. struct is_buffer_sequence<const_registered_buffer, mutable_buffer>
  221. : false_type
  222. {
  223. };
  224. template <typename T>
  225. struct is_dynamic_buffer_class_v1
  226. : integral_constant<bool,
  227. sizeof(size_memfn_helper<T>(0)) != 1 &&
  228. sizeof(max_size_memfn_helper<T>(0)) != 1 &&
  229. sizeof(capacity_memfn_helper<T>(0)) != 1 &&
  230. sizeof(data_memfn_helper<T>(0)) != 1 &&
  231. sizeof(consume_memfn_helper<T>(0)) != 1 &&
  232. sizeof(prepare_memfn_helper<T>(0)) != 1 &&
  233. sizeof(commit_memfn_helper<T>(0)) != 1 &&
  234. sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
  235. sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
  236. {
  237. };
  238. template <typename T>
  239. struct is_dynamic_buffer_v1
  240. : conditional<is_class<T>::value,
  241. is_dynamic_buffer_class_v1<T>,
  242. false_type>::type
  243. {
  244. };
  245. template <typename T>
  246. struct is_dynamic_buffer_class_v2
  247. : integral_constant<bool,
  248. sizeof(size_memfn_helper<T>(0)) != 1 &&
  249. sizeof(max_size_memfn_helper<T>(0)) != 1 &&
  250. sizeof(capacity_memfn_helper<T>(0)) != 1 &&
  251. sizeof(data_memfn_helper<T>(0)) != 1 &&
  252. sizeof(consume_memfn_helper<T>(0)) != 1 &&
  253. sizeof(grow_memfn_helper<T>(0)) != 1 &&
  254. sizeof(shrink_memfn_helper<T>(0)) != 1 &&
  255. sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
  256. sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
  257. {
  258. };
  259. template <typename T>
  260. struct is_dynamic_buffer_v2
  261. : conditional<is_class<T>::value,
  262. is_dynamic_buffer_class_v2<T>,
  263. false_type>::type
  264. {
  265. };
  266. } // namespace detail
  267. } // namespace asio
  268. #include "asio/detail/pop_options.hpp"
  269. #endif // ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP