2 // detail/is_buffer_sequence.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
11 #ifndef BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
12 #define BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/type_traits.hpp>
21 #include <boost/asio/detail/push_options.hpp>
31 struct buffer_sequence_memfns_base
45 struct buffer_sequence_memfns_derived
46 : T, buffer_sequence_memfns_base
50 template <typename T, T>
51 struct buffer_sequence_memfns_check
56 char (&begin_memfn_helper(...))[2];
59 char begin_memfn_helper(
60 buffer_sequence_memfns_check<
61 void (buffer_sequence_memfns_base::*)(),
62 &buffer_sequence_memfns_derived<T>::begin>*);
65 char (&end_memfn_helper(...))[2];
68 char end_memfn_helper(
69 buffer_sequence_memfns_check<
70 void (buffer_sequence_memfns_base::*)(),
71 &buffer_sequence_memfns_derived<T>::end>*);
74 char (&size_memfn_helper(...))[2];
77 char size_memfn_helper(
78 buffer_sequence_memfns_check<
79 void (buffer_sequence_memfns_base::*)(),
80 &buffer_sequence_memfns_derived<T>::size>*);
83 char (&max_size_memfn_helper(...))[2];
86 char max_size_memfn_helper(
87 buffer_sequence_memfns_check<
88 void (buffer_sequence_memfns_base::*)(),
89 &buffer_sequence_memfns_derived<T>::max_size>*);
92 char (&capacity_memfn_helper(...))[2];
95 char capacity_memfn_helper(
96 buffer_sequence_memfns_check<
97 void (buffer_sequence_memfns_base::*)(),
98 &buffer_sequence_memfns_derived<T>::capacity>*);
101 char (&data_memfn_helper(...))[2];
103 template <typename T>
104 char data_memfn_helper(
105 buffer_sequence_memfns_check<
106 void (buffer_sequence_memfns_base::*)(),
107 &buffer_sequence_memfns_derived<T>::data>*);
110 char (&prepare_memfn_helper(...))[2];
112 template <typename T>
113 char prepare_memfn_helper(
114 buffer_sequence_memfns_check<
115 void (buffer_sequence_memfns_base::*)(),
116 &buffer_sequence_memfns_derived<T>::data>*);
119 char (&commit_memfn_helper(...))[2];
121 template <typename T>
122 char commit_memfn_helper(
123 buffer_sequence_memfns_check<
124 void (buffer_sequence_memfns_base::*)(),
125 &buffer_sequence_memfns_derived<T>::commit>*);
128 char (&consume_memfn_helper(...))[2];
130 template <typename T>
131 char consume_memfn_helper(
132 buffer_sequence_memfns_check<
133 void (buffer_sequence_memfns_base::*)(),
134 &buffer_sequence_memfns_derived<T>::consume>*);
136 template <typename, typename>
137 char (&buffer_element_type_helper(...))[2];
139 #if defined(BOOST_ASIO_HAS_DECL_TYPE)
141 template <typename T, typename Buffer>
142 char buffer_element_type_helper(T* t,
143 typename enable_if<is_convertible<
144 decltype(*buffer_sequence_begin(*t)),
145 Buffer>::value>::type*);
147 #else // defined(BOOST_ASIO_HAS_DECL_TYPE)
149 template <typename T, typename Buffer>
150 char buffer_element_type_helper(
151 typename T::const_iterator*,
152 typename enable_if<is_convertible<
153 typename T::value_type, Buffer>::value>::type*);
155 #endif // defined(BOOST_ASIO_HAS_DECL_TYPE)
158 char (&const_buffers_type_typedef_helper(...))[2];
160 template <typename T>
161 char const_buffers_type_typedef_helper(
162 typename T::const_buffers_type*);
165 char (&mutable_buffers_type_typedef_helper(...))[2];
167 template <typename T>
168 char mutable_buffers_type_typedef_helper(
169 typename T::mutable_buffers_type*);
171 template <typename T, typename Buffer>
172 struct 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>
180 template <typename T, typename Buffer>
181 struct is_buffer_sequence
182 : conditional<is_class<T>::value,
183 is_buffer_sequence_class<T, Buffer>,
189 struct is_buffer_sequence<mutable_buffer, mutable_buffer>
195 struct is_buffer_sequence<mutable_buffer, const_buffer>
201 struct is_buffer_sequence<const_buffer, const_buffer>
207 struct is_buffer_sequence<const_buffer, mutable_buffer>
212 template <typename T>
213 struct 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>
227 template <typename T>
228 struct is_dynamic_buffer
229 : conditional<is_class<T>::value,
230 is_dynamic_buffer_class<T>,
235 } // namespace detail
239 #include <boost/asio/detail/pop_options.hpp>
241 #endif // BOOST_ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP