]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/detail/is_buffer_sequence.hpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / boost / asio / detail / is_buffer_sequence.hpp
CommitLineData
b32b8144
FG
1//
2// detail/is_buffer_sequence.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4//
11fdf7f2 5// Copyright (c) 2003-2018 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();
42};
43
44template <typename T>
45struct buffer_sequence_memfns_derived
46 : T, buffer_sequence_memfns_base
47{
48};
49
50template <typename T, T>
51struct buffer_sequence_memfns_check
52{
53};
54
55template <typename>
56char (&begin_memfn_helper(...))[2];
57
58template <typename T>
59char begin_memfn_helper(
60 buffer_sequence_memfns_check<
61 void (buffer_sequence_memfns_base::*)(),
62 &buffer_sequence_memfns_derived<T>::begin>*);
63
64template <typename>
65char (&end_memfn_helper(...))[2];
66
67template <typename T>
68char end_memfn_helper(
69 buffer_sequence_memfns_check<
70 void (buffer_sequence_memfns_base::*)(),
71 &buffer_sequence_memfns_derived<T>::end>*);
72
73template <typename>
74char (&size_memfn_helper(...))[2];
75
76template <typename T>
77char size_memfn_helper(
78 buffer_sequence_memfns_check<
79 void (buffer_sequence_memfns_base::*)(),
80 &buffer_sequence_memfns_derived<T>::size>*);
81
82template <typename>
83char (&max_size_memfn_helper(...))[2];
84
85template <typename T>
86char max_size_memfn_helper(
87 buffer_sequence_memfns_check<
88 void (buffer_sequence_memfns_base::*)(),
89 &buffer_sequence_memfns_derived<T>::max_size>*);
90
91template <typename>
92char (&capacity_memfn_helper(...))[2];
93
94template <typename T>
95char capacity_memfn_helper(
96 buffer_sequence_memfns_check<
97 void (buffer_sequence_memfns_base::*)(),
98 &buffer_sequence_memfns_derived<T>::capacity>*);
99
100template <typename>
101char (&data_memfn_helper(...))[2];
102
103template <typename T>
104char data_memfn_helper(
105 buffer_sequence_memfns_check<
106 void (buffer_sequence_memfns_base::*)(),
107 &buffer_sequence_memfns_derived<T>::data>*);
108
109template <typename>
110char (&prepare_memfn_helper(...))[2];
111
112template <typename T>
113char prepare_memfn_helper(
114 buffer_sequence_memfns_check<
115 void (buffer_sequence_memfns_base::*)(),
11fdf7f2 116 &buffer_sequence_memfns_derived<T>::prepare>*);
b32b8144
FG
117
118template <typename>
119char (&commit_memfn_helper(...))[2];
120
121template <typename T>
122char commit_memfn_helper(
123 buffer_sequence_memfns_check<
124 void (buffer_sequence_memfns_base::*)(),
125 &buffer_sequence_memfns_derived<T>::commit>*);
126
127template <typename>
128char (&consume_memfn_helper(...))[2];
129
130template <typename T>
131char consume_memfn_helper(
132 buffer_sequence_memfns_check<
133 void (buffer_sequence_memfns_base::*)(),
134 &buffer_sequence_memfns_derived<T>::consume>*);
135
136template <typename, typename>
137char (&buffer_element_type_helper(...))[2];
138
139#if defined(BOOST_ASIO_HAS_DECL_TYPE)
140
141template <typename T, typename Buffer>
142char buffer_element_type_helper(T* t,
143 typename enable_if<is_convertible<
144 decltype(*buffer_sequence_begin(*t)),
145 Buffer>::value>::type*);
146
147#else // defined(BOOST_ASIO_HAS_DECL_TYPE)
148
149template <typename T, typename Buffer>
150char buffer_element_type_helper(
151 typename T::const_iterator*,
152 typename enable_if<is_convertible<
153 typename T::value_type, Buffer>::value>::type*);
154
155#endif // defined(BOOST_ASIO_HAS_DECL_TYPE)
156
157template <typename>
158char (&const_buffers_type_typedef_helper(...))[2];
159
160template <typename T>
161char const_buffers_type_typedef_helper(
162 typename T::const_buffers_type*);
163
164template <typename>
165char (&mutable_buffers_type_typedef_helper(...))[2];
166
167template <typename T>
168char mutable_buffers_type_typedef_helper(
169 typename T::mutable_buffers_type*);
170
171template <typename T, typename Buffer>
172struct is_buffer_sequence_class
173 : integral_constant<bool,
174 sizeof(begin_memfn_helper<T>(0)) != 1 &&
175 sizeof(end_memfn_helper<T>(0)) != 1 &&
176 sizeof(buffer_element_type_helper<T, Buffer>(0, 0)) == 1>
177{
178};
179
180template <typename T, typename Buffer>
181struct is_buffer_sequence
182 : conditional<is_class<T>::value,
183 is_buffer_sequence_class<T, Buffer>,
184 false_type>::type
185{
186};
187
188template <>
189struct is_buffer_sequence<mutable_buffer, mutable_buffer>
190 : true_type
191{
192};
193
194template <>
195struct is_buffer_sequence<mutable_buffer, const_buffer>
196 : true_type
197{
198};
199
200template <>
201struct is_buffer_sequence<const_buffer, const_buffer>
202 : true_type
203{
204};
205
206template <>
207struct is_buffer_sequence<const_buffer, mutable_buffer>
208 : false_type
209{
210};
211
212template <typename T>
213struct is_dynamic_buffer_class
214 : integral_constant<bool,
215 sizeof(size_memfn_helper<T>(0)) != 1 &&
216 sizeof(max_size_memfn_helper<T>(0)) != 1 &&
217 sizeof(capacity_memfn_helper<T>(0)) != 1 &&
218 sizeof(data_memfn_helper<T>(0)) != 1 &&
219 sizeof(consume_memfn_helper<T>(0)) != 1 &&
220 sizeof(prepare_memfn_helper<T>(0)) != 1 &&
221 sizeof(commit_memfn_helper<T>(0)) != 1 &&
222 sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
223 sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
224{
225};
226
227template <typename T>
228struct is_dynamic_buffer
229 : conditional<is_class<T>::value,
230 is_dynamic_buffer_class<T>,
231 false_type>::type
232{
233};
234
235} // namespace detail
236} // namespace asio
237} // namespace boost
238
239#include <boost/asio/detail/pop_options.hpp>
240
241#endif // BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP