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