]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/detail/is_buffer_sequence.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / asio / detail / is_buffer_sequence.hpp
CommitLineData
b32b8144
FG
1//
2// detail/is_buffer_sequence.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4//
92f5a8d4 5// Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
b32b8144
FG
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
11#ifndef BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
12#define BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
13
14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
15# pragma once
16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18#include <boost/asio/detail/config.hpp>
19#include <boost/asio/detail/type_traits.hpp>
20
21#include <boost/asio/detail/push_options.hpp>
22
23namespace boost {
24namespace asio {
25
26class mutable_buffer;
27class const_buffer;
28
29namespace detail {
30
31struct buffer_sequence_memfns_base
32{
33 void begin();
34 void end();
35 void size();
36 void max_size();
37 void capacity();
38 void data();
39 void prepare();
40 void commit();
41 void consume();
92f5a8d4
TL
42 void grow();
43 void shrink();
b32b8144
FG
44};
45
46template <typename T>
47struct buffer_sequence_memfns_derived
48 : T, buffer_sequence_memfns_base
49{
50};
51
52template <typename T, T>
53struct buffer_sequence_memfns_check
54{
55};
56
92f5a8d4
TL
57#if defined(BOOST_ASIO_HAS_DECLTYPE)
58
59template <typename>
60char buffer_sequence_begin_helper(...);
61
62template <typename T>
63char (&buffer_sequence_begin_helper(T* t,
64 typename enable_if<!is_same<
65 decltype(boost::asio::buffer_sequence_begin(*t)),
66 void>::value>::type*))[2];
67
68#else // defined(BOOST_ASIO_HAS_DECLTYPE)
69
b32b8144 70template <typename>
92f5a8d4 71char (&buffer_sequence_begin_helper(...))[2];
b32b8144
FG
72
73template <typename T>
92f5a8d4 74char buffer_sequence_begin_helper(T* t,
b32b8144
FG
75 buffer_sequence_memfns_check<
76 void (buffer_sequence_memfns_base::*)(),
77 &buffer_sequence_memfns_derived<T>::begin>*);
78
92f5a8d4
TL
79#endif // defined(BOOST_ASIO_HAS_DECLTYPE)
80
81#if defined(BOOST_ASIO_HAS_DECLTYPE)
82
83template <typename>
84char buffer_sequence_end_helper(...);
85
86template <typename T>
87char (&buffer_sequence_end_helper(T* t,
88 typename enable_if<!is_same<
89 decltype(boost::asio::buffer_sequence_end(*t)),
90 void>::value>::type*))[2];
91
92#else // defined(BOOST_ASIO_HAS_DECLTYPE)
93
b32b8144 94template <typename>
92f5a8d4 95char (&buffer_sequence_end_helper(...))[2];
b32b8144
FG
96
97template <typename T>
92f5a8d4 98char buffer_sequence_end_helper(T* t,
b32b8144
FG
99 buffer_sequence_memfns_check<
100 void (buffer_sequence_memfns_base::*)(),
101 &buffer_sequence_memfns_derived<T>::end>*);
102
92f5a8d4
TL
103#endif // defined(BOOST_ASIO_HAS_DECLTYPE)
104
b32b8144
FG
105template <typename>
106char (&size_memfn_helper(...))[2];
107
108template <typename T>
109char size_memfn_helper(
110 buffer_sequence_memfns_check<
111 void (buffer_sequence_memfns_base::*)(),
112 &buffer_sequence_memfns_derived<T>::size>*);
113
114template <typename>
115char (&max_size_memfn_helper(...))[2];
116
117template <typename T>
118char max_size_memfn_helper(
119 buffer_sequence_memfns_check<
120 void (buffer_sequence_memfns_base::*)(),
121 &buffer_sequence_memfns_derived<T>::max_size>*);
122
123template <typename>
124char (&capacity_memfn_helper(...))[2];
125
126template <typename T>
127char capacity_memfn_helper(
128 buffer_sequence_memfns_check<
129 void (buffer_sequence_memfns_base::*)(),
130 &buffer_sequence_memfns_derived<T>::capacity>*);
131
132template <typename>
133char (&data_memfn_helper(...))[2];
134
135template <typename T>
136char data_memfn_helper(
137 buffer_sequence_memfns_check<
138 void (buffer_sequence_memfns_base::*)(),
139 &buffer_sequence_memfns_derived<T>::data>*);
140
141template <typename>
142char (&prepare_memfn_helper(...))[2];
143
144template <typename T>
145char prepare_memfn_helper(
146 buffer_sequence_memfns_check<
147 void (buffer_sequence_memfns_base::*)(),
11fdf7f2 148 &buffer_sequence_memfns_derived<T>::prepare>*);
b32b8144
FG
149
150template <typename>
151char (&commit_memfn_helper(...))[2];
152
153template <typename T>
154char commit_memfn_helper(
155 buffer_sequence_memfns_check<
156 void (buffer_sequence_memfns_base::*)(),
157 &buffer_sequence_memfns_derived<T>::commit>*);
158
159template <typename>
160char (&consume_memfn_helper(...))[2];
161
162template <typename T>
163char consume_memfn_helper(
164 buffer_sequence_memfns_check<
165 void (buffer_sequence_memfns_base::*)(),
166 &buffer_sequence_memfns_derived<T>::consume>*);
167
92f5a8d4
TL
168template <typename>
169char (&grow_memfn_helper(...))[2];
170
171template <typename T>
172char grow_memfn_helper(
173 buffer_sequence_memfns_check<
174 void (buffer_sequence_memfns_base::*)(),
175 &buffer_sequence_memfns_derived<T>::grow>*);
176
177template <typename>
178char (&shrink_memfn_helper(...))[2];
179
180template <typename T>
181char shrink_memfn_helper(
182 buffer_sequence_memfns_check<
183 void (buffer_sequence_memfns_base::*)(),
184 &buffer_sequence_memfns_derived<T>::shrink>*);
185
b32b8144 186template <typename, typename>
92f5a8d4 187char (&buffer_sequence_element_type_helper(...))[2];
b32b8144 188
92f5a8d4 189#if defined(BOOST_ASIO_HAS_DECLTYPE)
b32b8144
FG
190
191template <typename T, typename Buffer>
92f5a8d4 192char buffer_sequence_element_type_helper(T* t,
b32b8144 193 typename enable_if<is_convertible<
92f5a8d4 194 decltype(*boost::asio::buffer_sequence_begin(*t)),
b32b8144
FG
195 Buffer>::value>::type*);
196
92f5a8d4 197#else // defined(BOOST_ASIO_HAS_DECLTYPE)
b32b8144
FG
198
199template <typename T, typename Buffer>
92f5a8d4 200char buffer_sequence_element_type_helper(
b32b8144
FG
201 typename T::const_iterator*,
202 typename enable_if<is_convertible<
203 typename T::value_type, Buffer>::value>::type*);
204
92f5a8d4 205#endif // defined(BOOST_ASIO_HAS_DECLTYPE)
b32b8144
FG
206
207template <typename>
208char (&const_buffers_type_typedef_helper(...))[2];
209
210template <typename T>
211char const_buffers_type_typedef_helper(
212 typename T::const_buffers_type*);
213
214template <typename>
215char (&mutable_buffers_type_typedef_helper(...))[2];
216
217template <typename T>
218char mutable_buffers_type_typedef_helper(
219 typename T::mutable_buffers_type*);
220
221template <typename T, typename Buffer>
222struct is_buffer_sequence_class
223 : integral_constant<bool,
92f5a8d4
TL
224 sizeof(buffer_sequence_begin_helper<T>(0, 0)) != 1 &&
225 sizeof(buffer_sequence_end_helper<T>(0, 0)) != 1 &&
226 sizeof(buffer_sequence_element_type_helper<T, Buffer>(0, 0)) == 1>
b32b8144
FG
227{
228};
229
230template <typename T, typename Buffer>
231struct is_buffer_sequence
232 : conditional<is_class<T>::value,
233 is_buffer_sequence_class<T, Buffer>,
234 false_type>::type
235{
236};
237
238template <>
239struct is_buffer_sequence<mutable_buffer, mutable_buffer>
240 : true_type
241{
242};
243
244template <>
245struct is_buffer_sequence<mutable_buffer, const_buffer>
246 : true_type
247{
248};
249
250template <>
251struct is_buffer_sequence<const_buffer, const_buffer>
252 : true_type
253{
254};
255
256template <>
257struct is_buffer_sequence<const_buffer, mutable_buffer>
258 : false_type
259{
260};
261
262template <typename T>
92f5a8d4 263struct is_dynamic_buffer_class_v1
b32b8144
FG
264 : integral_constant<bool,
265 sizeof(size_memfn_helper<T>(0)) != 1 &&
266 sizeof(max_size_memfn_helper<T>(0)) != 1 &&
267 sizeof(capacity_memfn_helper<T>(0)) != 1 &&
268 sizeof(data_memfn_helper<T>(0)) != 1 &&
269 sizeof(consume_memfn_helper<T>(0)) != 1 &&
270 sizeof(prepare_memfn_helper<T>(0)) != 1 &&
271 sizeof(commit_memfn_helper<T>(0)) != 1 &&
272 sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
273 sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
274{
275};
276
277template <typename T>
92f5a8d4
TL
278struct is_dynamic_buffer_v1
279 : conditional<is_class<T>::value,
280 is_dynamic_buffer_class_v1<T>,
281 false_type>::type
282{
283};
284
285template <typename T>
286struct is_dynamic_buffer_class_v2
287 : integral_constant<bool,
288 sizeof(size_memfn_helper<T>(0)) != 1 &&
289 sizeof(max_size_memfn_helper<T>(0)) != 1 &&
290 sizeof(capacity_memfn_helper<T>(0)) != 1 &&
291 sizeof(data_memfn_helper<T>(0)) != 1 &&
292 sizeof(consume_memfn_helper<T>(0)) != 1 &&
293 sizeof(grow_memfn_helper<T>(0)) != 1 &&
294 sizeof(shrink_memfn_helper<T>(0)) != 1 &&
295 sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
296 sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
297{
298};
299
300template <typename T>
301struct is_dynamic_buffer_v2
b32b8144 302 : conditional<is_class<T>::value,
92f5a8d4 303 is_dynamic_buffer_class_v2<T>,
b32b8144
FG
304 false_type>::type
305{
306};
307
308} // namespace detail
309} // namespace asio
310} // namespace boost
311
312#include <boost/asio/detail/pop_options.hpp>
313
314#endif // BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP