11 #ifndef ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP 12 #define ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 18 #include "asio/detail/config.hpp" 19 #include "asio/buffer.hpp" 20 #include "asio/detail/array_fwd.hpp" 21 #include "asio/detail/socket_types.hpp" 23 #include "asio/detail/push_options.hpp" 30 #if defined(ASIO_WINDOWS_RUNTIME) 33 enum { max_buffers = 1 };
36 typedef Windows::Storage::Streams::IBuffer^ native_buffer_type;
38 ASIO_DECL
static void init_native_buffer(
39 native_buffer_type& buf,
42 ASIO_DECL
static void init_native_buffer(
43 native_buffer_type& buf,
45 #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) 48 enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len };
51 typedef WSABUF native_buffer_type;
53 static void init_native_buffer(WSABUF& buf,
56 buf.buf =
static_cast<char*
>(buffer.
data());
57 buf.len =
static_cast<ULONG
>(buffer.
size());
60 static void init_native_buffer(WSABUF& buf,
63 buf.buf =
const_cast<char*
>(
static_cast<const char*
>(buffer.
data()));
64 buf.len =
static_cast<ULONG
>(buffer.
size());
66 #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) 69 enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len };
72 typedef iovec native_buffer_type;
74 static void init_iov_base(
void*& base,
void* addr)
80 static void init_iov_base(T& base,
void* addr)
82 base =
static_cast<T
>(addr);
85 static void init_native_buffer(iovec& iov,
88 init_iov_base(iov.iov_base, buffer.
data());
89 iov.iov_len = buffer.
size();
92 static void init_native_buffer(iovec& iov,
95 init_iov_base(iov.iov_base, const_cast<void*>(buffer.
data()));
96 iov.iov_len = buffer.
size();
98 #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) 102 template <
typename Buffer,
typename Buffers>
107 enum { is_single_buffer =
false };
110 : count_(0), total_buffer_size_(0)
112 buffer_sequence_adapter::init(
117 native_buffer_type* buffers()
122 std::size_t count()
const 127 std::size_t total_size()
const 129 return total_buffer_size_;
132 bool all_empty()
const 134 return total_buffer_size_ == 0;
137 static bool all_empty(
const Buffers& buffer_sequence)
139 return buffer_sequence_adapter::all_empty(
144 static void validate(
const Buffers& buffer_sequence)
146 buffer_sequence_adapter::validate(
151 static Buffer first(
const Buffers& buffer_sequence)
153 return buffer_sequence_adapter::first(
158 enum { linearisation_storage_size = 8192 };
160 static Buffer linearise(
const Buffers& buffer_sequence,
163 return buffer_sequence_adapter::linearise(
169 template <
typename Iterator>
170 void init(Iterator begin, Iterator end)
172 Iterator iter = begin;
173 for (; iter != end && count_ < max_buffers; ++iter, ++count_)
176 init_native_buffer(buffers_[count_], buffer);
177 total_buffer_size_ += buffer.size();
181 template <
typename Iterator>
182 static bool all_empty(Iterator begin, Iterator end)
184 Iterator iter = begin;
186 for (; iter != end && i < max_buffers; ++iter, ++i)
187 if (Buffer(*iter).size() > 0)
192 template <
typename Iterator>
193 static void validate(Iterator begin, Iterator end)
195 Iterator iter = begin;
196 for (; iter != end; ++iter)
203 template <
typename Iterator>
204 static Buffer first(Iterator begin, Iterator end)
206 Iterator iter = begin;
207 for (; iter != end; ++iter)
210 if (buffer.size() != 0)
216 template <
typename Iterator>
217 static Buffer linearise(Iterator begin, Iterator end,
221 Iterator iter = begin;
222 while (iter != end && unused_storage.
size() != 0)
226 if (buffer.size() == 0)
228 if (unused_storage.
size() == storage.
size())
232 if (buffer.size() >= unused_storage.
size())
237 return Buffer(storage.
data(), storage.
size() - unused_storage.
size());
240 native_buffer_type buffers_[max_buffers];
242 std::size_t total_buffer_size_;
245 template <
typename Buffer>
250 enum { is_single_buffer =
true };
255 init_native_buffer(buffer_, Buffer(buffer_sequence));
256 total_buffer_size_ = buffer_sequence.
size();
259 native_buffer_type* buffers()
264 std::size_t count()
const 269 std::size_t total_size()
const 271 return total_buffer_size_;
274 bool all_empty()
const 276 return total_buffer_size_ == 0;
281 return buffer_sequence.
size() == 0;
286 buffer_sequence.
data();
291 return Buffer(buffer_sequence);
294 enum { linearisation_storage_size = 1 };
299 return Buffer(buffer_sequence);
303 native_buffer_type buffer_;
304 std::size_t total_buffer_size_;
307 template <
typename Buffer>
312 enum { is_single_buffer =
true };
317 init_native_buffer(buffer_, Buffer(buffer_sequence));
318 total_buffer_size_ = buffer_sequence.
size();
321 native_buffer_type* buffers()
326 std::size_t count()
const 331 std::size_t total_size()
const 333 return total_buffer_size_;
336 bool all_empty()
const 338 return total_buffer_size_ == 0;
343 return buffer_sequence.
size() == 0;
348 buffer_sequence.
data();
353 return Buffer(buffer_sequence);
356 enum { linearisation_storage_size = 1 };
361 return Buffer(buffer_sequence);
365 native_buffer_type buffer_;
366 std::size_t total_buffer_size_;
369 #if !defined(ASIO_NO_DEPRECATED) 371 template <
typename Buffer>
376 enum { is_single_buffer =
true };
381 init_native_buffer(buffer_, Buffer(buffer_sequence));
382 total_buffer_size_ = buffer_sequence.
size();
385 native_buffer_type* buffers()
390 std::size_t count()
const 395 std::size_t total_size()
const 397 return total_buffer_size_;
400 bool all_empty()
const 402 return total_buffer_size_ == 0;
407 return buffer_sequence.
size() == 0;
412 buffer_sequence.
data();
417 return Buffer(buffer_sequence);
420 enum { linearisation_storage_size = 1 };
425 return Buffer(buffer_sequence);
429 native_buffer_type buffer_;
430 std::size_t total_buffer_size_;
433 template <
typename Buffer>
438 enum { is_single_buffer =
true };
443 init_native_buffer(buffer_, Buffer(buffer_sequence));
444 total_buffer_size_ = buffer_sequence.
size();
447 native_buffer_type* buffers()
452 std::size_t count()
const 457 std::size_t total_size()
const 459 return total_buffer_size_;
462 bool all_empty()
const 464 return total_buffer_size_ == 0;
469 return buffer_sequence.
size() == 0;
474 buffer_sequence.
data();
479 return Buffer(buffer_sequence);
482 enum { linearisation_storage_size = 1 };
487 return Buffer(buffer_sequence);
491 native_buffer_type buffer_;
492 std::size_t total_buffer_size_;
495 #endif // !defined(ASIO_NO_DEPRECATED) 497 template <
typename Buffer,
typename Elem>
502 enum { is_single_buffer =
false };
507 init_native_buffer(buffers_[0], Buffer(buffer_sequence[0]));
508 init_native_buffer(buffers_[1], Buffer(buffer_sequence[1]));
509 total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size();
512 native_buffer_type* buffers()
517 std::size_t count()
const 522 std::size_t total_size()
const 524 return total_buffer_size_;
527 bool all_empty()
const 529 return total_buffer_size_ == 0;
534 return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0;
539 buffer_sequence[0].data();
540 buffer_sequence[1].data();
545 return Buffer(buffer_sequence[0].size() != 0
546 ? buffer_sequence[0] : buffer_sequence[1]);
549 enum { linearisation_storage_size = 8192 };
554 if (buffer_sequence[0].size() == 0)
555 return Buffer(buffer_sequence[1]);
556 if (buffer_sequence[1].size() == 0)
557 return Buffer(buffer_sequence[0]);
558 return Buffer(storage.
data(),
563 native_buffer_type buffers_[2];
564 std::size_t total_buffer_size_;
567 #if defined(ASIO_HAS_STD_ARRAY) 569 template <
typename Buffer,
typename Elem>
574 enum { is_single_buffer =
false };
579 init_native_buffer(buffers_[0], Buffer(buffer_sequence[0]));
580 init_native_buffer(buffers_[1], Buffer(buffer_sequence[1]));
581 total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size();
584 native_buffer_type* buffers()
589 std::size_t count()
const 594 std::size_t total_size()
const 596 return total_buffer_size_;
599 bool all_empty()
const 601 return total_buffer_size_ == 0;
604 static bool all_empty(
const std::array<Elem, 2>& buffer_sequence)
606 return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0;
609 static void validate(
const std::array<Elem, 2>& buffer_sequence)
611 buffer_sequence[0].data();
612 buffer_sequence[1].data();
615 static Buffer first(
const std::array<Elem, 2>& buffer_sequence)
617 return Buffer(buffer_sequence[0].size() != 0
618 ? buffer_sequence[0] : buffer_sequence[1]);
621 enum { linearisation_storage_size = 8192 };
623 static Buffer linearise(
const std::array<Elem, 2>& buffer_sequence,
626 if (buffer_sequence[0].size() == 0)
627 return Buffer(buffer_sequence[1]);
628 if (buffer_sequence[1].size() == 0)
629 return Buffer(buffer_sequence[0]);
630 return Buffer(storage.
data(),
635 native_buffer_type buffers_[2];
636 std::size_t total_buffer_size_;
639 #endif // defined(ASIO_HAS_STD_ARRAY) 644 #include "asio/detail/pop_options.hpp" 646 #if defined(ASIO_HEADER_ONLY) 647 # include "asio/detail/impl/buffer_sequence_adapter.ipp" 648 #endif // defined(ASIO_HEADER_ONLY) 650 #endif // ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP const void * data() const ASIO_NOEXCEPT
Get a pointer to the beginning of the memory range.
Definition: buffer.hpp:269
Definition: array_fwd.hpp:20
Holds a buffer that cannot be modified.
Definition: buffer.hpp:226
Definition: buffer.cpp:590
(Deprecated: Use const_buffer.) Adapts a single non-modifiable buffer so that it meets the requiremen...
Definition: buffer.hpp:306
std::size_t size() const ASIO_NOEXCEPT
Get the size of the memory range.
Definition: buffer.hpp:279
ASIO_MUTABLE_BUFFER buffer(const mutable_buffer &b) ASIO_NOEXCEPT
Create a new modifiable buffer from an existing buffer.
Definition: buffer.hpp:909
Definition: buffer_sequence_adapter.hpp:103
Holds a buffer that can be modified.
Definition: buffer.hpp:92
std::size_t buffer_copy(const MutableBufferSequence &target, const ConstBufferSequence &source) ASIO_NOEXCEPT
Copies bytes from a source buffer sequence to a target buffer sequence.
Definition: buffer.hpp:2363
const mutable_buffer * buffer_sequence_begin(const MutableBuffer &b, typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer *>::value >::type *=0) ASIO_NOEXCEPT
Get an iterator to the first element in a buffer sequence.
Definition: buffer.hpp:388
void * data() const ASIO_NOEXCEPT
Get a pointer to the beginning of the memory range.
Definition: buffer.hpp:125
Definition: buffer_sequence_adapter.hpp:28
std::size_t size() const ASIO_NOEXCEPT
Get the size of the memory range.
Definition: buffer.hpp:135
const mutable_buffer * buffer_sequence_end(const MutableBuffer &b, typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer *>::value >::type *=0) ASIO_NOEXCEPT
Get an iterator to one past the end element in a buffer sequence.
Definition: buffer.hpp:465
Definition: any_io_executor.hpp:28
(Deprecated: Use mutable_buffer.) Adapts a single modifiable buffer so that it meets the requirements...
Definition: buffer.hpp:162
Definition: array_fwd.hpp:23