summaryrefslogtreecommitdiffstats
path: root/lib/asio/impl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/asio/impl')
-rw-r--r--lib/asio/impl/buffered_read_stream.hpp429
-rw-r--r--lib/asio/impl/buffered_write_stream.hpp411
-rw-r--r--lib/asio/impl/connect.hpp860
-rw-r--r--lib/asio/impl/defer.hpp77
-rw-r--r--lib/asio/impl/dispatch.hpp78
-rw-r--r--lib/asio/impl/error.ipp128
-rw-r--r--lib/asio/impl/error_code.ipp206
-rw-r--r--lib/asio/impl/execution_context.hpp107
-rw-r--r--lib/asio/impl/execution_context.ipp82
-rw-r--r--lib/asio/impl/executor.hpp386
-rw-r--r--lib/asio/impl/executor.ipp38
-rw-r--r--lib/asio/impl/handler_alloc_hook.ipp52
-rw-r--r--lib/asio/impl/io_context.hpp343
-rw-r--r--lib/asio/impl/io_context.ipp174
-rw-r--r--lib/asio/impl/post.hpp77
-rw-r--r--lib/asio/impl/read.hpp715
-rw-r--r--lib/asio/impl/read_at.hpp640
-rw-r--r--lib/asio/impl/read_until.hpp1500
-rw-r--r--lib/asio/impl/serial_port_base.hpp59
-rw-r--r--lib/asio/impl/serial_port_base.ipp557
-rw-r--r--lib/asio/impl/spawn.hpp535
-rw-r--r--lib/asio/impl/src.cpp25
-rw-r--r--lib/asio/impl/src.hpp82
-rw-r--r--lib/asio/impl/system_context.hpp34
-rw-r--r--lib/asio/impl/system_context.ipp73
-rw-r--r--lib/asio/impl/system_executor.hpp85
-rw-r--r--lib/asio/impl/thread_pool.hpp127
-rw-r--r--lib/asio/impl/thread_pool.ipp76
-rw-r--r--lib/asio/impl/use_future.hpp938
-rw-r--r--lib/asio/impl/write.hpp674
-rw-r--r--lib/asio/impl/write_at.hpp572
31 files changed, 0 insertions, 10140 deletions
diff --git a/lib/asio/impl/buffered_read_stream.hpp b/lib/asio/impl/buffered_read_stream.hpp
deleted file mode 100644
index e0ed20e..0000000
--- a/lib/asio/impl/buffered_read_stream.hpp
+++ /dev/null
@@ -1,429 +0,0 @@
-//
-// impl/buffered_read_stream.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_BUFFERED_READ_STREAM_HPP
-#define ASIO_IMPL_BUFFERED_READ_STREAM_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename Stream>
-std::size_t buffered_read_stream<Stream>::fill()
-{
- detail::buffer_resize_guard<detail::buffered_stream_storage>
- resize_guard(storage_);
- std::size_t previous_size = storage_.size();
- storage_.resize(storage_.capacity());
- storage_.resize(previous_size + next_layer_.read_some(buffer(
- storage_.data() + previous_size,
- storage_.size() - previous_size)));
- resize_guard.commit();
- return storage_.size() - previous_size;
-}
-
-template <typename Stream>
-std::size_t buffered_read_stream<Stream>::fill(asio::error_code& ec)
-{
- detail::buffer_resize_guard<detail::buffered_stream_storage>
- resize_guard(storage_);
- std::size_t previous_size = storage_.size();
- storage_.resize(storage_.capacity());
- storage_.resize(previous_size + next_layer_.read_some(buffer(
- storage_.data() + previous_size,
- storage_.size() - previous_size),
- ec));
- resize_guard.commit();
- return storage_.size() - previous_size;
-}
-
-namespace detail
-{
- template <typename ReadHandler>
- class buffered_fill_handler
- {
- public:
- buffered_fill_handler(detail::buffered_stream_storage& storage,
- std::size_t previous_size, ReadHandler& handler)
- : storage_(storage),
- previous_size_(previous_size),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- buffered_fill_handler(const buffered_fill_handler& other)
- : storage_(other.storage_),
- previous_size_(other.previous_size_),
- handler_(other.handler_)
- {
- }
-
- buffered_fill_handler(buffered_fill_handler&& other)
- : storage_(other.storage_),
- previous_size_(other.previous_size_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- const std::size_t bytes_transferred)
- {
- storage_.resize(previous_size_ + bytes_transferred);
- handler_(ec, bytes_transferred);
- }
-
- //private:
- detail::buffered_stream_storage& storage_;
- std::size_t previous_size_;
- ReadHandler handler_;
- };
-
- template <typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- buffered_fill_handler<ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- buffered_fill_handler<ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename ReadHandler>
- inline bool asio_handler_is_continuation(
- buffered_fill_handler<ReadHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- buffered_fill_handler<ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- buffered_fill_handler<ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::buffered_fill_handler<ReadHandler>, Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(const detail::buffered_fill_handler<ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::buffered_fill_handler<ReadHandler>, Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(const detail::buffered_fill_handler<ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Stream>
-template <typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-buffered_read_stream<Stream>::async_fill(
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- std::size_t previous_size = storage_.size();
- storage_.resize(storage_.capacity());
- next_layer_.async_read_some(
- buffer(
- storage_.data() + previous_size,
- storage_.size() - previous_size),
- detail::buffered_fill_handler<ASIO_HANDLER_TYPE(
- ReadHandler, void (asio::error_code, std::size_t))>(
- storage_, previous_size, init.completion_handler));
-
- return init.result.get();
-}
-
-template <typename Stream>
-template <typename MutableBufferSequence>
-std::size_t buffered_read_stream<Stream>::read_some(
- const MutableBufferSequence& buffers)
-{
- using asio::buffer_size;
- if (buffer_size(buffers) == 0)
- return 0;
-
- if (storage_.empty())
- this->fill();
-
- return this->copy(buffers);
-}
-
-template <typename Stream>
-template <typename MutableBufferSequence>
-std::size_t buffered_read_stream<Stream>::read_some(
- const MutableBufferSequence& buffers, asio::error_code& ec)
-{
- ec = asio::error_code();
-
- using asio::buffer_size;
- if (buffer_size(buffers) == 0)
- return 0;
-
- if (storage_.empty() && !this->fill(ec))
- return 0;
-
- return this->copy(buffers);
-}
-
-namespace detail
-{
- template <typename MutableBufferSequence, typename ReadHandler>
- class buffered_read_some_handler
- {
- public:
- buffered_read_some_handler(detail::buffered_stream_storage& storage,
- const MutableBufferSequence& buffers, ReadHandler& handler)
- : storage_(storage),
- buffers_(buffers),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- buffered_read_some_handler(const buffered_read_some_handler& other)
- : storage_(other.storage_),
- buffers_(other.buffers_),
- handler_(other.handler_)
- {
- }
-
- buffered_read_some_handler(buffered_read_some_handler&& other)
- : storage_(other.storage_),
- buffers_(other.buffers_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec, std::size_t)
- {
- if (ec || storage_.empty())
- {
- const std::size_t length = 0;
- handler_(ec, length);
- }
- else
- {
- const std::size_t bytes_copied = asio::buffer_copy(
- buffers_, storage_.data(), storage_.size());
- storage_.consume(bytes_copied);
- handler_(ec, bytes_copied);
- }
- }
-
- //private:
- detail::buffered_stream_storage& storage_;
- MutableBufferSequence buffers_;
- ReadHandler handler_;
- };
-
- template <typename MutableBufferSequence, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename MutableBufferSequence, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename MutableBufferSequence, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename MutableBufferSequence,
- typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename MutableBufferSequence,
- typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename MutableBufferSequence,
- typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::buffered_read_some_handler<MutableBufferSequence, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename MutableBufferSequence,
- typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::buffered_read_some_handler<MutableBufferSequence, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::buffered_read_some_handler<
- MutableBufferSequence, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Stream>
-template <typename MutableBufferSequence, typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-buffered_read_stream<Stream>::async_read_some(
- const MutableBufferSequence& buffers,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- using asio::buffer_size;
- if (buffer_size(buffers) == 0 || !storage_.empty())
- {
- next_layer_.async_read_some(ASIO_MUTABLE_BUFFER(0, 0),
- detail::buffered_read_some_handler<
- MutableBufferSequence, ASIO_HANDLER_TYPE(
- ReadHandler, void (asio::error_code, std::size_t))>(
- storage_, buffers, init.completion_handler));
- }
- else
- {
- this->async_fill(detail::buffered_read_some_handler<
- MutableBufferSequence, ASIO_HANDLER_TYPE(
- ReadHandler, void (asio::error_code, std::size_t))>(
- storage_, buffers, init.completion_handler));
- }
-
- return init.result.get();
-}
-
-template <typename Stream>
-template <typename MutableBufferSequence>
-std::size_t buffered_read_stream<Stream>::peek(
- const MutableBufferSequence& buffers)
-{
- if (storage_.empty())
- this->fill();
- return this->peek_copy(buffers);
-}
-
-template <typename Stream>
-template <typename MutableBufferSequence>
-std::size_t buffered_read_stream<Stream>::peek(
- const MutableBufferSequence& buffers, asio::error_code& ec)
-{
- ec = asio::error_code();
- if (storage_.empty() && !this->fill(ec))
- return 0;
- return this->peek_copy(buffers);
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_BUFFERED_READ_STREAM_HPP
diff --git a/lib/asio/impl/buffered_write_stream.hpp b/lib/asio/impl/buffered_write_stream.hpp
deleted file mode 100644
index bc2d823..0000000
--- a/lib/asio/impl/buffered_write_stream.hpp
+++ /dev/null
@@ -1,411 +0,0 @@
-//
-// impl/buffered_write_stream.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP
-#define ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename Stream>
-std::size_t buffered_write_stream<Stream>::flush()
-{
- std::size_t bytes_written = write(next_layer_,
- buffer(storage_.data(), storage_.size()));
- storage_.consume(bytes_written);
- return bytes_written;
-}
-
-template <typename Stream>
-std::size_t buffered_write_stream<Stream>::flush(asio::error_code& ec)
-{
- std::size_t bytes_written = write(next_layer_,
- buffer(storage_.data(), storage_.size()),
- transfer_all(), ec);
- storage_.consume(bytes_written);
- return bytes_written;
-}
-
-namespace detail
-{
- template <typename WriteHandler>
- class buffered_flush_handler
- {
- public:
- buffered_flush_handler(detail::buffered_stream_storage& storage,
- WriteHandler& handler)
- : storage_(storage),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- buffered_flush_handler(const buffered_flush_handler& other)
- : storage_(other.storage_),
- handler_(other.handler_)
- {
- }
-
- buffered_flush_handler(buffered_flush_handler&& other)
- : storage_(other.storage_),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- const std::size_t bytes_written)
- {
- storage_.consume(bytes_written);
- handler_(ec, bytes_written);
- }
-
- //private:
- detail::buffered_stream_storage& storage_;
- WriteHandler handler_;
- };
-
- template <typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- buffered_flush_handler<WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- buffered_flush_handler<WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename WriteHandler>
- inline bool asio_handler_is_continuation(
- buffered_flush_handler<WriteHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- buffered_flush_handler<WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- buffered_flush_handler<WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename WriteHandler, typename Allocator>
-struct associated_allocator<
- detail::buffered_flush_handler<WriteHandler>, Allocator>
-{
- typedef typename associated_allocator<WriteHandler, Allocator>::type type;
-
- static type get(const detail::buffered_flush_handler<WriteHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename WriteHandler, typename Executor>
-struct associated_executor<
- detail::buffered_flush_handler<WriteHandler>, Executor>
-{
- typedef typename associated_executor<WriteHandler, Executor>::type type;
-
- static type get(const detail::buffered_flush_handler<WriteHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Stream>
-template <typename WriteHandler>
-ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-buffered_write_stream<Stream>::async_flush(
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- async_write(next_layer_, buffer(storage_.data(), storage_.size()),
- detail::buffered_flush_handler<ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- storage_, init.completion_handler));
-
- return init.result.get();
-}
-
-template <typename Stream>
-template <typename ConstBufferSequence>
-std::size_t buffered_write_stream<Stream>::write_some(
- const ConstBufferSequence& buffers)
-{
- using asio::buffer_size;
- if (buffer_size(buffers) == 0)
- return 0;
-
- if (storage_.size() == storage_.capacity())
- this->flush();
-
- return this->copy(buffers);
-}
-
-template <typename Stream>
-template <typename ConstBufferSequence>
-std::size_t buffered_write_stream<Stream>::write_some(
- const ConstBufferSequence& buffers, asio::error_code& ec)
-{
- ec = asio::error_code();
-
- using asio::buffer_size;
- if (buffer_size(buffers) == 0)
- return 0;
-
- if (storage_.size() == storage_.capacity() && !flush(ec))
- return 0;
-
- return this->copy(buffers);
-}
-
-namespace detail
-{
- template <typename ConstBufferSequence, typename WriteHandler>
- class buffered_write_some_handler
- {
- public:
- buffered_write_some_handler(detail::buffered_stream_storage& storage,
- const ConstBufferSequence& buffers, WriteHandler& handler)
- : storage_(storage),
- buffers_(buffers),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- buffered_write_some_handler(const buffered_write_some_handler& other)
- : storage_(other.storage_),
- buffers_(other.buffers_),
- handler_(other.handler_)
- {
- }
-
- buffered_write_some_handler(buffered_write_some_handler&& other)
- : storage_(other.storage_),
- buffers_(other.buffers_),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec, std::size_t)
- {
- if (ec)
- {
- const std::size_t length = 0;
- handler_(ec, length);
- }
- else
- {
- using asio::buffer_size;
- std::size_t orig_size = storage_.size();
- std::size_t space_avail = storage_.capacity() - orig_size;
- std::size_t bytes_avail = buffer_size(buffers_);
- std::size_t length = bytes_avail < space_avail
- ? bytes_avail : space_avail;
- storage_.resize(orig_size + length);
- const std::size_t bytes_copied = asio::buffer_copy(
- storage_.data() + orig_size, buffers_, length);
- handler_(ec, bytes_copied);
- }
- }
-
- //private:
- detail::buffered_stream_storage& storage_;
- ConstBufferSequence buffers_;
- WriteHandler handler_;
- };
-
- template <typename ConstBufferSequence, typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename ConstBufferSequence, typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename ConstBufferSequence, typename WriteHandler>
- inline bool asio_handler_is_continuation(
- buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename ConstBufferSequence,
- typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename ConstBufferSequence,
- typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename ConstBufferSequence,
- typename WriteHandler, typename Allocator>
-struct associated_allocator<
- detail::buffered_write_some_handler<ConstBufferSequence, WriteHandler>,
- Allocator>
-{
- typedef typename associated_allocator<WriteHandler, Allocator>::type type;
-
- static type get(
- const detail::buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename ConstBufferSequence,
- typename WriteHandler, typename Executor>
-struct associated_executor<
- detail::buffered_write_some_handler<ConstBufferSequence, WriteHandler>,
- Executor>
-{
- typedef typename associated_executor<WriteHandler, Executor>::type type;
-
- static type get(
- const detail::buffered_write_some_handler<
- ConstBufferSequence, WriteHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Stream>
-template <typename ConstBufferSequence, typename WriteHandler>
-ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-buffered_write_stream<Stream>::async_write_some(
- const ConstBufferSequence& buffers,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- using asio::buffer_size;
- if (buffer_size(buffers) == 0
- || storage_.size() < storage_.capacity())
- {
- next_layer_.async_write_some(ASIO_CONST_BUFFER(0, 0),
- detail::buffered_write_some_handler<
- ConstBufferSequence, ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- storage_, buffers, init.completion_handler));
- }
- else
- {
- this->async_flush(detail::buffered_write_some_handler<
- ConstBufferSequence, ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- storage_, buffers, init.completion_handler));
- }
-
- return init.result.get();
-}
-
-template <typename Stream>
-template <typename ConstBufferSequence>
-std::size_t buffered_write_stream<Stream>::copy(
- const ConstBufferSequence& buffers)
-{
- using asio::buffer_size;
- std::size_t orig_size = storage_.size();
- std::size_t space_avail = storage_.capacity() - orig_size;
- std::size_t bytes_avail = buffer_size(buffers);
- std::size_t length = bytes_avail < space_avail ? bytes_avail : space_avail;
- storage_.resize(orig_size + length);
- return asio::buffer_copy(
- storage_.data() + orig_size, buffers, length);
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP
diff --git a/lib/asio/impl/connect.hpp b/lib/asio/impl/connect.hpp
deleted file mode 100644
index bff1913..0000000
--- a/lib/asio/impl/connect.hpp
+++ /dev/null
@@ -1,860 +0,0 @@
-//
-// impl/connect.hpp
-// ~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_CONNECT_HPP
-#define ASIO_IMPL_CONNECT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include <algorithm>
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/throw_error.hpp"
-#include "asio/error.hpp"
-#include "asio/post.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-namespace detail
-{
- struct default_connect_condition
- {
- template <typename Endpoint>
- bool operator()(const asio::error_code&, const Endpoint&)
- {
- return true;
- }
- };
-
- template <typename Protocol, typename Iterator>
- inline typename Protocol::endpoint deref_connect_result(
- Iterator iter, asio::error_code& ec)
- {
- return ec ? typename Protocol::endpoint() : *iter;
- }
-
- template <typename T, typename Iterator>
- struct legacy_connect_condition_helper : T
- {
- typedef char (*fallback_func_type)(...);
- operator fallback_func_type() const;
- };
-
- template <typename R, typename Arg1, typename Arg2, typename Iterator>
- struct legacy_connect_condition_helper<R (*)(Arg1, Arg2), Iterator>
- {
- R operator()(Arg1, Arg2) const;
- char operator()(...) const;
- };
-
- template <typename T, typename Iterator>
- struct is_legacy_connect_condition
- {
- static char asio_connect_condition_check(char);
- static char (&asio_connect_condition_check(Iterator))[2];
-
- static const bool value =
- sizeof(asio_connect_condition_check(
- (*static_cast<legacy_connect_condition_helper<T, Iterator>*>(0))(
- *static_cast<const asio::error_code*>(0),
- *static_cast<const Iterator*>(0)))) != 1;
- };
-
- template <typename ConnectCondition, typename Iterator>
- inline Iterator call_connect_condition(ConnectCondition& connect_condition,
- const asio::error_code& ec, Iterator next, Iterator end,
- typename enable_if<is_legacy_connect_condition<
- ConnectCondition, Iterator>::value>::type* = 0)
- {
- if (next != end)
- return connect_condition(ec, next);
- return end;
- }
-
- template <typename ConnectCondition, typename Iterator>
- inline Iterator call_connect_condition(ConnectCondition& connect_condition,
- const asio::error_code& ec, Iterator next, Iterator end,
- typename enable_if<!is_legacy_connect_condition<
- ConnectCondition, Iterator>::value>::type* = 0)
- {
- for (;next != end; ++next)
- if (connect_condition(ec, *next))
- return next;
- return end;
- }
-}
-
-template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
-typename Protocol::endpoint connect(
- basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- asio::error_code ec;
- typename Protocol::endpoint result = connect(s, endpoints, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
-typename Protocol::endpoint connect(
- basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints, asio::error_code& ec,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- return detail::deref_connect_result<Protocol>(
- connect(s, endpoints.begin(), endpoints.end(),
- detail::default_connect_condition(), ec), ec);
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
-Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- asio::error_code ec;
- Iterator result = connect(s, begin, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
-inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, asio::error_code& ec,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- return connect(s, begin, Iterator(), detail::default_connect_condition(), ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
-Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end)
-{
- asio::error_code ec;
- Iterator result = connect(s, begin, end, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
-inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end, asio::error_code& ec)
-{
- return connect(s, begin, end, detail::default_connect_condition(), ec);
-}
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(
- basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints, ConnectCondition connect_condition,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- asio::error_code ec;
- typename Protocol::endpoint result = connect(
- s, endpoints, connect_condition, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(
- basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints, ConnectCondition connect_condition,
- asio::error_code& ec,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- return detail::deref_connect_result<Protocol>(
- connect(s, endpoints.begin(), endpoints.end(),
- connect_condition, ec), ec);
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, ConnectCondition connect_condition,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- asio::error_code ec;
- Iterator result = connect(s, begin, connect_condition, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition>
-inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, ConnectCondition connect_condition,
- asio::error_code& ec,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- return connect(s, begin, Iterator(), connect_condition, ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end, ConnectCondition connect_condition)
-{
- asio::error_code ec;
- Iterator result = connect(s, begin, end, connect_condition, ec);
- asio::detail::throw_error(ec, "connect");
- return result;
-}
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end, ConnectCondition connect_condition,
- asio::error_code& ec)
-{
- ec = asio::error_code();
-
- for (Iterator iter = begin; iter != end; ++iter)
- {
- iter = (detail::call_connect_condition(connect_condition, ec, iter, end));
- if (iter != end)
- {
- s.close(ec);
- s.connect(*iter, ec);
- if (!ec)
- return iter;
- }
- else
- break;
- }
-
- if (!ec)
- ec = asio::error::not_found;
-
- return end;
-}
-
-namespace detail
-{
- // Enable the empty base class optimisation for the connect condition.
- template <typename ConnectCondition>
- class base_from_connect_condition
- {
- protected:
- explicit base_from_connect_condition(
- const ConnectCondition& connect_condition)
- : connect_condition_(connect_condition)
- {
- }
-
- template <typename Iterator>
- void check_condition(const asio::error_code& ec,
- Iterator& iter, Iterator& end)
- {
- iter = detail::call_connect_condition(connect_condition_, ec, iter, end);
- }
-
- private:
- ConnectCondition connect_condition_;
- };
-
- // The default_connect_condition implementation is essentially a no-op. This
- // template specialisation lets us eliminate all costs associated with it.
- template <>
- class base_from_connect_condition<default_connect_condition>
- {
- protected:
- explicit base_from_connect_condition(const default_connect_condition&)
- {
- }
-
- template <typename Iterator>
- void check_condition(const asio::error_code&, Iterator&, Iterator&)
- {
- }
- };
-
- template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler>
- class range_connect_op : base_from_connect_condition<ConnectCondition>
- {
- public:
- range_connect_op(basic_socket<Protocol ASIO_SVC_TARG>& sock,
- const EndpointSequence& endpoints,
- const ConnectCondition& connect_condition,
- RangeConnectHandler& handler)
- : base_from_connect_condition<ConnectCondition>(connect_condition),
- socket_(sock),
- endpoints_(endpoints),
- index_(0),
- start_(0),
- handler_(ASIO_MOVE_CAST(RangeConnectHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- range_connect_op(const range_connect_op& other)
- : base_from_connect_condition<ConnectCondition>(other),
- socket_(other.socket_),
- endpoints_(other.endpoints_),
- index_(other.index_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- range_connect_op(range_connect_op&& other)
- : base_from_connect_condition<ConnectCondition>(other),
- socket_(other.socket_),
- endpoints_(other.endpoints_),
- index_(other.index_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(RangeConnectHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(asio::error_code ec, int start = 0)
- {
- typename EndpointSequence::const_iterator begin = endpoints_.begin();
- typename EndpointSequence::const_iterator iter = begin;
- std::advance(iter, index_);
- typename EndpointSequence::const_iterator end = endpoints_.end();
-
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- this->check_condition(ec, iter, end);
- index_ = std::distance(begin, iter);
-
- if (iter != end)
- {
- socket_.close(ec);
- socket_.async_connect(*iter,
- ASIO_MOVE_CAST(range_connect_op)(*this));
- return;
- }
-
- if (start)
- {
- ec = asio::error::not_found;
- asio::post(socket_.get_executor(),
- detail::bind_handler(
- ASIO_MOVE_CAST(range_connect_op)(*this), ec));
- return;
- }
-
- default:
-
- if (iter == end)
- break;
-
- if (!socket_.is_open())
- {
- ec = asio::error::operation_aborted;
- break;
- }
-
- if (!ec)
- break;
-
- ++iter;
- ++index_;
- }
-
- handler_(static_cast<const asio::error_code&>(ec),
- static_cast<const typename Protocol::endpoint&>(
- ec || iter == end ? typename Protocol::endpoint() : *iter));
- }
- }
-
- //private:
- basic_socket<Protocol ASIO_SVC_TARG>& socket_;
- EndpointSequence endpoints_;
- std::size_t index_;
- int start_;
- RangeConnectHandler handler_;
- };
-
- template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler>
- inline void* asio_handler_allocate(std::size_t size,
- range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, RangeConnectHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, RangeConnectHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler>
- inline bool asio_handler_is_continuation(
- range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, RangeConnectHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename Protocol
- ASIO_SVC_TPARAM, typename EndpointSequence,
- typename ConnectCondition, typename RangeConnectHandler>
- inline void asio_handler_invoke(Function& function,
- range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, RangeConnectHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename Protocol
- ASIO_SVC_TPARAM, typename EndpointSequence,
- typename ConnectCondition, typename RangeConnectHandler>
- inline void asio_handler_invoke(const Function& function,
- range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, RangeConnectHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- class iterator_connect_op : base_from_connect_condition<ConnectCondition>
- {
- public:
- iterator_connect_op(basic_socket<Protocol ASIO_SVC_TARG>& sock,
- const Iterator& begin, const Iterator& end,
- const ConnectCondition& connect_condition,
- IteratorConnectHandler& handler)
- : base_from_connect_condition<ConnectCondition>(connect_condition),
- socket_(sock),
- iter_(begin),
- end_(end),
- start_(0),
- handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- iterator_connect_op(const iterator_connect_op& other)
- : base_from_connect_condition<ConnectCondition>(other),
- socket_(other.socket_),
- iter_(other.iter_),
- end_(other.end_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- iterator_connect_op(iterator_connect_op&& other)
- : base_from_connect_condition<ConnectCondition>(other),
- socket_(other.socket_),
- iter_(other.iter_),
- end_(other.end_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(asio::error_code ec, int start = 0)
- {
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- this->check_condition(ec, iter_, end_);
-
- if (iter_ != end_)
- {
- socket_.close(ec);
- socket_.async_connect(*iter_,
- ASIO_MOVE_CAST(iterator_connect_op)(*this));
- return;
- }
-
- if (start)
- {
- ec = asio::error::not_found;
- asio::post(socket_.get_executor(),
- detail::bind_handler(
- ASIO_MOVE_CAST(iterator_connect_op)(*this), ec));
- return;
- }
-
- default:
-
- if (iter_ == end_)
- break;
-
- if (!socket_.is_open())
- {
- ec = asio::error::operation_aborted;
- break;
- }
-
- if (!ec)
- break;
-
- ++iter_;
- }
-
- handler_(static_cast<const asio::error_code&>(ec),
- static_cast<const Iterator&>(iter_));
- }
- }
-
- //private:
- basic_socket<Protocol ASIO_SVC_TARG>& socket_;
- Iterator iter_;
- Iterator end_;
- int start_;
- IteratorConnectHandler handler_;
- };
-
- template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- inline void* asio_handler_allocate(std::size_t size,
- iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- inline bool asio_handler_is_continuation(
- iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename Protocol
- ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- inline void asio_handler_invoke(Function& function,
- iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename Protocol
- ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
- inline void asio_handler_invoke(const Function& function,
- iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler, typename Allocator>
-struct associated_allocator<
- detail::range_connect_op<Protocol ASIO_SVC_TARG,
- EndpointSequence, ConnectCondition, RangeConnectHandler>,
- Allocator>
-{
- typedef typename associated_allocator<
- RangeConnectHandler, Allocator>::type type;
-
- static type get(
- const detail::range_connect_op<Protocol ASIO_SVC_TARG,
- EndpointSequence, ConnectCondition, RangeConnectHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<RangeConnectHandler,
- Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename ConnectCondition,
- typename RangeConnectHandler, typename Executor>
-struct associated_executor<
- detail::range_connect_op<Protocol ASIO_SVC_TARG,
- EndpointSequence, ConnectCondition, RangeConnectHandler>,
- Executor>
-{
- typedef typename associated_executor<
- RangeConnectHandler, Executor>::type type;
-
- static type get(
- const detail::range_connect_op<Protocol ASIO_SVC_TARG,
- EndpointSequence, ConnectCondition, RangeConnectHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<RangeConnectHandler,
- Executor>::get(h.handler_, ex);
- }
-};
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition,
- typename IteratorConnectHandler, typename Allocator>
-struct associated_allocator<
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>,
- Allocator>
-{
- typedef typename associated_allocator<
- IteratorConnectHandler, Allocator>::type type;
-
- static type get(
- const detail::iterator_connect_op<Protocol ASIO_SVC_TARG,
- Iterator, ConnectCondition, IteratorConnectHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<IteratorConnectHandler,
- Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename ConnectCondition,
- typename IteratorConnectHandler, typename Executor>
-struct associated_executor<
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, IteratorConnectHandler>,
- Executor>
-{
- typedef typename associated_executor<
- IteratorConnectHandler, Executor>::type type;
-
- static type get(
- const detail::iterator_connect_op<Protocol ASIO_SVC_TARG,
- Iterator, ConnectCondition, IteratorConnectHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<IteratorConnectHandler,
- Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename EndpointSequence, typename RangeConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints,
- ASIO_MOVE_ARG(RangeConnectHandler) handler,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a RangeConnectHandler.
- ASIO_RANGE_CONNECT_HANDLER_CHECK(
- RangeConnectHandler, handler, typename Protocol::endpoint) type_check;
-
- async_completion<RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint)>
- init(handler);
-
- detail::range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- detail::default_connect_condition,
- ASIO_HANDLER_TYPE(RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint))>(s,
- endpoints, detail::default_connect_condition(),
- init.completion_handler)(asio::error_code(), 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename IteratorConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
- void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a IteratorConnectHandler.
- ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
- IteratorConnectHandler, handler, Iterator) type_check;
-
- async_completion<IteratorConnectHandler,
- void (asio::error_code, Iterator)> init(handler);
-
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- detail::default_connect_condition, ASIO_HANDLER_TYPE(
- IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
- begin, Iterator(), detail::default_connect_condition(),
- init.completion_handler)(asio::error_code(), 1);
-
- return init.result.get();
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-template <typename Protocol ASIO_SVC_TPARAM,
- typename Iterator, typename IteratorConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
- void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end,
- ASIO_MOVE_ARG(IteratorConnectHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a IteratorConnectHandler.
- ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
- IteratorConnectHandler, handler, Iterator) type_check;
-
- async_completion<IteratorConnectHandler,
- void (asio::error_code, Iterator)> init(handler);
-
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- detail::default_connect_condition, ASIO_HANDLER_TYPE(
- IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
- begin, end, detail::default_connect_condition(),
- init.completion_handler)(asio::error_code(), 1);
-
- return init.result.get();
-}
-
-template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence,
- typename ConnectCondition, typename RangeConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- const EndpointSequence& endpoints, ConnectCondition connect_condition,
- ASIO_MOVE_ARG(RangeConnectHandler) handler,
- typename enable_if<is_endpoint_sequence<
- EndpointSequence>::value>::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a RangeConnectHandler.
- ASIO_RANGE_CONNECT_HANDLER_CHECK(
- RangeConnectHandler, handler, typename Protocol::endpoint) type_check;
-
- async_completion<RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint)>
- init(handler);
-
- detail::range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
- ConnectCondition, ASIO_HANDLER_TYPE(RangeConnectHandler,
- void (asio::error_code, typename Protocol::endpoint))>(s,
- endpoints, connect_condition, init.completion_handler)(
- asio::error_code(), 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
- void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, ConnectCondition connect_condition,
- ASIO_MOVE_ARG(IteratorConnectHandler) handler,
- typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a IteratorConnectHandler.
- ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
- IteratorConnectHandler, handler, Iterator) type_check;
-
- async_completion<IteratorConnectHandler,
- void (asio::error_code, Iterator)> init(handler);
-
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, ASIO_HANDLER_TYPE(
- IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
- begin, Iterator(), connect_condition, init.completion_handler)(
- asio::error_code(), 1);
-
- return init.result.get();
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
- typename ConnectCondition, typename IteratorConnectHandler>
-inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
- void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
- Iterator begin, Iterator end, ConnectCondition connect_condition,
- ASIO_MOVE_ARG(IteratorConnectHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a IteratorConnectHandler.
- ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
- IteratorConnectHandler, handler, Iterator) type_check;
-
- async_completion<IteratorConnectHandler,
- void (asio::error_code, Iterator)> init(handler);
-
- detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
- ConnectCondition, ASIO_HANDLER_TYPE(
- IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
- begin, end, connect_condition, init.completion_handler)(
- asio::error_code(), 1);
-
- return init.result.get();
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_CONNECT_HPP
diff --git a/lib/asio/impl/defer.hpp b/lib/asio/impl/defer.hpp
deleted file mode 100644
index a27df0f..0000000
--- a/lib/asio/impl/defer.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// impl/defer.hpp
-// ~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_DEFER_HPP
-#define ASIO_IMPL_DEFER_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/work_dispatcher.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
- ASIO_MOVE_ARG(CompletionToken) token)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_executor<handler>::type ex(
- (get_associated_executor)(init.completion_handler));
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.defer(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename Executor, typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
- const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_executor<Executor>::value>::type*)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.defer(detail::work_dispatcher<handler>(init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename ExecutionContext, typename CompletionToken>
-inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
- ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_convertible<
- ExecutionContext&, execution_context&>::value>::type*)
-{
- return (defer)(ctx.get_executor(),
- ASIO_MOVE_CAST(CompletionToken)(token));
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_DEFER_HPP
diff --git a/lib/asio/impl/dispatch.hpp b/lib/asio/impl/dispatch.hpp
deleted file mode 100644
index 4e11c6b..0000000
--- a/lib/asio/impl/dispatch.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-// impl/dispatch.hpp
-// ~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_DISPATCH_HPP
-#define ASIO_IMPL_DISPATCH_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/work_dispatcher.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
- ASIO_MOVE_ARG(CompletionToken) token)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_executor<handler>::type ex(
- (get_associated_executor)(init.completion_handler));
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.dispatch(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename Executor, typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
- const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_executor<Executor>::value>::type*)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.dispatch(detail::work_dispatcher<handler>(
- init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename ExecutionContext, typename CompletionToken>
-inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
- ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_convertible<
- ExecutionContext&, execution_context&>::value>::type*)
-{
- return (dispatch)(ctx.get_executor(),
- ASIO_MOVE_CAST(CompletionToken)(token));
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_DISPATCH_HPP
diff --git a/lib/asio/impl/error.ipp b/lib/asio/impl/error.ipp
deleted file mode 100644
index 6b1f33a..0000000
--- a/lib/asio/impl/error.ipp
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-// impl/error.ipp
-// ~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_ERROR_IPP
-#define ASIO_IMPL_ERROR_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include <string>
-#include "asio/error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-namespace error {
-
-#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__)
-
-namespace detail {
-
-class netdb_category : public asio::error_category
-{
-public:
- const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT
- {
- return "asio.netdb";
- }
-
- std::string message(int value) const
- {
- if (value == error::host_not_found)
- return "Host not found (authoritative)";
- if (value == error::host_not_found_try_again)
- return "Host not found (non-authoritative), try again later";
- if (value == error::no_data)
- return "The query is valid, but it does not have associated data";
- if (value == error::no_recovery)
- return "A non-recoverable error occurred during database lookup";
- return "asio.netdb error";
- }
-};
-
-} // namespace detail
-
-const asio::error_category& get_netdb_category()
-{
- static detail::netdb_category instance;
- return instance;
-}
-
-namespace detail {
-
-class addrinfo_category : public asio::error_category
-{
-public:
- const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT
- {
- return "asio.addrinfo";
- }
-
- std::string message(int value) const
- {
- if (value == error::service_not_found)
- return "Service not found";
- if (value == error::socket_type_not_supported)
- return "Socket type not supported";
- return "asio.addrinfo error";
- }
-};
-
-} // namespace detail
-
-const asio::error_category& get_addrinfo_category()
-{
- static detail::addrinfo_category instance;
- return instance;
-}
-
-#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__)
-
-namespace detail {
-
-class misc_category : public asio::error_category
-{
-public:
- const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT
- {
- return "asio.misc";
- }
-
- std::string message(int value) const
- {
- if (value == error::already_open)
- return "Already open";
- if (value == error::eof)
- return "End of file";
- if (value == error::not_found)
- return "Element not found";
- if (value == error::fd_set_failure)
- return "The descriptor does not fit into the select call's fd_set";
- return "asio.misc error";
- }
-};
-
-} // namespace detail
-
-const asio::error_category& get_misc_category()
-{
- static detail::misc_category instance;
- return instance;
-}
-
-} // namespace error
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_ERROR_IPP
diff --git a/lib/asio/impl/error_code.ipp b/lib/asio/impl/error_code.ipp
deleted file mode 100644
index 0c8a827..0000000
--- a/lib/asio/impl/error_code.ipp
+++ /dev/null
@@ -1,206 +0,0 @@
-//
-// impl/error_code.ipp
-// ~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_ERROR_CODE_IPP
-#define ASIO_IMPL_ERROR_CODE_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
-# include <winerror.h>
-#elif defined(ASIO_WINDOWS_RUNTIME)
-# include <windows.h>
-#else
-# include <cerrno>
-# include <cstring>
-# include <string>
-#endif
-#include "asio/detail/local_free_on_block_exit.hpp"
-#include "asio/detail/socket_types.hpp"
-#include "asio/error_code.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-namespace detail {
-
-class system_category : public error_category
-{
-public:
- const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT
- {
- return "asio.system";
- }
-
- std::string message(int value) const
- {
-#if defined(ASIO_WINDOWS_RUNTIME) || defined(ASIO_WINDOWS_APP)
- std::wstring wmsg(128, wchar_t());
- for (;;)
- {
- DWORD wlength = ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- &wmsg[0], static_cast<DWORD>(wmsg.size()), 0);
- if (wlength == 0 && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
- {
- wmsg.resize(wmsg.size() + wmsg.size() / 2);
- continue;
- }
- if (wlength && wmsg[wlength - 1] == '\n')
- --wlength;
- if (wlength && wmsg[wlength - 1] == '\r')
- --wlength;
- if (wlength)
- {
- std::string msg(wlength * 2, char());
- int length = ::WideCharToMultiByte(CP_ACP, 0,
- wmsg.c_str(), static_cast<int>(wlength),
- &msg[0], static_cast<int>(wlength * 2), 0, 0);
- if (length <= 0)
- return "asio.system error";
- msg.resize(static_cast<std::size_t>(length));
- return msg;
- }
- else
- return "asio.system error";
- }
-#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- char* msg = 0;
- DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
- | FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0);
- detail::local_free_on_block_exit local_free_obj(msg);
- if (length && msg[length - 1] == '\n')
- msg[--length] = '\0';
- if (length && msg[length - 1] == '\r')
- msg[--length] = '\0';
- if (length)
- return msg;
- else
- return "asio.system error";
-#else // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__)
-#if !defined(__sun)
- if (value == ECANCELED)
- return "Operation aborted.";
-#endif // !defined(__sun)
-#if defined(__sun) || defined(__QNX__) || defined(__SYMBIAN32__)
- using namespace std;
- return strerror(value);
-#else
- char buf[256] = "";
- using namespace std;
- return strerror_result(strerror_r(value, buf, sizeof(buf)), buf);
-#endif
-#endif // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__)
- }
-
-#if defined(ASIO_HAS_STD_ERROR_CODE)
- std::error_condition default_error_condition(
- int ev) const ASIO_ERROR_CATEGORY_NOEXCEPT
- {
- switch (ev)
- {
- case access_denied:
- return std::errc::permission_denied;
- case address_family_not_supported:
- return std::errc::address_family_not_supported;
- case address_in_use:
- return std::errc::address_in_use;
- case already_connected:
- return std::errc::already_connected;
- case already_started:
- return std::errc::connection_already_in_progress;
- case broken_pipe:
- return std::errc::broken_pipe;
- case connection_aborted:
- return std::errc::connection_aborted;
- case connection_refused:
- return std::errc::connection_refused;
- case connection_reset:
- return std::errc::connection_reset;
- case bad_descriptor:
- return std::errc::bad_file_descriptor;
- case fault:
- return std::errc::bad_address;
- case host_unreachable:
- return std::errc::host_unreachable;
- case in_progress:
- return std::errc::operation_in_progress;
- case interrupted:
- return std::errc::interrupted;
- case invalid_argument:
- return std::errc::invalid_argument;
- case message_size:
- return std::errc::message_size;
- case name_too_long:
- return std::errc::filename_too_long;
- case network_down:
- return std::errc::network_down;
- case network_reset:
- return std::errc::network_reset;
- case network_unreachable:
- return std::errc::network_unreachable;
- case no_descriptors:
- return std::errc::too_many_files_open;
- case no_buffer_space:
- return std::errc::no_buffer_space;
- case no_memory:
- return std::errc::not_enough_memory;
- case no_permission:
- return std::errc::operation_not_permitted;
- case no_protocol_option:
- return std::errc::no_protocol_option;
- case no_such_device:
- return std::errc::no_such_device;
- case not_connected:
- return std::errc::not_connected;
- case not_socket:
- return std::errc::not_a_socket;
- case operation_aborted:
- return std::errc::operation_canceled;
- case operation_not_supported:
- return std::errc::operation_not_supported;
- case shut_down:
- return std::make_error_condition(ev, *this);
- case timed_out:
- return std::errc::timed_out;
- case try_again:
- return std::errc::resource_unavailable_try_again;
- case would_block:
- return std::errc::operation_would_block;
- default:
- return std::make_error_condition(ev, *this);
- }
-#endif // defined(ASIO_HAS_STD_ERROR_CODE)
-
-private:
- // Helper function to adapt the result from glibc's variant of strerror_r.
- static const char* strerror_result(int, const char* s) { return s; }
- static const char* strerror_result(const char* s, const char*) { return s; }
-};
-
-} // namespace detail
-
-const error_category& system_category()
-{
- static detail::system_category instance;
- return instance;
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_ERROR_CODE_IPP
diff --git a/lib/asio/impl/execution_context.hpp b/lib/asio/impl/execution_context.hpp
deleted file mode 100644
index 3d1e457..0000000
--- a/lib/asio/impl/execution_context.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// impl/execution_context.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_EXECUTION_CONTEXT_HPP
-#define ASIO_IMPL_EXECUTION_CONTEXT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/scoped_ptr.hpp"
-#include "asio/detail/service_registry.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename Service>
-inline Service& use_service(execution_context& e)
-{
- // Check that Service meets the necessary type requirements.
- (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
-
- return e.service_registry_->template use_service<Service>();
-}
-
-#if !defined(GENERATING_DOCUMENTATION)
-# if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename Service, typename... Args>
-Service& make_service(execution_context& e, ASIO_MOVE_ARG(Args)... args)
-{
- detail::scoped_ptr<Service> svc(
- new Service(e, ASIO_MOVE_CAST(Args)(args)...));
- e.service_registry_->template add_service<Service>(svc.get());
- Service& result = *svc;
- svc.release();
- return result;
-}
-
-# else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename Service>
-Service& make_service(execution_context& e)
-{
- detail::scoped_ptr<Service> svc(new Service(e));
- e.service_registry_->template add_service<Service>(svc.get());
- Service& result = *svc;
- svc.release();
- return result;
-}
-
-#define ASIO_PRIVATE_MAKE_SERVICE_DEF(n) \
- template <typename Service, ASIO_VARIADIC_TPARAMS(n)> \
- Service& make_service(execution_context& e, \
- ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- detail::scoped_ptr<Service> svc( \
- new Service(e, ASIO_VARIADIC_MOVE_ARGS(n))); \
- e.service_registry_->template add_service<Service>(svc.get()); \
- Service& result = *svc; \
- svc.release(); \
- return result; \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_MAKE_SERVICE_DEF)
-#undef ASIO_PRIVATE_MAKE_SERVICE_DEF
-
-# endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename Service>
-inline void add_service(execution_context& e, Service* svc)
-{
- // Check that Service meets the necessary type requirements.
- (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
-
- e.service_registry_->template add_service<Service>(svc);
-}
-
-template <typename Service>
-inline bool has_service(execution_context& e)
-{
- // Check that Service meets the necessary type requirements.
- (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
-
- return e.service_registry_->template has_service<Service>();
-}
-
-inline execution_context& execution_context::service::context()
-{
- return owner_;
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_EXECUTION_CONTEXT_HPP
diff --git a/lib/asio/impl/execution_context.ipp b/lib/asio/impl/execution_context.ipp
deleted file mode 100644
index c2b3b21..0000000
--- a/lib/asio/impl/execution_context.ipp
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// impl/execution_context.ipp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_EXECUTION_CONTEXT_IPP
-#define ASIO_IMPL_EXECUTION_CONTEXT_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/execution_context.hpp"
-#include "asio/detail/service_registry.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-execution_context::execution_context()
- : service_registry_(new asio::detail::service_registry(*this))
-{
-}
-
-execution_context::~execution_context()
-{
- shutdown();
- destroy();
- delete service_registry_;
-}
-
-void execution_context::shutdown()
-{
- service_registry_->shutdown_services();
-}
-
-void execution_context::destroy()
-{
- service_registry_->destroy_services();
-}
-
-void execution_context::notify_fork(
- asio::execution_context::fork_event event)
-{
- service_registry_->notify_fork(event);
-}
-
-execution_context::service::service(execution_context& owner)
- : owner_(owner),
- next_(0)
-{
-}
-
-execution_context::service::~service()
-{
-}
-
-void execution_context::service::notify_fork(execution_context::fork_event)
-{
-}
-
-service_already_exists::service_already_exists()
- : std::logic_error("Service already exists.")
-{
-}
-
-invalid_service_owner::invalid_service_owner()
- : std::logic_error("Invalid service owner.")
-{
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_EXECUTION_CONTEXT_IPP
diff --git a/lib/asio/impl/executor.hpp b/lib/asio/impl/executor.hpp
deleted file mode 100644
index 0fcf5f5..0000000
--- a/lib/asio/impl/executor.hpp
+++ /dev/null
@@ -1,386 +0,0 @@
-//
-// impl/executor.hpp
-// ~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_EXECUTOR_HPP
-#define ASIO_IMPL_EXECUTOR_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/detail/atomic_count.hpp"
-#include "asio/detail/executor_op.hpp"
-#include "asio/detail/global.hpp"
-#include "asio/detail/memory.hpp"
-#include "asio/detail/recycling_allocator.hpp"
-#include "asio/executor.hpp"
-#include "asio/system_executor.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-#if defined(ASIO_HAS_MOVE)
-
-// Lightweight, move-only function object wrapper.
-class executor::function
-{
-public:
- template <typename F, typename Alloc>
- explicit function(F f, const Alloc& a)
- {
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<F, Alloc> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- op_ = new (p.v) op(ASIO_MOVE_CAST(F)(f), a);
- p.v = 0;
- }
-
- function(function&& other)
- : op_(other.op_)
- {
- other.op_ = 0;
- }
-
- ~function()
- {
- if (op_)
- op_->destroy();
- }
-
- void operator()()
- {
- if (op_)
- {
- detail::scheduler_operation* op = op_;
- op_ = 0;
- op->complete(this, asio::error_code(), 0);
- }
- }
-
-private:
- detail::scheduler_operation* op_;
-};
-
-#else // defined(ASIO_HAS_MOVE)
-
-// Not so lightweight, copyable function object wrapper.
-class executor::function
-{
-public:
- template <typename F, typename Alloc>
- explicit function(const F& f, const Alloc&)
- : impl_(new impl<F>(f))
- {
- }
-
- void operator()()
- {
- impl_->invoke_(impl_.get());
- }
-
-private:
- // Base class for polymorphic function implementations.
- struct impl_base
- {
- void (*invoke_)(impl_base*);
- };
-
- // Polymorphic function implementation.
- template <typename F>
- struct impl : impl_base
- {
- impl(const F& f)
- : function_(f)
- {
- invoke_ = &function::invoke<F>;
- }
-
- F function_;
- };
-
- // Helper to invoke a function.
- template <typename F>
- static void invoke(impl_base* i)
- {
- static_cast<impl<F>*>(i)->function_();
- }
-
- detail::shared_ptr<impl_base> impl_;
-};
-
-#endif // defined(ASIO_HAS_MOVE)
-
-// Default polymorphic allocator implementation.
-template <typename Executor, typename Allocator>
-class executor::impl
- : public executor::impl_base
-{
-public:
- typedef ASIO_REBIND_ALLOC(Allocator, impl) allocator_type;
-
- static impl_base* create(const Executor& e, Allocator a = Allocator())
- {
- raw_mem mem(a);
- impl* p = new (mem.ptr_) impl(e, a);
- mem.ptr_ = 0;
- return p;
- }
-
- impl(const Executor& e, const Allocator& a) ASIO_NOEXCEPT
- : impl_base(false),
- ref_count_(1),
- executor_(e),
- allocator_(a)
- {
- }
-
- impl_base* clone() const ASIO_NOEXCEPT
- {
- ++ref_count_;
- return const_cast<impl_base*>(static_cast<const impl_base*>(this));
- }
-
- void destroy() ASIO_NOEXCEPT
- {
- if (--ref_count_ == 0)
- {
- allocator_type alloc(allocator_);
- impl* p = this;
- p->~impl();
- alloc.deallocate(p, 1);
- }
- }
-
- void on_work_started() ASIO_NOEXCEPT
- {
- executor_.on_work_started();
- }
-
- void on_work_finished() ASIO_NOEXCEPT
- {
- executor_.on_work_finished();
- }
-
- execution_context& context() ASIO_NOEXCEPT
- {
- return executor_.context();
- }
-
- void dispatch(ASIO_MOVE_ARG(function) f)
- {
- executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- void post(ASIO_MOVE_ARG(function) f)
- {
- executor_.post(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- void defer(ASIO_MOVE_ARG(function) f)
- {
- executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- type_id_result_type target_type() const ASIO_NOEXCEPT
- {
- return type_id<Executor>();
- }
-
- void* target() ASIO_NOEXCEPT
- {
- return &executor_;
- }
-
- const void* target() const ASIO_NOEXCEPT
- {
- return &executor_;
- }
-
- bool equals(const impl_base* e) const ASIO_NOEXCEPT
- {
- if (this == e)
- return true;
- if (target_type() != e->target_type())
- return false;
- return executor_ == *static_cast<const Executor*>(e->target());
- }
-
-private:
- mutable detail::atomic_count ref_count_;
- Executor executor_;
- Allocator allocator_;
-
- struct raw_mem
- {
- allocator_type allocator_;
- impl* ptr_;
-
- explicit raw_mem(const Allocator& a)
- : allocator_(a),
- ptr_(allocator_.allocate(1))
- {
- }
-
- ~raw_mem()
- {
- if (ptr_)
- allocator_.deallocate(ptr_, 1);
- }
-
- private:
- // Disallow copying and assignment.
- raw_mem(const raw_mem&);
- raw_mem operator=(const raw_mem&);
- };
-};
-
-// Polymorphic allocator specialisation for system_executor.
-template <typename Allocator>
-class executor::impl<system_executor, Allocator>
- : public executor::impl_base
-{
-public:
- static impl_base* create(const system_executor&,
- const Allocator& = Allocator())
- {
- return &detail::global<impl<system_executor, std::allocator<void> > >();
- }
-
- impl()
- : impl_base(true)
- {
- }
-
- impl_base* clone() const ASIO_NOEXCEPT
- {
- return const_cast<impl_base*>(static_cast<const impl_base*>(this));
- }
-
- void destroy() ASIO_NOEXCEPT
- {
- }
-
- void on_work_started() ASIO_NOEXCEPT
- {
- executor_.on_work_started();
- }
-
- void on_work_finished() ASIO_NOEXCEPT
- {
- executor_.on_work_finished();
- }
-
- execution_context& context() ASIO_NOEXCEPT
- {
- return executor_.context();
- }
-
- void dispatch(ASIO_MOVE_ARG(function) f)
- {
- executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- void post(ASIO_MOVE_ARG(function) f)
- {
- executor_.post(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- void defer(ASIO_MOVE_ARG(function) f)
- {
- executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_);
- }
-
- type_id_result_type target_type() const ASIO_NOEXCEPT
- {
- return type_id<system_executor>();
- }
-
- void* target() ASIO_NOEXCEPT
- {
- return &executor_;
- }
-
- const void* target() const ASIO_NOEXCEPT
- {
- return &executor_;
- }
-
- bool equals(const impl_base* e) const ASIO_NOEXCEPT
- {
- return this == e;
- }
-
-private:
- system_executor executor_;
- Allocator allocator_;
-};
-
-template <typename Executor>
-executor::executor(Executor e)
- : impl_(impl<Executor, std::allocator<void> >::create(e))
-{
-}
-
-template <typename Executor, typename Allocator>
-executor::executor(allocator_arg_t, const Allocator& a, Executor e)
- : impl_(impl<Executor, Allocator>::create(e, a))
-{
-}
-
-template <typename Function, typename Allocator>
-void executor::dispatch(ASIO_MOVE_ARG(Function) f,
- const Allocator& a) const
-{
- impl_base* i = get_impl();
- if (i->fast_dispatch_)
- system_executor().dispatch(ASIO_MOVE_CAST(Function)(f), a);
- else
- i->dispatch(function(ASIO_MOVE_CAST(Function)(f), a));
-}
-
-template <typename Function, typename Allocator>
-void executor::post(ASIO_MOVE_ARG(Function) f,
- const Allocator& a) const
-{
- get_impl()->post(function(ASIO_MOVE_CAST(Function)(f), a));
-}
-
-template <typename Function, typename Allocator>
-void executor::defer(ASIO_MOVE_ARG(Function) f,
- const Allocator& a) const
-{
- get_impl()->defer(function(ASIO_MOVE_CAST(Function)(f), a));
-}
-
-template <typename Executor>
-Executor* executor::target() ASIO_NOEXCEPT
-{
- return impl_ && impl_->target_type() == type_id<Executor>()
- ? static_cast<Executor*>(impl_->target()) : 0;
-}
-
-template <typename Executor>
-const Executor* executor::target() const ASIO_NOEXCEPT
-{
- return impl_ && impl_->target_type() == type_id<Executor>()
- ? static_cast<Executor*>(impl_->target()) : 0;
-}
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_EXECUTOR_HPP
diff --git a/lib/asio/impl/executor.ipp b/lib/asio/impl/executor.ipp
deleted file mode 100644
index 4bd0dc5..0000000
--- a/lib/asio/impl/executor.ipp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// impl/executor.ipp
-// ~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_EXECUTOR_IPP
-#define ASIO_IMPL_EXECUTOR_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/executor.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-bad_executor::bad_executor() ASIO_NOEXCEPT
-{
-}
-
-const char* bad_executor::what() const ASIO_NOEXCEPT_OR_NOTHROW
-{
- return "bad executor";
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_EXECUTOR_IPP
diff --git a/lib/asio/impl/handler_alloc_hook.ipp b/lib/asio/impl/handler_alloc_hook.ipp
deleted file mode 100644
index 909ddac..0000000
--- a/lib/asio/impl/handler_alloc_hook.ipp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// impl/handler_alloc_hook.ipp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP
-#define ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/detail/thread_context.hpp"
-#include "asio/detail/thread_info_base.hpp"
-#include "asio/handler_alloc_hook.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-void* asio_handler_allocate(std::size_t size, ...)
-{
-#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
- return detail::thread_info_base::allocate(
- detail::thread_context::thread_call_stack::top(), size);
-#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
- return ::operator new(size);
-#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
-}
-
-void asio_handler_deallocate(void* pointer, std::size_t size, ...)
-{
-#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
- detail::thread_info_base::deallocate(
- detail::thread_context::thread_call_stack::top(), pointer, size);
-#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
- (void)size;
- ::operator delete(pointer);
-#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP
diff --git a/lib/asio/impl/io_context.hpp b/lib/asio/impl/io_context.hpp
deleted file mode 100644
index eaf580d..0000000
--- a/lib/asio/impl/io_context.hpp
+++ /dev/null
@@ -1,343 +0,0 @@
-//
-// impl/io_context.hpp
-// ~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_IO_CONTEXT_HPP
-#define ASIO_IMPL_IO_CONTEXT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/completion_handler.hpp"
-#include "asio/detail/executor_op.hpp"
-#include "asio/detail/fenced_block.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/recycling_allocator.hpp"
-#include "asio/detail/service_registry.hpp"
-#include "asio/detail/throw_error.hpp"
-#include "asio/detail/type_traits.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename Service>
-inline Service& use_service(io_context& ioc)
-{
- // Check that Service meets the necessary type requirements.
- (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
- (void)static_cast<const execution_context::id*>(&Service::id);
-
- return ioc.service_registry_->template use_service<Service>(ioc);
-}
-
-template <>
-inline detail::io_context_impl& use_service<detail::io_context_impl>(
- io_context& ioc)
-{
- return ioc.impl_;
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#if defined(ASIO_HAS_IOCP)
-# include "asio/detail/win_iocp_io_context.hpp"
-#else
-# include "asio/detail/scheduler.hpp"
-#endif
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-inline io_context::executor_type
-io_context::get_executor() ASIO_NOEXCEPT
-{
- return executor_type(*this);
-}
-
-#if defined(ASIO_HAS_CHRONO)
-
-template <typename Rep, typename Period>
-std::size_t io_context::run_for(
- const chrono::duration<Rep, Period>& rel_time)
-{
- return this->run_until(chrono::steady_clock::now() + rel_time);
-}
-
-template <typename Clock, typename Duration>
-std::size_t io_context::run_until(
- const chrono::time_point<Clock, Duration>& abs_time)
-{
- std::size_t n = 0;
- while (this->run_one_until(abs_time))
- if (n != (std::numeric_limits<std::size_t>::max)())
- ++n;
- return n;
-}
-
-template <typename Rep, typename Period>
-std::size_t io_context::run_one_for(
- const chrono::duration<Rep, Period>& rel_time)
-{
- return this->run_one_until(chrono::steady_clock::now() + rel_time);
-}
-
-template <typename Clock, typename Duration>
-std::size_t io_context::run_one_until(
- const chrono::time_point<Clock, Duration>& abs_time)
-{
- typename Clock::time_point now = Clock::now();
- while (now < abs_time)
- {
- typename Clock::duration rel_time = abs_time - now;
- if (rel_time > chrono::seconds(1))
- rel_time = chrono::seconds(1);
-
- asio::error_code ec;
- std::size_t s = impl_.wait_one(
- static_cast<long>(chrono::duration_cast<
- chrono::microseconds>(rel_time).count()), ec);
- asio::detail::throw_error(ec);
-
- if (s || impl_.stopped())
- return s;
-
- now = Clock::now();
- }
-
- return 0;
-}
-
-#endif // defined(ASIO_HAS_CHRONO)
-
-#if !defined(ASIO_NO_DEPRECATED)
-
-inline void io_context::reset()
-{
- restart();
-}
-
-template <typename LegacyCompletionHandler>
-ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
-io_context::dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a LegacyCompletionHandler.
- ASIO_LEGACY_COMPLETION_HANDLER_CHECK(
- LegacyCompletionHandler, handler) type_check;
-
- async_completion<LegacyCompletionHandler, void ()> init(handler);
-
- if (impl_.can_dispatch())
- {
- detail::fenced_block b(detail::fenced_block::full);
- asio_handler_invoke_helpers::invoke(
- init.completion_handler, init.completion_handler);
- }
- else
- {
- // Allocate and construct an operation to wrap the handler.
- typedef detail::completion_handler<
- typename handler_type<LegacyCompletionHandler, void ()>::type> op;
- typename op::ptr p = { detail::addressof(init.completion_handler),
- op::ptr::allocate(init.completion_handler), 0 };
- p.p = new (p.v) op(init.completion_handler);
-
- ASIO_HANDLER_CREATION((*this, *p.p,
- "io_context", this, 0, "dispatch"));
-
- impl_.do_dispatch(p.p);
- p.v = p.p = 0;
- }
-
- return init.result.get();
-}
-
-template <typename LegacyCompletionHandler>
-ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
-io_context::post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a LegacyCompletionHandler.
- ASIO_LEGACY_COMPLETION_HANDLER_CHECK(
- LegacyCompletionHandler, handler) type_check;
-
- async_completion<LegacyCompletionHandler, void ()> init(handler);
-
- bool is_continuation =
- asio_handler_cont_helpers::is_continuation(init.completion_handler);
-
- // Allocate and construct an operation to wrap the handler.
- typedef detail::completion_handler<
- typename handler_type<LegacyCompletionHandler, void ()>::type> op;
- typename op::ptr p = { detail::addressof(init.completion_handler),
- op::ptr::allocate(init.completion_handler), 0 };
- p.p = new (p.v) op(init.completion_handler);
-
- ASIO_HANDLER_CREATION((*this, *p.p,
- "io_context", this, 0, "post"));
-
- impl_.post_immediate_completion(p.p, is_continuation);
- p.v = p.p = 0;
-
- return init.result.get();
-}
-
-template <typename Handler>
-#if defined(GENERATING_DOCUMENTATION)
-unspecified
-#else
-inline detail::wrapped_handler<io_context&, Handler>
-#endif
-io_context::wrap(Handler handler)
-{
- return detail::wrapped_handler<io_context&, Handler>(*this, handler);
-}
-
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-inline io_context&
-io_context::executor_type::context() const ASIO_NOEXCEPT
-{
- return io_context_;
-}
-
-inline void
-io_context::executor_type::on_work_started() const ASIO_NOEXCEPT
-{
- io_context_.impl_.work_started();
-}
-
-inline void
-io_context::executor_type::on_work_finished() const ASIO_NOEXCEPT
-{
- io_context_.impl_.work_finished();
-}
-
-template <typename Function, typename Allocator>
-void io_context::executor_type::dispatch(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Invoke immediately if we are already inside the thread pool.
- if (io_context_.impl_.can_dispatch())
- {
- // Make a local, non-const copy of the function.
- function_type tmp(ASIO_MOVE_CAST(Function)(f));
-
- detail::fenced_block b(detail::fenced_block::full);
- asio_handler_invoke_helpers::invoke(tmp, tmp);
- return;
- }
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator, detail::operation> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((this->context(), *p.p,
- "io_context", &this->context(), 0, "post"));
-
- io_context_.impl_.post_immediate_completion(p.p, false);
- p.v = p.p = 0;
-}
-
-template <typename Function, typename Allocator>
-void io_context::executor_type::post(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator, detail::operation> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((this->context(), *p.p,
- "io_context", &this->context(), 0, "post"));
-
- io_context_.impl_.post_immediate_completion(p.p, false);
- p.v = p.p = 0;
-}
-
-template <typename Function, typename Allocator>
-void io_context::executor_type::defer(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator, detail::operation> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((this->context(), *p.p,
- "io_context", &this->context(), 0, "defer"));
-
- io_context_.impl_.post_immediate_completion(p.p, true);
- p.v = p.p = 0;
-}
-
-inline bool
-io_context::executor_type::running_in_this_thread() const ASIO_NOEXCEPT
-{
- return io_context_.impl_.can_dispatch();
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-inline io_context::work::work(asio::io_context& io_context)
- : io_context_impl_(io_context.impl_)
-{
- io_context_impl_.work_started();
-}
-
-inline io_context::work::work(const work& other)
- : io_context_impl_(other.io_context_impl_)
-{
- io_context_impl_.work_started();
-}
-
-inline io_context::work::~work()
-{
- io_context_impl_.work_finished();
-}
-
-inline asio::io_context& io_context::work::get_io_context()
-{
- return static_cast<asio::io_context&>(io_context_impl_.context());
-}
-
-inline asio::io_context& io_context::work::get_io_service()
-{
- return static_cast<asio::io_context&>(io_context_impl_.context());
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-inline asio::io_context& io_context::service::get_io_context()
-{
- return static_cast<asio::io_context&>(context());
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-inline asio::io_context& io_context::service::get_io_service()
-{
- return static_cast<asio::io_context&>(context());
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_IO_CONTEXT_HPP
diff --git a/lib/asio/impl/io_context.ipp b/lib/asio/impl/io_context.ipp
deleted file mode 100644
index 7eb467d..0000000
--- a/lib/asio/impl/io_context.ipp
+++ /dev/null
@@ -1,174 +0,0 @@
-//
-// impl/io_context.ipp
-// ~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_IO_CONTEXT_IPP
-#define ASIO_IMPL_IO_CONTEXT_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/io_context.hpp"
-#include "asio/detail/concurrency_hint.hpp"
-#include "asio/detail/limits.hpp"
-#include "asio/detail/scoped_ptr.hpp"
-#include "asio/detail/service_registry.hpp"
-#include "asio/detail/throw_error.hpp"
-
-#if defined(ASIO_HAS_IOCP)
-# include "asio/detail/win_iocp_io_context.hpp"
-#else
-# include "asio/detail/scheduler.hpp"
-#endif
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-io_context::io_context()
- : impl_(add_impl(new impl_type(*this, ASIO_CONCURRENCY_HINT_DEFAULT)))
-{
-}
-
-io_context::io_context(int concurrency_hint)
- : impl_(add_impl(new impl_type(*this, concurrency_hint == 1
- ? ASIO_CONCURRENCY_HINT_1 : concurrency_hint)))
-{
-}
-
-io_context::impl_type& io_context::add_impl(io_context::impl_type* impl)
-{
- asio::detail::scoped_ptr<impl_type> scoped_impl(impl);
- asio::add_service<impl_type>(*this, scoped_impl.get());
- return *scoped_impl.release();
-}
-
-io_context::~io_context()
-{
-}
-
-io_context::count_type io_context::run()
-{
- asio::error_code ec;
- count_type s = impl_.run(ec);
- asio::detail::throw_error(ec);
- return s;
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-io_context::count_type io_context::run(asio::error_code& ec)
-{
- return impl_.run(ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-io_context::count_type io_context::run_one()
-{
- asio::error_code ec;
- count_type s = impl_.run_one(ec);
- asio::detail::throw_error(ec);
- return s;
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-io_context::count_type io_context::run_one(asio::error_code& ec)
-{
- return impl_.run_one(ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-io_context::count_type io_context::poll()
-{
- asio::error_code ec;
- count_type s = impl_.poll(ec);
- asio::detail::throw_error(ec);
- return s;
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-io_context::count_type io_context::poll(asio::error_code& ec)
-{
- return impl_.poll(ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-io_context::count_type io_context::poll_one()
-{
- asio::error_code ec;
- count_type s = impl_.poll_one(ec);
- asio::detail::throw_error(ec);
- return s;
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-io_context::count_type io_context::poll_one(asio::error_code& ec)
-{
- return impl_.poll_one(ec);
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-void io_context::stop()
-{
- impl_.stop();
-}
-
-bool io_context::stopped() const
-{
- return impl_.stopped();
-}
-
-void io_context::restart()
-{
- impl_.restart();
-}
-
-io_context::service::service(asio::io_context& owner)
- : execution_context::service(owner)
-{
-}
-
-io_context::service::~service()
-{
-}
-
-void io_context::service::shutdown()
-{
-#if !defined(ASIO_NO_DEPRECATED)
- shutdown_service();
-#endif // !defined(ASIO_NO_DEPRECATED)
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-void io_context::service::shutdown_service()
-{
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-void io_context::service::notify_fork(io_context::fork_event ev)
-{
-#if !defined(ASIO_NO_DEPRECATED)
- fork_service(ev);
-#else // !defined(ASIO_NO_DEPRECATED)
- (void)ev;
-#endif // !defined(ASIO_NO_DEPRECATED)
-}
-
-#if !defined(ASIO_NO_DEPRECATED)
-void io_context::service::fork_service(io_context::fork_event)
-{
-}
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_IO_CONTEXT_IPP
diff --git a/lib/asio/impl/post.hpp b/lib/asio/impl/post.hpp
deleted file mode 100644
index 5538953..0000000
--- a/lib/asio/impl/post.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// impl/post.hpp
-// ~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_POST_HPP
-#define ASIO_IMPL_POST_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/detail/work_dispatcher.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
- ASIO_MOVE_ARG(CompletionToken) token)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_executor<handler>::type ex(
- (get_associated_executor)(init.completion_handler));
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.post(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename Executor, typename CompletionToken>
-ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
- const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_executor<Executor>::value>::type*)
-{
- typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler;
-
- async_completion<CompletionToken, void()> init(token);
-
- typename associated_allocator<handler>::type alloc(
- (get_associated_allocator)(init.completion_handler));
-
- ex.post(detail::work_dispatcher<handler>(init.completion_handler), alloc);
-
- return init.result.get();
-}
-
-template <typename ExecutionContext, typename CompletionToken>
-inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
- ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token,
- typename enable_if<is_convertible<
- ExecutionContext&, execution_context&>::value>::type*)
-{
- return (post)(ctx.get_executor(),
- ASIO_MOVE_CAST(CompletionToken)(token));
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_POST_HPP
diff --git a/lib/asio/impl/read.hpp b/lib/asio/impl/read.hpp
deleted file mode 100644
index 603a7a9..0000000
--- a/lib/asio/impl/read.hpp
+++ /dev/null
@@ -1,715 +0,0 @@
-//
-// impl/read.hpp
-// ~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_READ_HPP
-#define ASIO_IMPL_READ_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include <algorithm>
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/buffer.hpp"
-#include "asio/completion_condition.hpp"
-#include "asio/detail/array_fwd.hpp"
-#include "asio/detail/base_from_completion_cond.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/consuming_buffers.hpp"
-#include "asio/detail/dependent_type.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/throw_error.hpp"
-#include "asio/error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-namespace detail
-{
- template <typename SyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition>
- std::size_t read_buffer_sequence(SyncReadStream& s,
- const MutableBufferSequence& buffers, const MutableBufferIterator&,
- CompletionCondition completion_condition, asio::error_code& ec)
- {
- ec = asio::error_code();
- asio::detail::consuming_buffers<mutable_buffer,
- MutableBufferSequence, MutableBufferIterator> tmp(buffers);
- while (!tmp.empty())
- {
- if (std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, tmp.total_consumed())))
- tmp.consume(s.read_some(tmp.prepare(max_size), ec));
- else
- break;
- }
- return tmp.total_consumed();;
- }
-} // namespace detail
-
-template <typename SyncReadStream, typename MutableBufferSequence,
- typename CompletionCondition>
-std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition, asio::error_code& ec,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- return detail::read_buffer_sequence(s, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition, ec);
-}
-
-template <typename SyncReadStream, typename MutableBufferSequence>
-inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read(s, buffers, transfer_all(), ec);
- asio::detail::throw_error(ec, "read");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream, typename MutableBufferSequence>
-inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
- asio::error_code& ec,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- return read(s, buffers, transfer_all(), ec);
-}
-
-template <typename SyncReadStream, typename MutableBufferSequence,
- typename CompletionCondition>
-inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read(s, buffers, completion_condition, ec);
- asio::detail::throw_error(ec, "read");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream, typename DynamicBuffer,
- typename CompletionCondition>
-std::size_t read(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition, asio::error_code& ec,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- ec = asio::error_code();
- std::size_t total_transferred = 0;
- std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, total_transferred));
- std::size_t bytes_available = std::min<std::size_t>(
- std::max<std::size_t>(512, b.capacity() - b.size()),
- std::min<std::size_t>(max_size, b.max_size() - b.size()));
- while (bytes_available > 0)
- {
- std::size_t bytes_transferred = s.read_some(b.prepare(bytes_available), ec);
- b.commit(bytes_transferred);
- total_transferred += bytes_transferred;
- max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, total_transferred));
- bytes_available = std::min<std::size_t>(
- std::max<std::size_t>(512, b.capacity() - b.size()),
- std::min<std::size_t>(max_size, b.max_size() - b.size()));
- }
- return total_transferred;
-}
-
-template <typename SyncReadStream, typename DynamicBuffer>
-inline std::size_t read(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec);
- asio::detail::throw_error(ec, "read");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream, typename DynamicBuffer>
-inline std::size_t read(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- asio::error_code& ec,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- return read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- transfer_all(), ec);
-}
-
-template <typename SyncReadStream, typename DynamicBuffer,
- typename CompletionCondition>
-inline std::size_t read(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- completion_condition, ec);
- asio::detail::throw_error(ec, "read");
- return bytes_transferred;
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename SyncReadStream, typename Allocator,
- typename CompletionCondition>
-inline std::size_t read(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- return read(s, basic_streambuf_ref<Allocator>(b), completion_condition, ec);
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b)
-{
- return read(s, basic_streambuf_ref<Allocator>(b));
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- asio::error_code& ec)
-{
- return read(s, basic_streambuf_ref<Allocator>(b), ec);
-}
-
-template <typename SyncReadStream, typename Allocator,
- typename CompletionCondition>
-inline std::size_t read(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition)
-{
- return read(s, basic_streambuf_ref<Allocator>(b), completion_condition);
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-namespace detail
-{
- template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler>
- class read_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- read_op(AsyncReadStream& stream, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition, ReadHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- stream_(stream),
- buffers_(buffers),
- start_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_op(const read_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- read_op(read_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- do
- {
- stream_.async_read_some(buffers_.prepare(max_size),
- ASIO_MOVE_CAST(read_op)(*this));
- return; default:
- buffers_.consume(bytes_transferred);
- if ((!ec && bytes_transferred == 0) || buffers_.empty())
- break;
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- } while (max_size > 0);
-
- handler_(ec, buffers_.total_consumed());
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- asio::detail::consuming_buffers<mutable_buffer,
- MutableBufferSequence, MutableBufferIterator> buffers_;
- int start_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler>
- inline void start_read_buffer_sequence_op(AsyncReadStream& stream,
- const MutableBufferSequence& buffers, const MutableBufferIterator&,
- CompletionCondition completion_condition, ReadHandler& handler)
- {
- detail::read_op<AsyncReadStream, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>(
- stream, buffers, completion_condition, handler)(
- asio::error_code(), 0, 1);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_op<AsyncReadStream, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_op<AsyncReadStream, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition,
- typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_op<AsyncReadStream, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_op<AsyncReadStream, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename MutableBufferSequence,
- typename CompletionCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_read_buffer_sequence_op(s, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition,
- init.completion_handler);
-
- return init.result.get();
-}
-
-template <typename AsyncReadStream, typename MutableBufferSequence,
- typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
- ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<
- is_mutable_buffer_sequence<MutableBufferSequence>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_read_buffer_sequence_op(s, buffers,
- asio::buffer_sequence_begin(buffers), transfer_all(),
- init.completion_handler);
-
- return init.result.get();
-}
-
-namespace detail
-{
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler>
- class read_dynbuf_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- template <typename BufferSequence>
- read_dynbuf_op(AsyncReadStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- CompletionCondition completion_condition, ReadHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- start_(0),
- total_transferred_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_dynbuf_op(const read_dynbuf_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(other.buffers_),
- start_(other.start_),
- total_transferred_(other.total_transferred_),
- handler_(other.handler_)
- {
- }
-
- read_dynbuf_op(read_dynbuf_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- start_(other.start_),
- total_transferred_(other.total_transferred_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size, bytes_available;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, total_transferred_);
- bytes_available = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(max_size,
- buffers_.max_size() - buffers_.size()));
- for (;;)
- {
- stream_.async_read_some(buffers_.prepare(bytes_available),
- ASIO_MOVE_CAST(read_dynbuf_op)(*this));
- return; default:
- total_transferred_ += bytes_transferred;
- buffers_.commit(bytes_transferred);
- max_size = this->check_for_completion(ec, total_transferred_);
- bytes_available = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(max_size,
- buffers_.max_size() - buffers_.size()));
- if ((!ec && bytes_transferred == 0) || bytes_available == 0)
- break;
- }
-
- handler_(ec, static_cast<const std::size_t&>(total_transferred_));
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- DynamicBuffer buffers_;
- int start_;
- std::size_t total_transferred_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_dynbuf_op<AsyncReadStream, DynamicBuffer,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_dynbuf_op<AsyncReadStream, DynamicBuffer,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_dynbuf_op<AsyncReadStream, DynamicBuffer,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename CompletionCondition,
- typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_dynbuf_op<AsyncReadStream, DynamicBuffer,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename CompletionCondition,
- typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_dynbuf_op<AsyncReadStream, DynamicBuffer,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_dynbuf_op<AsyncReadStream,
- DynamicBuffer, CompletionCondition, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_dynbuf_op<AsyncReadStream,
- DynamicBuffer, CompletionCondition, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_dynbuf_op<AsyncReadStream,
- DynamicBuffer, CompletionCondition, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_dynbuf_op<AsyncReadStream,
- DynamicBuffer, CompletionCondition, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- return async_read(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- transfer_all(), ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename CompletionCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_dynbuf_op<AsyncReadStream,
- typename decay<DynamicBuffer>::type,
- CompletionCondition, ASIO_HANDLER_TYPE(
- ReadHandler, void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- completion_condition, init.completion_handler)(
- asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- return async_read(s, basic_streambuf_ref<Allocator>(b),
- ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-template <typename AsyncReadStream, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- return async_read(s, basic_streambuf_ref<Allocator>(b),
- completion_condition, ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_READ_HPP
diff --git a/lib/asio/impl/read_at.hpp b/lib/asio/impl/read_at.hpp
deleted file mode 100644
index d736d4d..0000000
--- a/lib/asio/impl/read_at.hpp
+++ /dev/null
@@ -1,640 +0,0 @@
-//
-// impl/read_at.hpp
-// ~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_READ_AT_HPP
-#define ASIO_IMPL_READ_AT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include <algorithm>
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/buffer.hpp"
-#include "asio/completion_condition.hpp"
-#include "asio/detail/array_fwd.hpp"
-#include "asio/detail/base_from_completion_cond.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/consuming_buffers.hpp"
-#include "asio/detail/dependent_type.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/throw_error.hpp"
-#include "asio/error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-namespace detail
-{
- template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
- typename MutableBufferIterator, typename CompletionCondition>
- std::size_t read_at_buffer_sequence(SyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- const MutableBufferIterator&, CompletionCondition completion_condition,
- asio::error_code& ec)
- {
- ec = asio::error_code();
- asio::detail::consuming_buffers<mutable_buffer,
- MutableBufferSequence, MutableBufferIterator> tmp(buffers);
- while (!tmp.empty())
- {
- if (std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, tmp.total_consumed())))
- {
- tmp.consume(d.read_some_at(offset + tmp.total_consumed(),
- tmp.prepare(max_size), ec));
- }
- else
- break;
- }
- return tmp.total_consumed();;
- }
-} // namespace detail
-
-template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
- typename CompletionCondition>
-std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- return detail::read_at_buffer_sequence(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition, ec);
-}
-
-template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_at(
- d, offset, buffers, transfer_all(), ec);
- asio::detail::throw_error(ec, "read_at");
- return bytes_transferred;
-}
-
-template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- asio::error_code& ec)
-{
- return read_at(d, offset, buffers, transfer_all(), ec);
-}
-
-template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
- typename CompletionCondition>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_at(
- d, offset, buffers, completion_condition, ec);
- asio::detail::throw_error(ec, "read_at");
- return bytes_transferred;
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename SyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition>
-std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- ec = asio::error_code();
- std::size_t total_transferred = 0;
- std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, total_transferred));
- std::size_t bytes_available = read_size_helper(b, max_size);
- while (bytes_available > 0)
- {
- std::size_t bytes_transferred = d.read_some_at(
- offset + total_transferred, b.prepare(bytes_available), ec);
- b.commit(bytes_transferred);
- total_transferred += bytes_transferred;
- max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, total_transferred));
- bytes_available = read_size_helper(b, max_size);
- }
- return total_transferred;
-}
-
-template <typename SyncRandomAccessReadDevice, typename Allocator>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_at(
- d, offset, b, transfer_all(), ec);
- asio::detail::throw_error(ec, "read_at");
- return bytes_transferred;
-}
-
-template <typename SyncRandomAccessReadDevice, typename Allocator>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- asio::error_code& ec)
-{
- return read_at(d, offset, b, transfer_all(), ec);
-}
-
-template <typename SyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition>
-inline std::size_t read_at(SyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_at(
- d, offset, b, completion_condition, ec);
- asio::detail::throw_error(ec, "read_at");
- return bytes_transferred;
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-namespace detail
-{
- template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- class read_at_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- read_at_op(AsyncRandomAccessReadDevice& device,
- uint64_t offset, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition, ReadHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- device_(device),
- offset_(offset),
- buffers_(buffers),
- start_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_at_op(const read_at_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- read_at_op(read_at_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- do
- {
- device_.async_read_some_at(
- offset_ + buffers_.total_consumed(), buffers_.prepare(max_size),
- ASIO_MOVE_CAST(read_at_op)(*this));
- return; default:
- buffers_.consume(bytes_transferred);
- if ((!ec && bytes_transferred == 0) || buffers_.empty())
- break;
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- } while (max_size > 0);
-
- handler_(ec, buffers_.total_consumed());
- }
- }
-
- //private:
- AsyncRandomAccessReadDevice& device_;
- uint64_t offset_;
- asio::detail::consuming_buffers<mutable_buffer,
- MutableBufferSequence, MutableBufferIterator> buffers_;
- int start_;
- ReadHandler handler_;
- };
-
- template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler>
- inline void start_read_at_buffer_sequence_op(AsyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- const MutableBufferIterator&, CompletionCondition completion_condition,
- ReadHandler& handler)
- {
- detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>(
- d, offset, buffers, completion_condition, handler)(
- asio::error_code(), 0, 1);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_at_op<AsyncRandomAccessReadDevice,
- MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncRandomAccessReadDevice,
- typename MutableBufferSequence, typename MutableBufferIterator,
- typename CompletionCondition, typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
- MutableBufferIterator, CompletionCondition, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_at_op<AsyncRandomAccessReadDevice,
- MutableBufferSequence, MutableBufferIterator,
- CompletionCondition, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
- typename CompletionCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_at(AsyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_read_at_buffer_sequence_op(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition,
- init.completion_handler);
-
- return init.result.get();
-}
-
-template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
- typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_at(AsyncRandomAccessReadDevice& d,
- uint64_t offset, const MutableBufferSequence& buffers,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_read_at_buffer_sequence_op(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), transfer_all(),
- init.completion_handler);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-namespace detail
-{
- template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
- class read_at_streambuf_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- read_at_streambuf_op(AsyncRandomAccessReadDevice& device,
- uint64_t offset, basic_streambuf<Allocator>& streambuf,
- CompletionCondition completion_condition, ReadHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- device_(device),
- offset_(offset),
- streambuf_(streambuf),
- start_(0),
- total_transferred_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_at_streambuf_op(const read_at_streambuf_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- streambuf_(other.streambuf_),
- start_(other.start_),
- total_transferred_(other.total_transferred_),
- handler_(other.handler_)
- {
- }
-
- read_at_streambuf_op(read_at_streambuf_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- streambuf_(other.streambuf_),
- start_(other.start_),
- total_transferred_(other.total_transferred_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size, bytes_available;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, total_transferred_);
- bytes_available = read_size_helper(streambuf_, max_size);
- for (;;)
- {
- device_.async_read_some_at(offset_ + total_transferred_,
- streambuf_.prepare(bytes_available),
- ASIO_MOVE_CAST(read_at_streambuf_op)(*this));
- return; default:
- total_transferred_ += bytes_transferred;
- streambuf_.commit(bytes_transferred);
- max_size = this->check_for_completion(ec, total_transferred_);
- bytes_available = read_size_helper(streambuf_, max_size);
- if ((!ec && bytes_transferred == 0) || bytes_available == 0)
- break;
- }
-
- handler_(ec, static_cast<const std::size_t&>(total_transferred_));
- }
- }
-
- //private:
- AsyncRandomAccessReadDevice& device_;
- uint64_t offset_;
- asio::basic_streambuf<Allocator>& streambuf_;
- int start_;
- std::size_t total_transferred_;
- ReadHandler handler_;
- };
-
- template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessReadDevice,
- typename Allocator, typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessReadDevice,
- typename Allocator, typename CompletionCondition, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler, typename Allocator1>
-struct associated_allocator<
- detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
- Allocator, CompletionCondition, ReadHandler>,
- Allocator1>
-{
- typedef typename associated_allocator<ReadHandler, Allocator1>::type type;
-
- static type get(
- const detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
- Allocator, CompletionCondition, ReadHandler>& h,
- const Allocator1& a = Allocator1()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator1>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncRandomAccessReadDevice, typename Executor,
- typename CompletionCondition, typename ReadHandler, typename Executor1>
-struct associated_executor<
- detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
- Executor, CompletionCondition, ReadHandler>,
- Executor1>
-{
- typedef typename associated_executor<ReadHandler, Executor1>::type type;
-
- static type get(
- const detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
- Executor, CompletionCondition, ReadHandler>& h,
- const Executor1& ex = Executor1()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor1>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename CompletionCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_at(AsyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- CompletionCondition, ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- d, offset, b, completion_condition, init.completion_handler)(
- asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-template <typename AsyncRandomAccessReadDevice, typename Allocator,
- typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_at(AsyncRandomAccessReadDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
- detail::transfer_all_t, ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- d, offset, b, transfer_all(), init.completion_handler)(
- asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_READ_AT_HPP
diff --git a/lib/asio/impl/read_until.hpp b/lib/asio/impl/read_until.hpp
deleted file mode 100644
index 1f39e19..0000000
--- a/lib/asio/impl/read_until.hpp
+++ /dev/null
@@ -1,1500 +0,0 @@
-//
-// impl/read_until.hpp
-// ~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_READ_UNTIL_HPP
-#define ASIO_IMPL_READ_UNTIL_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include <algorithm>
-#include <string>
-#include <vector>
-#include <utility>
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/buffer.hpp"
-#include "asio/buffers_iterator.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/limits.hpp"
-#include "asio/detail/throw_error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-template <typename SyncReadStream, typename DynamicBuffer>
-inline std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_until(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec);
- asio::detail::throw_error(ec, "read_until");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream, typename DynamicBuffer>
-std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- char delim, asio::error_code& ec)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- std::size_t search_position = 0;
- for (;;)
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = b.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- iterator iter = std::find(start_pos, end, delim);
- if (iter != end)
- {
- // Found a match. We're done.
- ec = asio::error_code();
- return iter - begin + 1;
- }
- else
- {
- // No match. Next search can start with the new data.
- search_position = end - begin;
- }
-
- // Check if buffer is full.
- if (b.size() == b.max_size())
- {
- ec = error::not_found;
- return 0;
- }
-
- // Need more data.
- std::size_t bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512, b.capacity() - b.size()),
- std::min<std::size_t>(65536, b.max_size() - b.size()));
- b.commit(s.read_some(b.prepare(bytes_to_read), ec));
- if (ec)
- return 0;
- }
-}
-
-template <typename SyncReadStream, typename DynamicBuffer>
-inline std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- ASIO_STRING_VIEW_PARAM delim)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_until(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec);
- asio::detail::throw_error(ec, "read_until");
- return bytes_transferred;
-}
-
-namespace detail
-{
- // Algorithm that finds a subsequence of equal values in a sequence. Returns
- // (iterator,true) if a full match was found, in which case the iterator
- // points to the beginning of the match. Returns (iterator,false) if a
- // partial match was found at the end of the first sequence, in which case
- // the iterator points to the beginning of the partial match. Returns
- // (last1,false) if no full or partial match was found.
- template <typename Iterator1, typename Iterator2>
- std::pair<Iterator1, bool> partial_search(
- Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
- {
- for (Iterator1 iter1 = first1; iter1 != last1; ++iter1)
- {
- Iterator1 test_iter1 = iter1;
- Iterator2 test_iter2 = first2;
- for (;; ++test_iter1, ++test_iter2)
- {
- if (test_iter2 == last2)
- return std::make_pair(iter1, true);
- if (test_iter1 == last1)
- {
- if (test_iter2 != first2)
- return std::make_pair(iter1, false);
- else
- break;
- }
- if (*test_iter1 != *test_iter2)
- break;
- }
- }
- return std::make_pair(last1, false);
- }
-} // namespace detail
-
-template <typename SyncReadStream, typename DynamicBuffer>
-std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- std::size_t search_position = 0;
- for (;;)
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = b.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- std::pair<iterator, bool> result = detail::partial_search(
- start_pos, end, delim.begin(), delim.end());
- if (result.first != end)
- {
- if (result.second)
- {
- // Full match. We're done.
- ec = asio::error_code();
- return result.first - begin + delim.length();
- }
- else
- {
- // Partial match. Next search needs to start from beginning of match.
- search_position = result.first - begin;
- }
- }
- else
- {
- // No match. Next search can start with the new data.
- search_position = end - begin;
- }
-
- // Check if buffer is full.
- if (b.size() == b.max_size())
- {
- ec = error::not_found;
- return 0;
- }
-
- // Need more data.
- std::size_t bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512, b.capacity() - b.size()),
- std::min<std::size_t>(65536, b.max_size() - b.size()));
- b.commit(s.read_some(b.prepare(bytes_to_read), ec));
- if (ec)
- return 0;
- }
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename SyncReadStream, typename DynamicBuffer>
-inline std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- const boost::regex& expr)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_until(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers), expr, ec);
- asio::detail::throw_error(ec, "read_until");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream, typename DynamicBuffer>
-std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- const boost::regex& expr, asio::error_code& ec)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- std::size_t search_position = 0;
- for (;;)
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = b.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- boost::match_results<iterator,
- typename std::vector<boost::sub_match<iterator> >::allocator_type>
- match_results;
- if (regex_search(start_pos, end, match_results, expr,
- boost::match_default | boost::match_partial))
- {
- if (match_results[0].matched)
- {
- // Full match. We're done.
- ec = asio::error_code();
- return match_results[0].second - begin;
- }
- else
- {
- // Partial match. Next search needs to start from beginning of match.
- search_position = match_results[0].first - begin;
- }
- }
- else
- {
- // No match. Next search can start with the new data.
- search_position = end - begin;
- }
-
- // Check if buffer is full.
- if (b.size() == b.max_size())
- {
- ec = error::not_found;
- return 0;
- }
-
- // Need more data.
- std::size_t bytes_to_read = read_size_helper(b, 65536);
- b.commit(s.read_some(b.prepare(bytes_to_read), ec));
- if (ec)
- return 0;
- }
-}
-
-#endif // defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename SyncReadStream,
- typename DynamicBuffer, typename MatchCondition>
-inline std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- MatchCondition match_condition,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = read_until(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- match_condition, ec);
- asio::detail::throw_error(ec, "read_until");
- return bytes_transferred;
-}
-
-template <typename SyncReadStream,
- typename DynamicBuffer, typename MatchCondition>
-std::size_t read_until(SyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- MatchCondition match_condition, asio::error_code& ec,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- std::size_t search_position = 0;
- for (;;)
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = b.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- std::pair<iterator, bool> result = match_condition(start_pos, end);
- if (result.second)
- {
- // Full match. We're done.
- ec = asio::error_code();
- return result.first - begin;
- }
- else if (result.first != end)
- {
- // Partial match. Next search needs to start from beginning of match.
- search_position = result.first - begin;
- }
- else
- {
- // No match. Next search can start with the new data.
- search_position = end - begin;
- }
-
- // Check if buffer is full.
- if (b.size() == b.max_size())
- {
- ec = error::not_found;
- return 0;
- }
-
- // Need more data.
- std::size_t bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512, b.capacity() - b.size()),
- std::min<std::size_t>(65536, b.max_size() - b.size()));
- b.commit(s.read_some(b.prepare(bytes_to_read), ec));
- if (ec)
- return 0;
- }
-}
-
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, char delim)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), delim);
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, char delim,
- asio::error_code& ec)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), delim, ec);
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- ASIO_STRING_VIEW_PARAM delim)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), delim);
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), delim, ec);
-}
-
-#if defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, const boost::regex& expr)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), expr);
-}
-
-template <typename SyncReadStream, typename Allocator>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, const boost::regex& expr,
- asio::error_code& ec)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), expr, ec);
-}
-
-#endif // defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename SyncReadStream, typename Allocator, typename MatchCondition>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, MatchCondition match_condition,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), match_condition);
-}
-
-template <typename SyncReadStream, typename Allocator, typename MatchCondition>
-inline std::size_t read_until(SyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- MatchCondition match_condition, asio::error_code& ec,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- return read_until(s, basic_streambuf_ref<Allocator>(b), match_condition, ec);
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-namespace detail
-{
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- class read_until_delim_op
- {
- public:
- template <typename BufferSequence>
- read_until_delim_op(AsyncReadStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- char delim, ReadHandler& handler)
- : stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- delim_(delim),
- start_(0),
- search_position_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_until_delim_op(const read_until_delim_op& other)
- : stream_(other.stream_),
- buffers_(other.buffers_),
- delim_(other.delim_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(other.handler_)
- {
- }
-
- read_until_delim_op(read_until_delim_op&& other)
- : stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- delim_(other.delim_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
- std::size_t bytes_to_read;
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type
- buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = buffers_.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position_;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- iterator iter = std::find(start_pos, end, delim_);
- if (iter != end)
- {
- // Found a match. We're done.
- search_position_ = iter - begin + 1;
- bytes_to_read = 0;
- }
-
- // No match yet. Check if buffer is full.
- else if (buffers_.size() == buffers_.max_size())
- {
- search_position_ = not_found;
- bytes_to_read = 0;
- }
-
- // Need to read some more data.
- else
- {
- // Next search can start with the new data.
- search_position_ = end - begin;
- bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(65536,
- buffers_.max_size() - buffers_.size()));
- }
- }
-
- // Check if we're done.
- if (!start && bytes_to_read == 0)
- break;
-
- // Start a new asynchronous read operation to obtain more data.
- stream_.async_read_some(buffers_.prepare(bytes_to_read),
- ASIO_MOVE_CAST(read_until_delim_op)(*this));
- return; default:
- buffers_.commit(bytes_transferred);
- if (ec || bytes_transferred == 0)
- break;
- }
-
- const asio::error_code result_ec =
- (search_position_ == not_found)
- ? error::not_found : ec;
-
- const std::size_t result_n =
- (ec || search_position_ == not_found)
- ? 0 : search_position_;
-
- handler_(result_ec, result_n);
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- DynamicBuffer buffers_;
- char delim_;
- int start_;
- std::size_t search_position_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_until_delim_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- char delim, ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_until_delim_op<AsyncReadStream,
- typename decay<DynamicBuffer>::type,
- ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- delim, init.completion_handler)(asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-namespace detail
-{
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- class read_until_delim_string_op
- {
- public:
- template <typename BufferSequence>
- read_until_delim_string_op(AsyncReadStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- const std::string& delim, ReadHandler& handler)
- : stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- delim_(delim),
- start_(0),
- search_position_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_until_delim_string_op(const read_until_delim_string_op& other)
- : stream_(other.stream_),
- buffers_(other.buffers_),
- delim_(other.delim_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(other.handler_)
- {
- }
-
- read_until_delim_string_op(read_until_delim_string_op&& other)
- : stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- delim_(ASIO_MOVE_CAST(std::string)(other.delim_)),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
- std::size_t bytes_to_read;
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type
- buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = buffers_.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position_;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- std::pair<iterator, bool> result = detail::partial_search(
- start_pos, end, delim_.begin(), delim_.end());
- if (result.first != end && result.second)
- {
- // Full match. We're done.
- search_position_ = result.first - begin + delim_.length();
- bytes_to_read = 0;
- }
-
- // No match yet. Check if buffer is full.
- else if (buffers_.size() == buffers_.max_size())
- {
- search_position_ = not_found;
- bytes_to_read = 0;
- }
-
- // Need to read some more data.
- else
- {
- if (result.first != end)
- {
- // Partial match. Next search needs to start from beginning of
- // match.
- search_position_ = result.first - begin;
- }
- else
- {
- // Next search can start with the new data.
- search_position_ = end - begin;
- }
-
- bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(65536,
- buffers_.max_size() - buffers_.size()));
- }
- }
-
- // Check if we're done.
- if (!start && bytes_to_read == 0)
- break;
-
- // Start a new asynchronous read operation to obtain more data.
- stream_.async_read_some(buffers_.prepare(bytes_to_read),
- ASIO_MOVE_CAST(read_until_delim_string_op)(*this));
- return; default:
- buffers_.commit(bytes_transferred);
- if (ec || bytes_transferred == 0)
- break;
- }
-
- const asio::error_code result_ec =
- (search_position_ == not_found)
- ? error::not_found : ec;
-
- const std::size_t result_n =
- (ec || search_position_ == not_found)
- ? 0 : search_position_;
-
- handler_(result_ec, result_n);
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- DynamicBuffer buffers_;
- std::string delim_;
- int start_;
- std::size_t search_position_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_until_delim_string_op<AsyncReadStream,
- DynamicBuffer, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- ASIO_STRING_VIEW_PARAM delim,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_until_delim_string_op<AsyncReadStream,
- typename decay<DynamicBuffer>::type,
- ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- static_cast<std::string>(delim),
- init.completion_handler)(asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if defined(ASIO_HAS_BOOST_REGEX)
-
-namespace detail
-{
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler>
- class read_until_expr_op
- {
- public:
- template <typename BufferSequence>
- read_until_expr_op(AsyncReadStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- const boost::regex& expr, ReadHandler& handler)
- : stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- expr_(expr),
- start_(0),
- search_position_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_until_expr_op(const read_until_expr_op& other)
- : stream_(other.stream_),
- buffers_(other.buffers_),
- expr_(other.expr_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(other.handler_)
- {
- }
-
- read_until_expr_op(read_until_expr_op&& other)
- : stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- expr_(other.expr_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
- std::size_t bytes_to_read;
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type
- buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = buffers_.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position_;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- boost::match_results<iterator,
- typename std::vector<boost::sub_match<iterator> >::allocator_type>
- match_results;
- bool match = regex_search(start_pos, end, match_results, expr_,
- boost::match_default | boost::match_partial);
- if (match && match_results[0].matched)
- {
- // Full match. We're done.
- search_position_ = match_results[0].second - begin;
- bytes_to_read = 0;
- }
-
- // No match yet. Check if buffer is full.
- else if (buffers_.size() == buffers_.max_size())
- {
- search_position_ = not_found;
- bytes_to_read = 0;
- }
-
- // Need to read some more data.
- else
- {
- if (match)
- {
- // Partial match. Next search needs to start from beginning of
- // match.
- search_position_ = match_results[0].first - begin;
- }
- else
- {
- // Next search can start with the new data.
- search_position_ = end - begin;
- }
-
- bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(65536,
- buffers_.max_size() - buffers_.size()));
- }
- }
-
- // Check if we're done.
- if (!start && bytes_to_read == 0)
- break;
-
- // Start a new asynchronous read operation to obtain more data.
- stream_.async_read_some(buffers_.prepare(bytes_to_read),
- ASIO_MOVE_CAST(read_until_expr_op)(*this));
- return; default:
- buffers_.commit(bytes_transferred);
- if (ec || bytes_transferred == 0)
- break;
- }
-
- const asio::error_code result_ec =
- (search_position_ == not_found)
- ? error::not_found : ec;
-
- const std::size_t result_n =
- (ec || search_position_ == not_found)
- ? 0 : search_position_;
-
- handler_(result_ec, result_n);
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- DynamicBuffer buffers_;
- RegEx expr_;
- int start_;
- std::size_t search_position_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename RegEx, typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename RegEx, typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename RegEx, typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_until_expr_op<AsyncReadStream,
- DynamicBuffer, RegEx, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream,
- typename DynamicBuffer, typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- const boost::regex& expr,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_until_expr_op<AsyncReadStream,
- typename decay<DynamicBuffer>::type,
- boost::regex, ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- expr, init.completion_handler)(asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#endif // defined(ASIO_HAS_BOOST_REGEX)
-
-namespace detail
-{
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler>
- class read_until_match_op
- {
- public:
- template <typename BufferSequence>
- read_until_match_op(AsyncReadStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- MatchCondition match_condition, ReadHandler& handler)
- : stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- match_condition_(match_condition),
- start_(0),
- search_position_(0),
- handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- read_until_match_op(const read_until_match_op& other)
- : stream_(other.stream_),
- buffers_(other.buffers_),
- match_condition_(other.match_condition_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(other.handler_)
- {
- }
-
- read_until_match_op(read_until_match_op&& other)
- : stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- match_condition_(other.match_condition_),
- start_(other.start_),
- search_position_(other.search_position_),
- handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
- std::size_t bytes_to_read;
- switch (start_ = start)
- {
- case 1:
- for (;;)
- {
- {
- // Determine the range of the data to be searched.
- typedef typename DynamicBuffer::const_buffers_type
- buffers_type;
- typedef buffers_iterator<buffers_type> iterator;
- buffers_type data_buffers = buffers_.data();
- iterator begin = iterator::begin(data_buffers);
- iterator start_pos = begin + search_position_;
- iterator end = iterator::end(data_buffers);
-
- // Look for a match.
- std::pair<iterator, bool> result = match_condition_(start_pos, end);
- if (result.second)
- {
- // Full match. We're done.
- search_position_ = result.first - begin;
- bytes_to_read = 0;
- }
-
- // No match yet. Check if buffer is full.
- else if (buffers_.size() == buffers_.max_size())
- {
- search_position_ = not_found;
- bytes_to_read = 0;
- }
-
- // Need to read some more data.
- else
- {
- if (result.first != end)
- {
- // Partial match. Next search needs to start from beginning of
- // match.
- search_position_ = result.first - begin;
- }
- else
- {
- // Next search can start with the new data.
- search_position_ = end - begin;
- }
-
- bytes_to_read = std::min<std::size_t>(
- std::max<std::size_t>(512,
- buffers_.capacity() - buffers_.size()),
- std::min<std::size_t>(65536,
- buffers_.max_size() - buffers_.size()));
- }
- }
-
- // Check if we're done.
- if (!start && bytes_to_read == 0)
- break;
-
- // Start a new asynchronous read operation to obtain more data.
- stream_.async_read_some(buffers_.prepare(bytes_to_read),
- ASIO_MOVE_CAST(read_until_match_op)(*this));
- return; default:
- buffers_.commit(bytes_transferred);
- if (ec || bytes_transferred == 0)
- break;
- }
-
- const asio::error_code result_ec =
- (search_position_ == not_found)
- ? error::not_found : ec;
-
- const std::size_t result_n =
- (ec || search_position_ == not_found)
- ? 0 : search_position_;
-
- handler_(result_ec, result_n);
- }
- }
-
- //private:
- AsyncReadStream& stream_;
- DynamicBuffer buffers_;
- MatchCondition match_condition_;
- int start_;
- std::size_t search_position_;
- ReadHandler handler_;
- };
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler>
- inline void* asio_handler_allocate(std::size_t size,
- read_until_match_op<AsyncReadStream, DynamicBuffer,
- MatchCondition, ReadHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- read_until_match_op<AsyncReadStream, DynamicBuffer,
- MatchCondition, ReadHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler>
- inline bool asio_handler_is_continuation(
- read_until_match_op<AsyncReadStream, DynamicBuffer,
- MatchCondition, ReadHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename MatchCondition,
- typename ReadHandler>
- inline void asio_handler_invoke(Function& function,
- read_until_match_op<AsyncReadStream, DynamicBuffer,
- MatchCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncReadStream,
- typename DynamicBuffer, typename MatchCondition,
- typename ReadHandler>
- inline void asio_handler_invoke(const Function& function,
- read_until_match_op<AsyncReadStream, DynamicBuffer,
- MatchCondition, ReadHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler, typename Allocator>
-struct associated_allocator<
- detail::read_until_match_op<AsyncReadStream,
- DynamicBuffer, MatchCondition, ReadHandler>,
- Allocator>
-{
- typedef typename associated_allocator<ReadHandler, Allocator>::type type;
-
- static type get(
- const detail::read_until_match_op<AsyncReadStream,
- DynamicBuffer, MatchCondition, ReadHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<ReadHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler, typename Executor>
-struct associated_executor<
- detail::read_until_match_op<AsyncReadStream,
- DynamicBuffer, MatchCondition, ReadHandler>,
- Executor>
-{
- typedef typename associated_executor<ReadHandler, Executor>::type type;
-
- static type get(
- const detail::read_until_match_op<AsyncReadStream,
- DynamicBuffer, MatchCondition, ReadHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<ReadHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncReadStream, typename DynamicBuffer,
- typename MatchCondition, typename ReadHandler>
-ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a ReadHandler.
- ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
-
- async_completion<ReadHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::read_until_match_op<AsyncReadStream,
- typename decay<DynamicBuffer>::type,
- MatchCondition, ASIO_HANDLER_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- match_condition, init.completion_handler)(
- asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- char delim, ASIO_MOVE_ARG(ReadHandler) handler)
-{
- return async_read_until(s, basic_streambuf_ref<Allocator>(b),
- delim, ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- ASIO_STRING_VIEW_PARAM delim,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- return async_read_until(s, basic_streambuf_ref<Allocator>(b),
- delim, ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-#if defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- asio::basic_streambuf<Allocator>& b, const boost::regex& expr,
- ASIO_MOVE_ARG(ReadHandler) handler)
-{
- return async_read_until(s, basic_streambuf_ref<Allocator>(b),
- expr, ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-#endif // defined(ASIO_HAS_BOOST_REGEX)
-
-template <typename AsyncReadStream, typename Allocator,
- typename MatchCondition, typename ReadHandler>
-inline ASIO_INITFN_RESULT_TYPE(ReadHandler,
- void (asio::error_code, std::size_t))
-async_read_until(AsyncReadStream& s,
- asio::basic_streambuf<Allocator>& b,
- MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler,
- typename enable_if<is_match_condition<MatchCondition>::value>::type*)
-{
- return async_read_until(s, basic_streambuf_ref<Allocator>(b),
- match_condition, ASIO_MOVE_CAST(ReadHandler)(handler));
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_READ_UNTIL_HPP
diff --git a/lib/asio/impl/serial_port_base.hpp b/lib/asio/impl/serial_port_base.hpp
deleted file mode 100644
index cdc201d..0000000
--- a/lib/asio/impl/serial_port_base.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// impl/serial_port_base.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SERIAL_PORT_BASE_HPP
-#define ASIO_IMPL_SERIAL_PORT_BASE_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-inline serial_port_base::baud_rate::baud_rate(unsigned int rate)
- : value_(rate)
-{
-}
-
-inline unsigned int serial_port_base::baud_rate::value() const
-{
- return value_;
-}
-
-inline serial_port_base::flow_control::type
-serial_port_base::flow_control::value() const
-{
- return value_;
-}
-
-inline serial_port_base::parity::type serial_port_base::parity::value() const
-{
- return value_;
-}
-
-inline serial_port_base::stop_bits::type
-serial_port_base::stop_bits::value() const
-{
- return value_;
-}
-
-inline unsigned int serial_port_base::character_size::value() const
-{
- return value_;
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_SERIAL_PORT_BASE_HPP
diff --git a/lib/asio/impl/serial_port_base.ipp b/lib/asio/impl/serial_port_base.ipp
deleted file mode 100644
index 21323ee..0000000
--- a/lib/asio/impl/serial_port_base.ipp
+++ /dev/null
@@ -1,557 +0,0 @@
-//
-// impl/serial_port_base.ipp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SERIAL_PORT_BASE_IPP
-#define ASIO_IMPL_SERIAL_PORT_BASE_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-
-#if defined(ASIO_HAS_SERIAL_PORT)
-
-#include <stdexcept>
-#include "asio/error.hpp"
-#include "asio/serial_port_base.hpp"
-#include "asio/detail/throw_exception.hpp"
-
-#if defined(GENERATING_DOCUMENTATION)
-# define ASIO_OPTION_STORAGE implementation_defined
-#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
-# define ASIO_OPTION_STORAGE DCB
-#else
-# define ASIO_OPTION_STORAGE termios
-#endif
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-ASIO_SYNC_OP_VOID serial_port_base::baud_rate::store(
- ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- storage.BaudRate = value_;
-#else
- speed_t baud;
- switch (value_)
- {
- // Do POSIX-specified rates first.
- case 0: baud = B0; break;
- case 50: baud = B50; break;
- case 75: baud = B75; break;
- case 110: baud = B110; break;
- case 134: baud = B134; break;
- case 150: baud = B150; break;
- case 200: baud = B200; break;
- case 300: baud = B300; break;
- case 600: baud = B600; break;
- case 1200: baud = B1200; break;
- case 1800: baud = B1800; break;
- case 2400: baud = B2400; break;
- case 4800: baud = B4800; break;
- case 9600: baud = B9600; break;
- case 19200: baud = B19200; break;
- case 38400: baud = B38400; break;
- // And now the extended ones conditionally.
-# ifdef B7200
- case 7200: baud = B7200; break;
-# endif
-# ifdef B14400
- case 14400: baud = B14400; break;
-# endif
-# ifdef B57600
- case 57600: baud = B57600; break;
-# endif
-# ifdef B115200
- case 115200: baud = B115200; break;
-# endif
-# ifdef B230400
- case 230400: baud = B230400; break;
-# endif
-# ifdef B460800
- case 460800: baud = B460800; break;
-# endif
-# ifdef B500000
- case 500000: baud = B500000; break;
-# endif
-# ifdef B576000
- case 576000: baud = B576000; break;
-# endif
-# ifdef B921600
- case 921600: baud = B921600; break;
-# endif
-# ifdef B1000000
- case 1000000: baud = B1000000; break;
-# endif
-# ifdef B1152000
- case 1152000: baud = B1152000; break;
-# endif
-# ifdef B2000000
- case 2000000: baud = B2000000; break;
-# endif
-# ifdef B3000000
- case 3000000: baud = B3000000; break;
-# endif
-# ifdef B3500000
- case 3500000: baud = B3500000; break;
-# endif
-# ifdef B4000000
- case 4000000: baud = B4000000; break;
-# endif
- default:
- ec = asio::error::invalid_argument;
- ASIO_SYNC_OP_VOID_RETURN(ec);
- }
-# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
- ::cfsetspeed(&storage, baud);
-# else
- ::cfsetispeed(&storage, baud);
- ::cfsetospeed(&storage, baud);
-# endif
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::baud_rate::load(
- const ASIO_OPTION_STORAGE& storage, asio::error_code& ec)
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- value_ = storage.BaudRate;
-#else
- speed_t baud = ::cfgetospeed(&storage);
- switch (baud)
- {
- // First do those specified by POSIX.
- case B0: value_ = 0; break;
- case B50: value_ = 50; break;
- case B75: value_ = 75; break;
- case B110: value_ = 110; break;
- case B134: value_ = 134; break;
- case B150: value_ = 150; break;
- case B200: value_ = 200; break;
- case B300: value_ = 300; break;
- case B600: value_ = 600; break;
- case B1200: value_ = 1200; break;
- case B1800: value_ = 1800; break;
- case B2400: value_ = 2400; break;
- case B4800: value_ = 4800; break;
- case B9600: value_ = 9600; break;
- case B19200: value_ = 19200; break;
- case B38400: value_ = 38400; break;
- // Now conditionally handle a bunch of extended rates.
-# ifdef B7200
- case B7200: value_ = 7200; break;
-# endif
-# ifdef B14400
- case B14400: value_ = 14400; break;
-# endif
-# ifdef B57600
- case B57600: value_ = 57600; break;
-# endif
-# ifdef B115200
- case B115200: value_ = 115200; break;
-# endif
-# ifdef B230400
- case B230400: value_ = 230400; break;
-# endif
-# ifdef B460800
- case B460800: value_ = 460800; break;
-# endif
-# ifdef B500000
- case B500000: value_ = 500000; break;
-# endif
-# ifdef B576000
- case B576000: value_ = 576000; break;
-# endif
-# ifdef B921600
- case B921600: value_ = 921600; break;
-# endif
-# ifdef B1000000
- case B1000000: value_ = 1000000; break;
-# endif
-# ifdef B1152000
- case B1152000: value_ = 1152000; break;
-# endif
-# ifdef B2000000
- case B2000000: value_ = 2000000; break;
-# endif
-# ifdef B3000000
- case B3000000: value_ = 3000000; break;
-# endif
-# ifdef B3500000
- case B3500000: value_ = 3500000; break;
-# endif
-# ifdef B4000000
- case B4000000: value_ = 4000000; break;
-# endif
- default:
- value_ = 0;
- ec = asio::error::invalid_argument;
- ASIO_SYNC_OP_VOID_RETURN(ec);
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-serial_port_base::flow_control::flow_control(
- serial_port_base::flow_control::type t)
- : value_(t)
-{
- if (t != none && t != software && t != hardware)
- {
- std::out_of_range ex("invalid flow_control value");
- asio::detail::throw_exception(ex);
- }
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::flow_control::store(
- ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- storage.fOutxCtsFlow = FALSE;
- storage.fOutxDsrFlow = FALSE;
- storage.fTXContinueOnXoff = TRUE;
- storage.fDtrControl = DTR_CONTROL_ENABLE;
- storage.fDsrSensitivity = FALSE;
- storage.fOutX = FALSE;
- storage.fInX = FALSE;
- storage.fRtsControl = RTS_CONTROL_ENABLE;
- switch (value_)
- {
- case none:
- break;
- case software:
- storage.fOutX = TRUE;
- storage.fInX = TRUE;
- break;
- case hardware:
- storage.fOutxCtsFlow = TRUE;
- storage.fRtsControl = RTS_CONTROL_HANDSHAKE;
- break;
- default:
- break;
- }
-#else
- switch (value_)
- {
- case none:
- storage.c_iflag &= ~(IXOFF | IXON);
-# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
- storage.c_cflag &= ~CRTSCTS;
-# elif defined(__QNXNTO__)
- storage.c_cflag &= ~(IHFLOW | OHFLOW);
-# endif
- break;
- case software:
- storage.c_iflag |= IXOFF | IXON;
-# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
- storage.c_cflag &= ~CRTSCTS;
-# elif defined(__QNXNTO__)
- storage.c_cflag &= ~(IHFLOW | OHFLOW);
-# endif
- break;
- case hardware:
-# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
- storage.c_iflag &= ~(IXOFF | IXON);
- storage.c_cflag |= CRTSCTS;
- break;
-# elif defined(__QNXNTO__)
- storage.c_iflag &= ~(IXOFF | IXON);
- storage.c_cflag |= (IHFLOW | OHFLOW);
- break;
-# else
- ec = asio::error::operation_not_supported;
- ASIO_SYNC_OP_VOID_RETURN(ec);
-# endif
- default:
- break;
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::flow_control::load(
- const ASIO_OPTION_STORAGE& storage, asio::error_code& ec)
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- if (storage.fOutX && storage.fInX)
- {
- value_ = software;
- }
- else if (storage.fOutxCtsFlow && storage.fRtsControl == RTS_CONTROL_HANDSHAKE)
- {
- value_ = hardware;
- }
- else
- {
- value_ = none;
- }
-#else
- if (storage.c_iflag & (IXOFF | IXON))
- {
- value_ = software;
- }
-# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
- else if (storage.c_cflag & CRTSCTS)
- {
- value_ = hardware;
- }
-# elif defined(__QNXNTO__)
- else if (storage.c_cflag & IHFLOW && storage.c_cflag & OHFLOW)
- {
- value_ = hardware;
- }
-# endif
- else
- {
- value_ = none;
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-serial_port_base::parity::parity(serial_port_base::parity::type t)
- : value_(t)
-{
- if (t != none && t != odd && t != even)
- {
- std::out_of_range ex("invalid parity value");
- asio::detail::throw_exception(ex);
- }
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::parity::store(
- ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- switch (value_)
- {
- case none:
- storage.fParity = FALSE;
- storage.Parity = NOPARITY;
- break;
- case odd:
- storage.fParity = TRUE;
- storage.Parity = ODDPARITY;
- break;
- case even:
- storage.fParity = TRUE;
- storage.Parity = EVENPARITY;
- break;
- default:
- break;
- }
-#else
- switch (value_)
- {
- case none:
- storage.c_iflag |= IGNPAR;
- storage.c_cflag &= ~(PARENB | PARODD);
- break;
- case even:
- storage.c_iflag &= ~(IGNPAR | PARMRK);
- storage.c_iflag |= INPCK;
- storage.c_cflag |= PARENB;
- storage.c_cflag &= ~PARODD;
- break;
- case odd:
- storage.c_iflag &= ~(IGNPAR | PARMRK);
- storage.c_iflag |= INPCK;
- storage.c_cflag |= (PARENB | PARODD);
- break;
- default:
- break;
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::parity::load(
- const ASIO_OPTION_STORAGE& storage, asio::error_code& ec)
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- if (storage.Parity == EVENPARITY)
- {
- value_ = even;
- }
- else if (storage.Parity == ODDPARITY)
- {
- value_ = odd;
- }
- else
- {
- value_ = none;
- }
-#else
- if (storage.c_cflag & PARENB)
- {
- if (storage.c_cflag & PARODD)
- {
- value_ = odd;
- }
- else
- {
- value_ = even;
- }
- }
- else
- {
- value_ = none;
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-serial_port_base::stop_bits::stop_bits(
- serial_port_base::stop_bits::type t)
- : value_(t)
-{
- if (t != one && t != onepointfive && t != two)
- {
- std::out_of_range ex("invalid stop_bits value");
- asio::detail::throw_exception(ex);
- }
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::stop_bits::store(
- ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- switch (value_)
- {
- case one:
- storage.StopBits = ONESTOPBIT;
- break;
- case onepointfive:
- storage.StopBits = ONE5STOPBITS;
- break;
- case two:
- storage.StopBits = TWOSTOPBITS;
- break;
- default:
- break;
- }
-#else
- switch (value_)
- {
- case one:
- storage.c_cflag &= ~CSTOPB;
- break;
- case two:
- storage.c_cflag |= CSTOPB;
- break;
- default:
- ec = asio::error::operation_not_supported;
- ASIO_SYNC_OP_VOID_RETURN(ec);
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::stop_bits::load(
- const ASIO_OPTION_STORAGE& storage, asio::error_code& ec)
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- if (storage.StopBits == ONESTOPBIT)
- {
- value_ = one;
- }
- else if (storage.StopBits == ONE5STOPBITS)
- {
- value_ = onepointfive;
- }
- else if (storage.StopBits == TWOSTOPBITS)
- {
- value_ = two;
- }
- else
- {
- value_ = one;
- }
-#else
- value_ = (storage.c_cflag & CSTOPB) ? two : one;
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-serial_port_base::character_size::character_size(unsigned int t)
- : value_(t)
-{
- if (t < 5 || t > 8)
- {
- std::out_of_range ex("invalid character_size value");
- asio::detail::throw_exception(ex);
- }
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::character_size::store(
- ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- storage.ByteSize = value_;
-#else
- storage.c_cflag &= ~CSIZE;
- switch (value_)
- {
- case 5: storage.c_cflag |= CS5; break;
- case 6: storage.c_cflag |= CS6; break;
- case 7: storage.c_cflag |= CS7; break;
- case 8: storage.c_cflag |= CS8; break;
- default: break;
- }
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-ASIO_SYNC_OP_VOID serial_port_base::character_size::load(
- const ASIO_OPTION_STORAGE& storage, asio::error_code& ec)
-{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- value_ = storage.ByteSize;
-#else
-
-#pragma GCC diagnostic ignored "-Wduplicated-branches"
- if ((storage.c_cflag & CSIZE) == CS5) { value_ = 5; }
- else if ((storage.c_cflag & CSIZE) == CS6) { value_ = 6; }
- else if ((storage.c_cflag & CSIZE) == CS7) { value_ = 7; }
- else if ((storage.c_cflag & CSIZE) == CS8) { value_ = 8; }
- else
- {
- // Hmmm, use 8 for now.
- value_ = 8;
- }
-#pragma GCC diagnostic pop
-#endif
- ec = asio::error_code();
- ASIO_SYNC_OP_VOID_RETURN(ec);
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#undef ASIO_OPTION_STORAGE
-
-#endif // defined(ASIO_HAS_SERIAL_PORT)
-
-#endif // ASIO_IMPL_SERIAL_PORT_BASE_IPP
diff --git a/lib/asio/impl/spawn.hpp b/lib/asio/impl/spawn.hpp
deleted file mode 100644
index 5594ad9..0000000
--- a/lib/asio/impl/spawn.hpp
+++ /dev/null
@@ -1,535 +0,0 @@
-//
-// impl/spawn.hpp
-// ~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SPAWN_HPP
-#define ASIO_IMPL_SPAWN_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/async_result.hpp"
-#include "asio/bind_executor.hpp"
-#include "asio/detail/atomic_count.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/memory.hpp"
-#include "asio/detail/noncopyable.hpp"
-#include "asio/detail/type_traits.hpp"
-#include "asio/system_error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-namespace detail {
-
- template <typename Handler, typename T>
- class coro_handler
- {
- public:
- coro_handler(basic_yield_context<Handler> ctx)
- : coro_(ctx.coro_.lock()),
- ca_(ctx.ca_),
- handler_(ctx.handler_),
- ready_(0),
- ec_(ctx.ec_),
- value_(0)
- {
- }
-
- void operator()(T value)
- {
- *ec_ = asio::error_code();
- *value_ = ASIO_MOVE_CAST(T)(value);
- if (--*ready_ == 0)
- (*coro_)();
- }
-
- void operator()(asio::error_code ec, T value)
- {
- *ec_ = ec;
- *value_ = ASIO_MOVE_CAST(T)(value);
- if (--*ready_ == 0)
- (*coro_)();
- }
-
- //private:
- shared_ptr<typename basic_yield_context<Handler>::callee_type> coro_;
- typename basic_yield_context<Handler>::caller_type& ca_;
- Handler handler_;
- atomic_count* ready_;
- asio::error_code* ec_;
- T* value_;
- };
-
- template <typename Handler>
- class coro_handler<Handler, void>
- {
- public:
- coro_handler(basic_yield_context<Handler> ctx)
- : coro_(ctx.coro_.lock()),
- ca_(ctx.ca_),
- handler_(ctx.handler_),
- ready_(0),
- ec_(ctx.ec_)
- {
- }
-
- void operator()()
- {
- *ec_ = asio::error_code();
- if (--*ready_ == 0)
- (*coro_)();
- }
-
- void operator()(asio::error_code ec)
- {
- *ec_ = ec;
- if (--*ready_ == 0)
- (*coro_)();
- }
-
- //private:
- shared_ptr<typename basic_yield_context<Handler>::callee_type> coro_;
- typename basic_yield_context<Handler>::caller_type& ca_;
- Handler handler_;
- atomic_count* ready_;
- asio::error_code* ec_;
- };
-
- template <typename Handler, typename T>
- inline void* asio_handler_allocate(std::size_t size,
- coro_handler<Handler, T>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename Handler, typename T>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- coro_handler<Handler, T>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename Handler, typename T>
- inline bool asio_handler_is_continuation(coro_handler<Handler, T>*)
- {
- return true;
- }
-
- template <typename Function, typename Handler, typename T>
- inline void asio_handler_invoke(Function& function,
- coro_handler<Handler, T>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename Handler, typename T>
- inline void asio_handler_invoke(const Function& function,
- coro_handler<Handler, T>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Handler, typename T>
- class coro_async_result
- {
- public:
- typedef coro_handler<Handler, T> completion_handler_type;
- typedef T return_type;
-
- explicit coro_async_result(completion_handler_type& h)
- : handler_(h),
- ca_(h.ca_),
- ready_(2)
- {
- h.ready_ = &ready_;
- out_ec_ = h.ec_;
- if (!out_ec_) h.ec_ = &ec_;
- h.value_ = &value_;
- }
-
- return_type get()
- {
- // Must not hold shared_ptr to coro while suspended.
- handler_.coro_.reset();
-
- if (--ready_ != 0)
- ca_();
- if (!out_ec_ && ec_) throw asio::system_error(ec_);
- return ASIO_MOVE_CAST(return_type)(value_);
- }
-
- private:
- completion_handler_type& handler_;
- typename basic_yield_context<Handler>::caller_type& ca_;
- atomic_count ready_;
- asio::error_code* out_ec_;
- asio::error_code ec_;
- return_type value_;
- };
-
- template <typename Handler>
- class coro_async_result<Handler, void>
- {
- public:
- typedef coro_handler<Handler, void> completion_handler_type;
- typedef void return_type;
-
- explicit coro_async_result(completion_handler_type& h)
- : handler_(h),
- ca_(h.ca_),
- ready_(2)
- {
- h.ready_ = &ready_;
- out_ec_ = h.ec_;
- if (!out_ec_) h.ec_ = &ec_;
- }
-
- void get()
- {
- // Must not hold shared_ptr to coro while suspended.
- handler_.coro_.reset();
-
- if (--ready_ != 0)
- ca_();
- if (!out_ec_ && ec_) throw asio::system_error(ec_);
- }
-
- private:
- completion_handler_type& handler_;
- typename basic_yield_context<Handler>::caller_type& ca_;
- atomic_count ready_;
- asio::error_code* out_ec_;
- asio::error_code ec_;
- };
-
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename Handler, typename ReturnType>
-class async_result<basic_yield_context<Handler>, ReturnType()>
- : public detail::coro_async_result<Handler, void>
-{
-public:
- explicit async_result(
- typename detail::coro_async_result<Handler,
- void>::completion_handler_type& h)
- : detail::coro_async_result<Handler, void>(h)
- {
- }
-};
-
-template <typename Handler, typename ReturnType, typename Arg1>
-class async_result<basic_yield_context<Handler>, ReturnType(Arg1)>
- : public detail::coro_async_result<Handler, typename decay<Arg1>::type>
-{
-public:
- explicit async_result(
- typename detail::coro_async_result<Handler,
- typename decay<Arg1>::type>::completion_handler_type& h)
- : detail::coro_async_result<Handler, typename decay<Arg1>::type>(h)
- {
- }
-};
-
-template <typename Handler, typename ReturnType>
-class async_result<basic_yield_context<Handler>,
- ReturnType(asio::error_code)>
- : public detail::coro_async_result<Handler, void>
-{
-public:
- explicit async_result(
- typename detail::coro_async_result<Handler,
- void>::completion_handler_type& h)
- : detail::coro_async_result<Handler, void>(h)
- {
- }
-};
-
-template <typename Handler, typename ReturnType, typename Arg2>
-class async_result<basic_yield_context<Handler>,
- ReturnType(asio::error_code, Arg2)>
- : public detail::coro_async_result<Handler, typename decay<Arg2>::type>
-{
-public:
- explicit async_result(
- typename detail::coro_async_result<Handler,
- typename decay<Arg2>::type>::completion_handler_type& h)
- : detail::coro_async_result<Handler, typename decay<Arg2>::type>(h)
- {
- }
-};
-
-#if !defined(ASIO_NO_DEPRECATED)
-
-template <typename Handler, typename ReturnType>
-struct handler_type<basic_yield_context<Handler>, ReturnType()>
-{
- typedef detail::coro_handler<Handler, void> type;
-};
-
-template <typename Handler, typename ReturnType, typename Arg1>
-struct handler_type<basic_yield_context<Handler>, ReturnType(Arg1)>
-{
- typedef detail::coro_handler<Handler, typename decay<Arg1>::type> type;
-};
-
-template <typename Handler, typename ReturnType>
-struct handler_type<basic_yield_context<Handler>,
- ReturnType(asio::error_code)>
-{
- typedef detail::coro_handler<Handler, void> type;
-};
-
-template <typename Handler, typename ReturnType, typename Arg2>
-struct handler_type<basic_yield_context<Handler>,
- ReturnType(asio::error_code, Arg2)>
-{
- typedef detail::coro_handler<Handler, typename decay<Arg2>::type> type;
-};
-
-template <typename Handler, typename T>
-class async_result<detail::coro_handler<Handler, T> >
- : public detail::coro_async_result<Handler, T>
-{
-public:
- typedef typename detail::coro_async_result<Handler, T>::return_type type;
-
- explicit async_result(
- typename detail::coro_async_result<Handler,
- T>::completion_handler_type& h)
- : detail::coro_async_result<Handler, T>(h)
- {
- }
-};
-
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-template <typename Handler, typename T, typename Allocator>
-struct associated_allocator<detail::coro_handler<Handler, T>, Allocator>
-{
- typedef typename associated_allocator<Handler, Allocator>::type type;
-
- static type get(const detail::coro_handler<Handler, T>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<Handler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename Handler, typename T, typename Executor>
-struct associated_executor<detail::coro_handler<Handler, T>, Executor>
-{
- typedef typename associated_executor<Handler, Executor>::type type;
-
- static type get(const detail::coro_handler<Handler, T>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<Handler, Executor>::get(h.handler_, ex);
- }
-};
-
-namespace detail {
-
- template <typename Handler, typename Function>
- struct spawn_data : private noncopyable
- {
- template <typename Hand, typename Func>
- spawn_data(ASIO_MOVE_ARG(Hand) handler,
- bool call_handler, ASIO_MOVE_ARG(Func) function)
- : handler_(ASIO_MOVE_CAST(Hand)(handler)),
- call_handler_(call_handler),
- function_(ASIO_MOVE_CAST(Func)(function))
- {
- }
-
- weak_ptr<typename basic_yield_context<Handler>::callee_type> coro_;
- Handler handler_;
- bool call_handler_;
- Function function_;
- };
-
- template <typename Handler, typename Function>
- struct coro_entry_point
- {
- void operator()(typename basic_yield_context<Handler>::caller_type& ca)
- {
- shared_ptr<spawn_data<Handler, Function> > data(data_);
-#if !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2)
- ca(); // Yield until coroutine pointer has been initialised.
-#endif // !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2)
- const basic_yield_context<Handler> yield(
- data->coro_, ca, data->handler_);
-
- (data->function_)(yield);
- if (data->call_handler_)
- (data->handler_)();
- }
-
- shared_ptr<spawn_data<Handler, Function> > data_;
- };
-
- template <typename Handler, typename Function>
- struct spawn_helper
- {
- void operator()()
- {
- typedef typename basic_yield_context<Handler>::callee_type callee_type;
- coro_entry_point<Handler, Function> entry_point = { data_ };
- shared_ptr<callee_type> coro(new callee_type(entry_point, attributes_));
- data_->coro_ = coro;
- (*coro)();
- }
-
- shared_ptr<spawn_data<Handler, Function> > data_;
- boost::coroutines::attributes attributes_;
- };
-
- template <typename Function, typename Handler, typename Function1>
- inline void asio_handler_invoke(Function& function,
- spawn_helper<Handler, Function1>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->data_->handler_);
- }
-
- template <typename Function, typename Handler, typename Function1>
- inline void asio_handler_invoke(const Function& function,
- spawn_helper<Handler, Function1>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->data_->handler_);
- }
-
- inline void default_spawn_handler() {}
-
-} // namespace detail
-
-template <typename Function>
-inline void spawn(ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes)
-{
- typedef typename decay<Function>::type function_type;
-
- typename associated_executor<function_type>::type ex(
- (get_associated_executor)(function));
-
- asio::spawn(ex, ASIO_MOVE_CAST(Function)(function), attributes);
-}
-
-template <typename Handler, typename Function>
-void spawn(ASIO_MOVE_ARG(Handler) handler,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes,
- typename enable_if<!is_executor<typename decay<Handler>::type>::value &&
- !is_convertible<Handler&, execution_context&>::value>::type*)
-{
- typedef typename decay<Handler>::type handler_type;
- typedef typename decay<Function>::type function_type;
-
- typename associated_executor<handler_type>::type ex(
- (get_associated_executor)(handler));
-
- typename associated_allocator<handler_type>::type a(
- (get_associated_allocator)(handler));
-
- detail::spawn_helper<handler_type, function_type> helper;
- helper.data_.reset(
- new detail::spawn_data<handler_type, function_type>(
- ASIO_MOVE_CAST(Handler)(handler), true,
- ASIO_MOVE_CAST(Function)(function)));
- helper.attributes_ = attributes;
-
- ex.dispatch(helper, a);
-}
-
-template <typename Handler, typename Function>
-void spawn(basic_yield_context<Handler> ctx,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes)
-{
- typedef typename decay<Function>::type function_type;
-
- Handler handler(ctx.handler_); // Explicit copy that might be moved from.
-
- typename associated_executor<Handler>::type ex(
- (get_associated_executor)(handler));
-
- typename associated_allocator<Handler>::type a(
- (get_associated_allocator)(handler));
-
- detail::spawn_helper<Handler, function_type> helper;
- helper.data_.reset(
- new detail::spawn_data<Handler, function_type>(
- ASIO_MOVE_CAST(Handler)(handler), false,
- ASIO_MOVE_CAST(Function)(function)));
- helper.attributes_ = attributes;
-
- ex.dispatch(helper, a);
-}
-
-template <typename Function, typename Executor>
-inline void spawn(const Executor& ex,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes,
- typename enable_if<is_executor<Executor>::value>::type*)
-{
- asio::spawn(asio::strand<Executor>(ex),
- ASIO_MOVE_CAST(Function)(function), attributes);
-}
-
-template <typename Function, typename Executor>
-inline void spawn(const strand<Executor>& ex,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes)
-{
- asio::spawn(asio::bind_executor(
- ex, &detail::default_spawn_handler),
- ASIO_MOVE_CAST(Function)(function), attributes);
-}
-
-template <typename Function>
-inline void spawn(const asio::io_context::strand& s,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes)
-{
- asio::spawn(asio::bind_executor(
- s, &detail::default_spawn_handler),
- ASIO_MOVE_CAST(Function)(function), attributes);
-}
-
-template <typename Function, typename ExecutionContext>
-inline void spawn(ExecutionContext& ctx,
- ASIO_MOVE_ARG(Function) function,
- const boost::coroutines::attributes& attributes,
- typename enable_if<is_convertible<
- ExecutionContext&, execution_context&>::value>::type*)
-{
- asio::spawn(ctx.get_executor(),
- ASIO_MOVE_CAST(Function)(function), attributes);
-}
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_SPAWN_HPP
diff --git a/lib/asio/impl/src.cpp b/lib/asio/impl/src.cpp
deleted file mode 100644
index e8a5953..0000000
--- a/lib/asio/impl/src.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// impl/src.cpp
-// ~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#if defined(_MSC_VER) \
- || defined(__BORLANDC__) \
- || defined(__DMC__)
-# pragma message ( \
- "This file is deprecated. " \
- "Please #include <asio/impl/src.hpp> instead.")
-#elif defined(__GNUC__) \
- || defined(__HP_aCC) \
- || defined(__SUNPRO_CC) \
- || defined(__IBMCPP__)
-# warning "This file is deprecated."
-# warning "Please #include <asio/impl/src.hpp> instead."
-#endif
-
-#include "asio/impl/src.hpp"
diff --git a/lib/asio/impl/src.hpp b/lib/asio/impl/src.hpp
deleted file mode 100644
index a72637b..0000000
--- a/lib/asio/impl/src.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// impl/src.hpp
-// ~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SRC_HPP
-#define ASIO_IMPL_SRC_HPP
-
-#define ASIO_SOURCE
-
-#include "asio/detail/config.hpp"
-
-#if defined(ASIO_HEADER_ONLY)
-# error Do not compile Asio library source with ASIO_HEADER_ONLY defined
-#endif
-
-#include "asio/impl/error.ipp"
-#include "asio/impl/error_code.ipp"
-#include "asio/impl/execution_context.ipp"
-#include "asio/impl/executor.ipp"
-#include "asio/impl/handler_alloc_hook.ipp"
-#include "asio/impl/io_context.ipp"
-#include "asio/impl/serial_port_base.ipp"
-#include "asio/impl/system_context.ipp"
-#include "asio/impl/thread_pool.ipp"
-#include "asio/detail/impl/buffer_sequence_adapter.ipp"
-#include "asio/detail/impl/descriptor_ops.ipp"
-#include "asio/detail/impl/dev_poll_reactor.ipp"
-#include "asio/detail/impl/epoll_reactor.ipp"
-#include "asio/detail/impl/eventfd_select_interrupter.ipp"
-#include "asio/detail/impl/handler_tracking.ipp"
-#include "asio/detail/impl/kqueue_reactor.ipp"
-#include "asio/detail/impl/null_event.ipp"
-#include "asio/detail/impl/pipe_select_interrupter.ipp"
-#include "asio/detail/impl/posix_event.ipp"
-#include "asio/detail/impl/posix_mutex.ipp"
-#include "asio/detail/impl/posix_thread.ipp"
-#include "asio/detail/impl/posix_tss_ptr.ipp"
-#include "asio/detail/impl/reactive_descriptor_service.ipp"
-#include "asio/detail/impl/reactive_serial_port_service.ipp"
-#include "asio/detail/impl/reactive_socket_service_base.ipp"
-#include "asio/detail/impl/resolver_service_base.ipp"
-#include "asio/detail/impl/scheduler.ipp"
-#include "asio/detail/impl/select_reactor.ipp"
-#include "asio/detail/impl/service_registry.ipp"
-#include "asio/detail/impl/signal_set_service.ipp"
-#include "asio/detail/impl/socket_ops.ipp"
-#include "asio/detail/impl/socket_select_interrupter.ipp"
-#include "asio/detail/impl/strand_executor_service.ipp"
-#include "asio/detail/impl/strand_service.ipp"
-#include "asio/detail/impl/throw_error.ipp"
-#include "asio/detail/impl/timer_queue_ptime.ipp"
-#include "asio/detail/impl/timer_queue_set.ipp"
-#include "asio/detail/impl/win_iocp_handle_service.ipp"
-#include "asio/detail/impl/win_iocp_io_context.ipp"
-#include "asio/detail/impl/win_iocp_serial_port_service.ipp"
-#include "asio/detail/impl/win_iocp_socket_service_base.ipp"
-#include "asio/detail/impl/win_event.ipp"
-#include "asio/detail/impl/win_mutex.ipp"
-#include "asio/detail/impl/win_object_handle_service.ipp"
-#include "asio/detail/impl/win_static_mutex.ipp"
-#include "asio/detail/impl/win_thread.ipp"
-#include "asio/detail/impl/win_tss_ptr.ipp"
-#include "asio/detail/impl/winrt_ssocket_service_base.ipp"
-#include "asio/detail/impl/winrt_timer_scheduler.ipp"
-#include "asio/detail/impl/winsock_init.ipp"
-#include "asio/generic/detail/impl/endpoint.ipp"
-#include "asio/ip/impl/address.ipp"
-#include "asio/ip/impl/address_v4.ipp"
-#include "asio/ip/impl/address_v6.ipp"
-#include "asio/ip/impl/host_name.ipp"
-#include "asio/ip/impl/network_v4.ipp"
-#include "asio/ip/impl/network_v6.ipp"
-#include "asio/ip/detail/impl/endpoint.ipp"
-#include "asio/local/detail/impl/endpoint.ipp"
-
-#endif // ASIO_IMPL_SRC_HPP
diff --git a/lib/asio/impl/system_context.hpp b/lib/asio/impl/system_context.hpp
deleted file mode 100644
index 87ffe76..0000000
--- a/lib/asio/impl/system_context.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// impl/system_context.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SYSTEM_CONTEXT_HPP
-#define ASIO_IMPL_SYSTEM_CONTEXT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/system_executor.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-inline system_context::executor_type
-system_context::get_executor() ASIO_NOEXCEPT
-{
- return system_executor();
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_SYSTEM_CONTEXT_HPP
diff --git a/lib/asio/impl/system_context.ipp b/lib/asio/impl/system_context.ipp
deleted file mode 100644
index 8ad5e41..0000000
--- a/lib/asio/impl/system_context.ipp
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// impl/system_context.ipp
-// ~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SYSTEM_CONTEXT_IPP
-#define ASIO_IMPL_SYSTEM_CONTEXT_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/system_context.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-struct system_context::thread_function
-{
- detail::scheduler* scheduler_;
-
- void operator()()
- {
- asio::error_code ec;
- scheduler_->run(ec);
- }
-};
-
-system_context::system_context()
- : scheduler_(use_service<detail::scheduler>(*this))
-{
- scheduler_.work_started();
-
- thread_function f = { &scheduler_ };
- std::size_t num_threads = detail::thread::hardware_concurrency() * 2;
- threads_.create_threads(f, num_threads ? num_threads : 2);
-}
-
-system_context::~system_context()
-{
- scheduler_.work_finished();
- scheduler_.stop();
- threads_.join();
-}
-
-void system_context::stop()
-{
- scheduler_.stop();
-}
-
-bool system_context::stopped() const ASIO_NOEXCEPT
-{
- return scheduler_.stopped();
-}
-
-void system_context::join()
-{
- scheduler_.work_finished();
- threads_.join();
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_SYSTEM_CONTEXT_IPP
diff --git a/lib/asio/impl/system_executor.hpp b/lib/asio/impl/system_executor.hpp
deleted file mode 100644
index ac4861f..0000000
--- a/lib/asio/impl/system_executor.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// impl/system_executor.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_SYSTEM_EXECUTOR_HPP
-#define ASIO_IMPL_SYSTEM_EXECUTOR_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/executor_op.hpp"
-#include "asio/detail/global.hpp"
-#include "asio/detail/recycling_allocator.hpp"
-#include "asio/detail/type_traits.hpp"
-#include "asio/system_context.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-inline system_context& system_executor::context() const ASIO_NOEXCEPT
-{
- return detail::global<system_context>();
-}
-
-template <typename Function, typename Allocator>
-void system_executor::dispatch(
- ASIO_MOVE_ARG(Function) f, const Allocator&) const
-{
- typename decay<Function>::type tmp(ASIO_MOVE_CAST(Function)(f));
- asio_handler_invoke_helpers::invoke(tmp, tmp);
-}
-
-template <typename Function, typename Allocator>
-void system_executor::post(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- system_context& ctx = detail::global<system_context>();
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((ctx, *p.p,
- "system_executor", &this->context(), 0, "post"));
-
- ctx.scheduler_.post_immediate_completion(p.p, false);
- p.v = p.p = 0;
-}
-
-template <typename Function, typename Allocator>
-void system_executor::defer(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- system_context& ctx = detail::global<system_context>();
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((ctx, *p.p,
- "system_executor", &this->context(), 0, "defer"));
-
- ctx.scheduler_.post_immediate_completion(p.p, true);
- p.v = p.p = 0;
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_SYSTEM_EXECUTOR_HPP
diff --git a/lib/asio/impl/thread_pool.hpp b/lib/asio/impl/thread_pool.hpp
deleted file mode 100644
index 058e377..0000000
--- a/lib/asio/impl/thread_pool.hpp
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-// impl/thread_pool.hpp
-// ~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_THREAD_POOL_HPP
-#define ASIO_IMPL_THREAD_POOL_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/executor_op.hpp"
-#include "asio/detail/fenced_block.hpp"
-#include "asio/detail/recycling_allocator.hpp"
-#include "asio/detail/type_traits.hpp"
-#include "asio/execution_context.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-inline thread_pool::executor_type
-thread_pool::get_executor() ASIO_NOEXCEPT
-{
- return executor_type(*this);
-}
-
-inline thread_pool&
-thread_pool::executor_type::context() const ASIO_NOEXCEPT
-{
- return pool_;
-}
-
-inline void
-thread_pool::executor_type::on_work_started() const ASIO_NOEXCEPT
-{
- pool_.scheduler_.work_started();
-}
-
-inline void thread_pool::executor_type::on_work_finished()
-const ASIO_NOEXCEPT
-{
- pool_.scheduler_.work_finished();
-}
-
-template <typename Function, typename Allocator>
-void thread_pool::executor_type::dispatch(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Invoke immediately if we are already inside the thread pool.
- if (pool_.scheduler_.can_dispatch())
- {
- // Make a local, non-const copy of the function.
- function_type tmp(ASIO_MOVE_CAST(Function)(f));
-
- detail::fenced_block b(detail::fenced_block::full);
- asio_handler_invoke_helpers::invoke(tmp, tmp);
- return;
- }
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((pool_, *p.p,
- "thread_pool", &this->context(), 0, "dispatch"));
-
- pool_.scheduler_.post_immediate_completion(p.p, false);
- p.v = p.p = 0;
-}
-
-template <typename Function, typename Allocator>
-void thread_pool::executor_type::post(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((pool_, *p.p,
- "thread_pool", &this->context(), 0, "post"));
-
- pool_.scheduler_.post_immediate_completion(p.p, false);
- p.v = p.p = 0;
-}
-
-template <typename Function, typename Allocator>
-void thread_pool::executor_type::defer(
- ASIO_MOVE_ARG(Function) f, const Allocator& a) const
-{
- typedef typename decay<Function>::type function_type;
-
- // Allocate and construct an operation to wrap the function.
- typedef detail::executor_op<function_type, Allocator> op;
- typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
- p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a);
-
- ASIO_HANDLER_CREATION((pool_, *p.p,
- "thread_pool", &this->context(), 0, "defer"));
-
- pool_.scheduler_.post_immediate_completion(p.p, true);
- p.v = p.p = 0;
-}
-
-inline bool
-thread_pool::executor_type::running_in_this_thread() const ASIO_NOEXCEPT
-{
- return pool_.scheduler_.can_dispatch();
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_THREAD_POOL_HPP
diff --git a/lib/asio/impl/thread_pool.ipp b/lib/asio/impl/thread_pool.ipp
deleted file mode 100644
index 89583c1..0000000
--- a/lib/asio/impl/thread_pool.ipp
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// impl/thread_pool.ipp
-// ~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_THREAD_POOL_IPP
-#define ASIO_IMPL_THREAD_POOL_IPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include "asio/thread_pool.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-struct thread_pool::thread_function
-{
- detail::scheduler* scheduler_;
-
- void operator()()
- {
- asio::error_code ec;
- scheduler_->run(ec);
- }
-};
-
-thread_pool::thread_pool()
- : scheduler_(use_service<detail::scheduler>(*this))
-{
- scheduler_.work_started();
-
- thread_function f = { &scheduler_ };
- std::size_t num_threads = detail::thread::hardware_concurrency() * 2;
- threads_.create_threads(f, num_threads ? num_threads : 2);
-}
-
-thread_pool::thread_pool(std::size_t num_threads)
- : scheduler_(use_service<detail::scheduler>(*this))
-{
- scheduler_.work_started();
-
- thread_function f = { &scheduler_ };
- threads_.create_threads(f, num_threads);
-}
-
-thread_pool::~thread_pool()
-{
- stop();
- join();
-}
-
-void thread_pool::stop()
-{
- scheduler_.stop();
-}
-
-void thread_pool::join()
-{
- scheduler_.work_finished();
- threads_.join();
-}
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_THREAD_POOL_IPP
diff --git a/lib/asio/impl/use_future.hpp b/lib/asio/impl/use_future.hpp
deleted file mode 100644
index 51eb7e2..0000000
--- a/lib/asio/impl/use_future.hpp
+++ /dev/null
@@ -1,938 +0,0 @@
-//
-// impl/use_future.hpp
-// ~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_USE_FUTURE_HPP
-#define ASIO_IMPL_USE_FUTURE_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/detail/config.hpp"
-#include <future>
-#include <tuple>
-#include "asio/async_result.hpp"
-#include "asio/detail/memory.hpp"
-#include "asio/error_code.hpp"
-#include "asio/packaged_task.hpp"
-#include "asio/system_error.hpp"
-#include "asio/system_executor.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-namespace detail {
-
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename T, typename F, typename... Args>
-inline void promise_invoke_and_set(std::promise<T>& p,
- F& f, ASIO_MOVE_ARG(Args)... args)
-{
-#if !defined(ASIO_NO_EXCEPTIONS)
- try
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- {
- p.set_value(f(ASIO_MOVE_CAST(Args)(args)...));
- }
-#if !defined(ASIO_NO_EXCEPTIONS)
- catch (...)
- {
- p.set_exception(std::current_exception());
- }
-#endif // !defined(ASIO_NO_EXCEPTIONS)
-}
-
-template <typename F, typename... Args>
-inline void promise_invoke_and_set(std::promise<void>& p,
- F& f, ASIO_MOVE_ARG(Args)... args)
-{
-#if !defined(ASIO_NO_EXCEPTIONS)
- try
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- {
- f(ASIO_MOVE_CAST(Args)(args)...);
- p.set_value();
- }
-#if !defined(ASIO_NO_EXCEPTIONS)
- catch (...)
- {
- p.set_exception(std::current_exception());
- }
-#endif // !defined(ASIO_NO_EXCEPTIONS)
-}
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename T, typename F>
-inline void promise_invoke_and_set(std::promise<T>& p, F& f)
-{
-#if !defined(ASIO_NO_EXCEPTIONS)
- try
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- {
- p.set_value(f());
- }
-#if !defined(ASIO_NO_EXCEPTIONS)
- catch (...)
- {
- p.set_exception(std::current_exception());
- }
-#endif // !defined(ASIO_NO_EXCEPTIONS)
-}
-
-template <typename F, typename Args>
-inline void promise_invoke_and_set(std::promise<void>& p, F& f)
-{
-#if !defined(ASIO_NO_EXCEPTIONS)
- try
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- {
- f();
- p.set_value();
-#if !defined(ASIO_NO_EXCEPTIONS)
- }
- catch (...)
- {
- p.set_exception(std::current_exception());
- }
-#endif // !defined(ASIO_NO_EXCEPTIONS)
-}
-
-#if defined(ASIO_NO_EXCEPTIONS)
-
-#define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \
- template <typename T, typename F, ASIO_VARIADIC_TPARAMS(n)> \
- inline void promise_invoke_and_set(std::promise<T>& p, \
- F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \
- } \
- \
- template <typename F, ASIO_VARIADIC_TPARAMS(n)> \
- inline void promise_invoke_and_set(std::promise<void>& p, \
- F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- f(ASIO_VARIADIC_MOVE_ARGS(n)); \
- p.set_value(); \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF)
-#undef ASIO_PRIVATE_PROMISE_INVOKE_DEF
-
-#else // defined(ASIO_NO_EXCEPTIONS)
-
-#define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \
- template <typename T, typename F, ASIO_VARIADIC_TPARAMS(n)> \
- inline void promise_invoke_and_set(std::promise<T>& p, \
- F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- try \
- { \
- p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \
- } \
- catch (...) \
- { \
- p.set_exception(std::current_exception()); \
- } \
- } \
- \
- template <typename F, ASIO_VARIADIC_TPARAMS(n)> \
- inline void promise_invoke_and_set(std::promise<void>& p, \
- F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- try \
- { \
- f(ASIO_VARIADIC_MOVE_ARGS(n)); \
- p.set_value(); \
- } \
- catch (...) \
- { \
- p.set_exception(std::current_exception()); \
- } \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF)
-#undef ASIO_PRIVATE_PROMISE_INVOKE_DEF
-
-#endif // defined(ASIO_NO_EXCEPTIONS)
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-// A function object adapter to invoke a nullary function object and capture
-// any exception thrown into a promise.
-template <typename T, typename F>
-class promise_invoker
-{
-public:
- promise_invoker(const shared_ptr<std::promise<T> >& p,
- ASIO_MOVE_ARG(F) f)
- : p_(p), f_(ASIO_MOVE_CAST(F)(f))
- {
- }
-
- void operator()()
- {
-#if !defined(ASIO_NO_EXCEPTIONS)
- try
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- {
- f_();
- }
-#if !defined(ASIO_NO_EXCEPTIONS)
- catch (...)
- {
- p_->set_exception(std::current_exception());
- }
-#endif // !defined(ASIO_NO_EXCEPTIONS)
- }
-
-private:
- shared_ptr<std::promise<T> > p_;
- typename decay<F>::type f_;
-};
-
-// An executor that adapts the system_executor to capture any exeption thrown
-// by a submitted function object and save it into a promise.
-template <typename T>
-class promise_executor
-{
-public:
- explicit promise_executor(const shared_ptr<std::promise<T> >& p)
- : p_(p)
- {
- }
-
- execution_context& context() const ASIO_NOEXCEPT
- {
- return system_executor().context();
- }
-
- void on_work_started() const ASIO_NOEXCEPT {}
- void on_work_finished() const ASIO_NOEXCEPT {}
-
- template <typename F, typename A>
- void dispatch(ASIO_MOVE_ARG(F) f, const A&) const
- {
- promise_invoker<T, F>(p_, ASIO_MOVE_CAST(F)(f))();
- }
-
- template <typename F, typename A>
- void post(ASIO_MOVE_ARG(F) f, const A& a) const
- {
- system_executor().post(
- promise_invoker<T, F>(p_, ASIO_MOVE_CAST(F)(f)), a);
- }
-
- template <typename F, typename A>
- void defer(ASIO_MOVE_ARG(F) f, const A& a) const
- {
- system_executor().defer(
- promise_invoker<T, F>(p_, ASIO_MOVE_CAST(F)(f)), a);
- }
-
- friend bool operator==(const promise_executor& a,
- const promise_executor& b) ASIO_NOEXCEPT
- {
- return a.p_ == b.p_;
- }
-
- friend bool operator!=(const promise_executor& a,
- const promise_executor& b) ASIO_NOEXCEPT
- {
- return a.p_ != b.p_;
- }
-
-private:
- shared_ptr<std::promise<T> > p_;
-};
-
-// The base class for all completion handlers that create promises.
-template <typename T>
-class promise_creator
-{
-public:
- typedef promise_executor<T> executor_type;
-
- executor_type get_executor() const ASIO_NOEXCEPT
- {
- return executor_type(p_);
- }
-
- typedef std::future<T> future_type;
-
- future_type get_future()
- {
- return p_->get_future();
- }
-
-protected:
- template <typename Allocator>
- void create_promise(const Allocator& a)
- {
- ASIO_REBIND_ALLOC(Allocator, char) b(a);
- p_ = std::allocate_shared<std::promise<T>>(b, std::allocator_arg, b);
- }
-
- shared_ptr<std::promise<T> > p_;
-};
-
-// For completion signature void().
-class promise_handler_0
- : public promise_creator<void>
-{
-public:
- void operator()()
- {
- this->p_->set_value();
- }
-};
-
-// For completion signature void(error_code).
-class promise_handler_ec_0
- : public promise_creator<void>
-{
-public:
- void operator()(const asio::error_code& ec)
- {
- if (ec)
- {
- this->p_->set_exception(
- std::make_exception_ptr(
- asio::system_error(ec)));
- }
- else
- {
- this->p_->set_value();
- }
- }
-};
-
-// For completion signature void(exception_ptr).
-class promise_handler_ex_0
- : public promise_creator<void>
-{
-public:
- void operator()(const std::exception_ptr& ex)
- {
- if (ex)
- {
- this->p_->set_exception(ex);
- }
- else
- {
- this->p_->set_value();
- }
- }
-};
-
-// For completion signature void(T).
-template <typename T>
-class promise_handler_1
- : public promise_creator<T>
-{
-public:
- template <typename Arg>
- void operator()(ASIO_MOVE_ARG(Arg) arg)
- {
- this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg));
- }
-};
-
-// For completion signature void(error_code, T).
-template <typename T>
-class promise_handler_ec_1
- : public promise_creator<T>
-{
-public:
- template <typename Arg>
- void operator()(const asio::error_code& ec,
- ASIO_MOVE_ARG(Arg) arg)
- {
- if (ec)
- {
- this->p_->set_exception(
- std::make_exception_ptr(
- asio::system_error(ec)));
- }
- else
- this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg));
- }
-};
-
-// For completion signature void(exception_ptr, T).
-template <typename T>
-class promise_handler_ex_1
- : public promise_creator<T>
-{
-public:
- template <typename Arg>
- void operator()(const std::exception_ptr& ex,
- ASIO_MOVE_ARG(Arg) arg)
- {
- if (ex)
- this->p_->set_exception(ex);
- else
- this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg));
- }
-};
-
-// For completion signature void(T1, ..., Tn);
-template <typename T>
-class promise_handler_n
- : public promise_creator<T>
-{
-public:
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename... Args>
- void operator()(ASIO_MOVE_ARG(Args)... args)
- {
- this->p_->set_value(
- std::forward_as_tuple(
- ASIO_MOVE_CAST(Args)(args)...));
- }
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-#define ASIO_PRIVATE_CALL_OP_DEF(n) \
- template <ASIO_VARIADIC_TPARAMS(n)> \
- void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \
- {\
- this->p_->set_value( \
- std::forward_as_tuple( \
- ASIO_VARIADIC_MOVE_ARGS(n))); \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF)
-#undef ASIO_PRIVATE_CALL_OP_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-};
-
-// For completion signature void(error_code, T1, ..., Tn);
-template <typename T>
-class promise_handler_ec_n
- : public promise_creator<T>
-{
-public:
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename... Args>
- void operator()(const asio::error_code& ec,
- ASIO_MOVE_ARG(Args)... args)
- {
- if (ec)
- {
- this->p_->set_exception(
- std::make_exception_ptr(
- asio::system_error(ec)));
- }
- else
- {
- this->p_->set_value(
- std::forward_as_tuple(
- ASIO_MOVE_CAST(Args)(args)...));
- }
- }
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-#define ASIO_PRIVATE_CALL_OP_DEF(n) \
- template <ASIO_VARIADIC_TPARAMS(n)> \
- void operator()(const asio::error_code& ec, \
- ASIO_VARIADIC_MOVE_PARAMS(n)) \
- {\
- if (ec) \
- { \
- this->p_->set_exception( \
- std::make_exception_ptr( \
- asio::system_error(ec))); \
- } \
- else \
- { \
- this->p_->set_value( \
- std::forward_as_tuple( \
- ASIO_VARIADIC_MOVE_ARGS(n))); \
- } \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF)
-#undef ASIO_PRIVATE_CALL_OP_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-};
-
-// For completion signature void(exception_ptr, T1, ..., Tn);
-template <typename T>
-class promise_handler_ex_n
- : public promise_creator<T>
-{
-public:
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename... Args>
- void operator()(const std::exception_ptr& ex,
- ASIO_MOVE_ARG(Args)... args)
- {
- if (ex)
- this->p_->set_exception(ex);
- else
- {
- this->p_->set_value(
- std::forward_as_tuple(
- ASIO_MOVE_CAST(Args)(args)...));
- }
- }
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-#define ASIO_PRIVATE_CALL_OP_DEF(n) \
- template <ASIO_VARIADIC_TPARAMS(n)> \
- void operator()(const std::exception_ptr& ex, \
- ASIO_VARIADIC_MOVE_PARAMS(n)) \
- {\
- if (ex) \
- this->p_->set_exception(ex); \
- else \
- { \
- this->p_->set_value( \
- std::forward_as_tuple( \
- ASIO_VARIADIC_MOVE_ARGS(n))); \
- } \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF)
-#undef ASIO_PRIVATE_CALL_OP_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-};
-
-// Helper template to choose the appropriate concrete promise handler
-// implementation based on the supplied completion signature.
-template <typename> class promise_handler_selector;
-
-template <>
-class promise_handler_selector<void()>
- : public promise_handler_0 {};
-
-template <>
-class promise_handler_selector<void(asio::error_code)>
- : public promise_handler_ec_0 {};
-
-template <>
-class promise_handler_selector<void(std::exception_ptr)>
- : public promise_handler_ex_0 {};
-
-template <typename Arg>
-class promise_handler_selector<void(Arg)>
- : public promise_handler_1<Arg> {};
-
-template <typename Arg>
-class promise_handler_selector<void(asio::error_code, Arg)>
- : public promise_handler_ec_1<Arg> {};
-
-template <typename Arg>
-class promise_handler_selector<void(std::exception_ptr, Arg)>
- : public promise_handler_ex_1<Arg> {};
-
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename... Arg>
-class promise_handler_selector<void(Arg...)>
- : public promise_handler_n<std::tuple<Arg...> > {};
-
-template <typename... Arg>
-class promise_handler_selector<void(asio::error_code, Arg...)>
- : public promise_handler_ec_n<std::tuple<Arg...> > {};
-
-template <typename... Arg>
-class promise_handler_selector<void(std::exception_ptr, Arg...)>
- : public promise_handler_ex_n<std::tuple<Arg...> > {};
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-#define ASIO_PRIVATE_PROMISE_SELECTOR_DEF(n) \
- template <typename Arg, ASIO_VARIADIC_TPARAMS(n)> \
- class promise_handler_selector< \
- void(Arg, ASIO_VARIADIC_TARGS(n))> \
- : public promise_handler_n< \
- std::tuple<Arg, ASIO_VARIADIC_TARGS(n)> > {}; \
- \
- template <typename Arg, ASIO_VARIADIC_TPARAMS(n)> \
- class promise_handler_selector< \
- void(asio::error_code, Arg, ASIO_VARIADIC_TARGS(n))> \
- : public promise_handler_ec_n< \
- std::tuple<Arg, ASIO_VARIADIC_TARGS(n)> > {}; \
- \
- template <typename Arg, ASIO_VARIADIC_TPARAMS(n)> \
- class promise_handler_selector< \
- void(std::exception_ptr, Arg, ASIO_VARIADIC_TARGS(n))> \
- : public promise_handler_ex_n< \
- std::tuple<Arg, ASIO_VARIADIC_TARGS(n)> > {}; \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_SELECTOR_DEF)
-#undef ASIO_PRIVATE_PROMISE_SELECTOR_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-// Completion handlers produced from the use_future completion token, when not
-// using use_future::operator().
-template <typename Signature, typename Allocator>
-class promise_handler
- : public promise_handler_selector<Signature>
-{
-public:
- typedef Allocator allocator_type;
- typedef void result_type;
-
- promise_handler(use_future_t<Allocator> u)
- : allocator_(u.get_allocator())
- {
- this->create_promise(allocator_);
- }
-
- allocator_type get_allocator() const ASIO_NOEXCEPT
- {
- return allocator_;
- }
-
-private:
- Allocator allocator_;
-};
-
-template <typename Function, typename Signature, typename Allocator>
-inline void asio_handler_invoke(Function& f,
- promise_handler<Signature, Allocator>* h)
-{
- typename promise_handler<Signature, Allocator>::executor_type
- ex(h->get_executor());
- ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator<void>());
-}
-
-template <typename Function, typename Signature, typename Allocator>
-inline void asio_handler_invoke(const Function& f,
- promise_handler<Signature, Allocator>* h)
-{
- typename promise_handler<Signature, Allocator>::executor_type
- ex(h->get_executor());
- ex.dispatch(f, std::allocator<void>());
-}
-
-// Helper base class for async_result specialisation.
-template <typename Signature, typename Allocator>
-class promise_async_result
-{
-public:
- typedef promise_handler<Signature, Allocator> completion_handler_type;
- typedef typename completion_handler_type::future_type return_type;
-
- explicit promise_async_result(completion_handler_type& h)
- : future_(h.get_future())
- {
- }
-
- return_type get()
- {
- return ASIO_MOVE_CAST(return_type)(future_);
- }
-
-private:
- return_type future_;
-};
-
-// Return value from use_future::operator().
-template <typename Function, typename Allocator>
-class packaged_token
-{
-public:
- packaged_token(Function f, const Allocator& a)
- : function_(ASIO_MOVE_CAST(Function)(f)),
- allocator_(a)
- {
- }
-
-//private:
- Function function_;
- Allocator allocator_;
-};
-
-// Completion handlers produced from the use_future completion token, when
-// using use_future::operator().
-template <typename Function, typename Allocator, typename Result>
-class packaged_handler
- : public promise_creator<Result>
-{
-public:
- typedef Allocator allocator_type;
- typedef void result_type;
-
- packaged_handler(packaged_token<Function, Allocator> t)
- : function_(ASIO_MOVE_CAST(Function)(t.function_)),
- allocator_(t.allocator_)
- {
- this->create_promise(allocator_);
- }
-
- allocator_type get_allocator() const ASIO_NOEXCEPT
- {
- return allocator_;
- }
-
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename... Args>
- void operator()(ASIO_MOVE_ARG(Args)... args)
- {
- (promise_invoke_and_set)(*this->p_,
- function_, ASIO_MOVE_CAST(Args)(args)...);
- }
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- void operator()()
- {
- (promise_invoke_and_set)(*this->p_, function_);
- }
-
-#define ASIO_PRIVATE_CALL_OP_DEF(n) \
- template <ASIO_VARIADIC_TPARAMS(n)> \
- void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \
- {\
- (promise_invoke_and_set)(*this->p_, \
- function_, ASIO_VARIADIC_MOVE_ARGS(n)); \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF)
-#undef ASIO_PRIVATE_CALL_OP_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-private:
- Function function_;
- Allocator allocator_;
-};
-
-template <typename Function,
- typename Function1, typename Allocator, typename Result>
-inline void asio_handler_invoke(Function& f,
- packaged_handler<Function1, Allocator, Result>* h)
-{
- typename packaged_handler<Function1, Allocator, Result>::executor_type
- ex(h->get_executor());
- ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator<void>());
-}
-
-template <typename Function,
- typename Function1, typename Allocator, typename Result>
-inline void asio_handler_invoke(const Function& f,
- packaged_handler<Function1, Allocator, Result>* h)
-{
- typename packaged_handler<Function1, Allocator, Result>::executor_type
- ex(h->get_executor());
- ex.dispatch(f, std::allocator<void>());
-}
-
-// Helper base class for async_result specialisation.
-template <typename Function, typename Allocator, typename Result>
-class packaged_async_result
-{
-public:
- typedef packaged_handler<Function, Allocator, Result> completion_handler_type;
- typedef typename completion_handler_type::future_type return_type;
-
- explicit packaged_async_result(completion_handler_type& h)
- : future_(h.get_future())
- {
- }
-
- return_type get()
- {
- return ASIO_MOVE_CAST(return_type)(future_);
- }
-
-private:
- return_type future_;
-};
-
-} // namespace detail
-
-template <typename Allocator> template <typename Function>
-inline detail::packaged_token<typename decay<Function>::type, Allocator>
-use_future_t<Allocator>::operator()(ASIO_MOVE_ARG(Function) f) const
-{
- return detail::packaged_token<typename decay<Function>::type, Allocator>(
- ASIO_MOVE_CAST(Function)(f), allocator_);
-}
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename Allocator, typename Result, typename... Args>
-class async_result<use_future_t<Allocator>, Result(Args...)>
- : public detail::promise_async_result<
- void(typename decay<Args>::type...), Allocator>
-{
-public:
- explicit async_result(
- typename detail::promise_async_result<void(typename decay<Args>::type...),
- Allocator>::completion_handler_type& h)
- : detail::promise_async_result<
- void(typename decay<Args>::type...), Allocator>(h)
- {
- }
-};
-
-template <typename Function, typename Allocator,
- typename Result, typename... Args>
-class async_result<detail::packaged_token<Function, Allocator>, Result(Args...)>
- : public detail::packaged_async_result<Function, Allocator,
- typename result_of<Function(Args...)>::type>
-{
-public:
- explicit async_result(
- typename detail::packaged_async_result<Function, Allocator,
- typename result_of<Function(Args...)>::type>::completion_handler_type& h)
- : detail::packaged_async_result<Function, Allocator,
- typename result_of<Function(Args...)>::type>(h)
- {
- }
-};
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-template <typename Allocator, typename Result>
-class async_result<use_future_t<Allocator>, Result()>
- : public detail::promise_async_result<void(), Allocator>
-{
-public:
- explicit async_result(
- typename detail::promise_async_result<
- void(), Allocator>::completion_handler_type& h)
- : detail::promise_async_result<void(), Allocator>(h)
- {
- }
-};
-
-template <typename Function, typename Allocator, typename Result>
-class async_result<detail::packaged_token<Function, Allocator>, Result()>
- : public detail::packaged_async_result<Function, Allocator,
- typename result_of<Function()>::type>
-{
-public:
- explicit async_result(
- typename detail::packaged_async_result<Function, Allocator,
- typename result_of<Function()>::type>::completion_handler_type& h)
- : detail::packaged_async_result<Function, Allocator,
- typename result_of<Function()>::type>(h)
- {
- }
-};
-
-#define ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \
- template <typename Allocator, \
- typename Result, ASIO_VARIADIC_TPARAMS(n)> \
- class async_result<use_future_t<Allocator>, \
- Result(ASIO_VARIADIC_TARGS(n))> \
- : public detail::promise_async_result< \
- void(ASIO_VARIADIC_DECAY(n)), Allocator> \
- { \
- public: \
- explicit async_result( \
- typename detail::promise_async_result< \
- void(ASIO_VARIADIC_DECAY(n)), \
- Allocator>::completion_handler_type& h) \
- : detail::promise_async_result< \
- void(ASIO_VARIADIC_DECAY(n)), Allocator>(h) \
- { \
- } \
- }; \
- \
- template <typename Function, typename Allocator, \
- typename Result, ASIO_VARIADIC_TPARAMS(n)> \
- class async_result<detail::packaged_token<Function, Allocator>, \
- Result(ASIO_VARIADIC_TARGS(n))> \
- : public detail::packaged_async_result<Function, Allocator, \
- typename result_of<Function(ASIO_VARIADIC_TARGS(n))>::type> \
- { \
- public: \
- explicit async_result( \
- typename detail::packaged_async_result<Function, Allocator, \
- typename result_of<Function(ASIO_VARIADIC_TARGS(n))>::type \
- >::completion_handler_type& h) \
- : detail::packaged_async_result<Function, Allocator, \
- typename result_of<Function(ASIO_VARIADIC_TARGS(n))>::type>(h) \
- { \
- } \
- }; \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_ASYNC_RESULT_DEF)
-#undef ASIO_PRIVATE_ASYNC_RESULT_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
-#if !defined(ASIO_NO_DEPRECATED)
-
-template <typename Allocator, typename Signature>
-struct handler_type<use_future_t<Allocator>, Signature>
-{
- typedef typename async_result<use_future_t<Allocator>,
- Signature>::completion_handler_type type;
-};
-
-template <typename Signature, typename Allocator>
-class async_result<detail::promise_handler<Signature, Allocator> >
- : public detail::promise_async_result<Signature, Allocator>
-{
-public:
- typedef typename detail::promise_async_result<
- Signature, Allocator>::return_type type;
-
- explicit async_result(
- typename detail::promise_async_result<
- Signature, Allocator>::completion_handler_type& h)
- : detail::promise_async_result<Signature, Allocator>(h)
- {
- }
-};
-
-template <typename Function, typename Allocator, typename Signature>
-struct handler_type<detail::packaged_token<Function, Allocator>, Signature>
-{
- typedef typename async_result<detail::packaged_token<Function, Allocator>,
- Signature>::completion_handler_type type;
-};
-
-template <typename Function, typename Allocator, typename Result>
-class async_result<detail::packaged_handler<Function, Allocator, Result> >
- : public detail::packaged_async_result<Function, Allocator, Result>
-{
-public:
- typedef typename detail::packaged_async_result<
- Function, Allocator, Result>::return_type type;
-
- explicit async_result(
- typename detail::packaged_async_result<
- Function, Allocator, Result>::completion_handler_type& h)
- : detail::packaged_async_result<Function, Allocator, Result>(h)
- {
- }
-};
-
-#endif // !defined(ASIO_NO_DEPRECATED)
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_USE_FUTURE_HPP
diff --git a/lib/asio/impl/write.hpp b/lib/asio/impl/write.hpp
deleted file mode 100644
index d07e8d3..0000000
--- a/lib/asio/impl/write.hpp
+++ /dev/null
@@ -1,674 +0,0 @@
-//
-// impl/write.hpp
-// ~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_WRITE_HPP
-#define ASIO_IMPL_WRITE_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/buffer.hpp"
-#include "asio/completion_condition.hpp"
-#include "asio/detail/array_fwd.hpp"
-#include "asio/detail/base_from_completion_cond.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/consuming_buffers.hpp"
-#include "asio/detail/dependent_type.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/throw_error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-namespace detail
-{
- template <typename SyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition>
- std::size_t write_buffer_sequence(SyncWriteStream& s,
- const ConstBufferSequence& buffers, const ConstBufferIterator&,
- CompletionCondition completion_condition, asio::error_code& ec)
- {
- ec = asio::error_code();
- asio::detail::consuming_buffers<const_buffer,
- ConstBufferSequence, ConstBufferIterator> tmp(buffers);
- while (!tmp.empty())
- {
- if (std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, tmp.total_consumed())))
- tmp.consume(s.write_some(tmp.prepare(max_size), ec));
- else
- break;
- }
- return tmp.total_consumed();;
- }
-} // namespace detail
-
-template <typename SyncWriteStream, typename ConstBufferSequence,
- typename CompletionCondition>
-inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition, asio::error_code& ec,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- return detail::write_buffer_sequence(s, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition, ec);
-}
-
-template <typename SyncWriteStream, typename ConstBufferSequence>
-inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write(s, buffers, transfer_all(), ec);
- asio::detail::throw_error(ec, "write");
- return bytes_transferred;
-}
-
-template <typename SyncWriteStream, typename ConstBufferSequence>
-inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
- asio::error_code& ec,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- return write(s, buffers, transfer_all(), ec);
-}
-
-template <typename SyncWriteStream, typename ConstBufferSequence,
- typename CompletionCondition>
-inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write(s, buffers, completion_condition, ec);
- asio::detail::throw_error(ec, "write");
- return bytes_transferred;
-}
-
-template <typename SyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition>
-std::size_t write(SyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition, asio::error_code& ec,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- typename decay<DynamicBuffer>::type b(
- ASIO_MOVE_CAST(DynamicBuffer)(buffers));
-
- std::size_t bytes_transferred = write(s, b.data(), completion_condition, ec);
- b.consume(bytes_transferred);
- return bytes_transferred;
-}
-
-template <typename SyncWriteStream, typename DynamicBuffer>
-inline std::size_t write(SyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- transfer_all(), ec);
- asio::detail::throw_error(ec, "write");
- return bytes_transferred;
-}
-
-template <typename SyncWriteStream, typename DynamicBuffer>
-inline std::size_t write(SyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- asio::error_code& ec,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- return write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- transfer_all(), ec);
-}
-
-template <typename SyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition>
-inline std::size_t write(SyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- completion_condition, ec);
- asio::detail::throw_error(ec, "write");
- return bytes_transferred;
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename SyncWriteStream, typename Allocator,
- typename CompletionCondition>
-inline std::size_t write(SyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- return write(s, basic_streambuf_ref<Allocator>(b), completion_condition, ec);
-}
-
-template <typename SyncWriteStream, typename Allocator>
-inline std::size_t write(SyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b)
-{
- return write(s, basic_streambuf_ref<Allocator>(b));
-}
-
-template <typename SyncWriteStream, typename Allocator>
-inline std::size_t write(SyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b,
- asio::error_code& ec)
-{
- return write(s, basic_streambuf_ref<Allocator>(b), ec);
-}
-
-template <typename SyncWriteStream, typename Allocator,
- typename CompletionCondition>
-inline std::size_t write(SyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition)
-{
- return write(s, basic_streambuf_ref<Allocator>(b), completion_condition);
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-namespace detail
-{
- template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler>
- class write_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- write_op(AsyncWriteStream& stream, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition, WriteHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- stream_(stream),
- buffers_(buffers),
- start_(0),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- write_op(const write_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- write_op(write_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- stream_(other.stream_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- do
- {
- stream_.async_write_some(buffers_.prepare(max_size),
- ASIO_MOVE_CAST(write_op)(*this));
- return; default:
- buffers_.consume(bytes_transferred);
- if ((!ec && bytes_transferred == 0) || buffers_.empty())
- break;
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- } while (max_size > 0);
-
- handler_(ec, buffers_.total_consumed());
- }
- }
-
- //private:
- AsyncWriteStream& stream_;
- asio::detail::consuming_buffers<const_buffer,
- ConstBufferSequence, ConstBufferIterator> buffers_;
- int start_;
- WriteHandler handler_;
- };
-
- template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler>
- inline bool asio_handler_is_continuation(
- write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncWriteStream,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncWriteStream,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler>
- inline void start_write_buffer_sequence_op(AsyncWriteStream& stream,
- const ConstBufferSequence& buffers, const ConstBufferIterator&,
- CompletionCondition completion_condition, WriteHandler& handler)
- {
- detail::write_op<AsyncWriteStream, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>(
- stream, buffers, completion_condition, handler)(
- asio::error_code(), 0, 1);
- }
-
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler, typename Allocator>
-struct associated_allocator<
- detail::write_op<AsyncWriteStream, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>,
- Allocator>
-{
- typedef typename associated_allocator<WriteHandler, Allocator>::type type;
-
- static type get(
- const detail::write_op<AsyncWriteStream, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition,
- typename WriteHandler, typename Executor>
-struct associated_executor<
- detail::write_op<AsyncWriteStream, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>,
- Executor>
-{
- typedef typename associated_executor<WriteHandler, Executor>::type type;
-
- static type get(
- const detail::write_op<AsyncWriteStream, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename CompletionCondition, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(WriteHandler) handler,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_write_buffer_sequence_op(s, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition,
- init.completion_handler);
-
- return init.result.get();
-}
-
-template <typename AsyncWriteStream, typename ConstBufferSequence,
- typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
- ASIO_MOVE_ARG(WriteHandler) handler,
- typename enable_if<
- is_const_buffer_sequence<ConstBufferSequence>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_write_buffer_sequence_op(s, buffers,
- asio::buffer_sequence_begin(buffers), transfer_all(),
- init.completion_handler);
-
- return init.result.get();
-}
-
-namespace detail
-{
- template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler>
- class write_dynbuf_op
- {
- public:
- template <typename BufferSequence>
- write_dynbuf_op(AsyncWriteStream& stream,
- ASIO_MOVE_ARG(BufferSequence) buffers,
- CompletionCondition completion_condition, WriteHandler& handler)
- : stream_(stream),
- buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)),
- completion_condition_(
- ASIO_MOVE_CAST(CompletionCondition)(completion_condition)),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- write_dynbuf_op(const write_dynbuf_op& other)
- : stream_(other.stream_),
- buffers_(other.buffers_),
- completion_condition_(other.completion_condition_),
- handler_(other.handler_)
- {
- }
-
- write_dynbuf_op(write_dynbuf_op&& other)
- : stream_(other.stream_),
- buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)),
- completion_condition_(
- ASIO_MOVE_CAST(CompletionCondition)(
- other.completion_condition_)),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- switch (start)
- {
- case 1:
- async_write(stream_, buffers_.data(), completion_condition_,
- ASIO_MOVE_CAST(write_dynbuf_op)(*this));
- return; default:
- buffers_.consume(bytes_transferred);
- handler_(ec, static_cast<const std::size_t&>(bytes_transferred));
- }
- }
-
- //private:
- AsyncWriteStream& stream_;
- DynamicBuffer buffers_;
- CompletionCondition completion_condition_;
- WriteHandler handler_;
- };
-
- template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- write_dynbuf_op<AsyncWriteStream, DynamicBuffer,
- CompletionCondition, WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- write_dynbuf_op<AsyncWriteStream, DynamicBuffer,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler>
- inline bool asio_handler_is_continuation(
- write_dynbuf_op<AsyncWriteStream, DynamicBuffer,
- CompletionCondition, WriteHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncWriteStream,
- typename DynamicBuffer, typename CompletionCondition,
- typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- write_dynbuf_op<AsyncWriteStream, DynamicBuffer,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncWriteStream,
- typename DynamicBuffer, typename CompletionCondition,
- typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- write_dynbuf_op<AsyncWriteStream, DynamicBuffer,
- CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler, typename Allocator>
-struct associated_allocator<
- detail::write_dynbuf_op<AsyncWriteStream,
- DynamicBuffer, CompletionCondition, WriteHandler>,
- Allocator>
-{
- typedef typename associated_allocator<WriteHandler, Allocator>::type type;
-
- static type get(
- const detail::write_dynbuf_op<AsyncWriteStream,
- DynamicBuffer, CompletionCondition, WriteHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler, typename Executor>
-struct associated_executor<
- detail::write_dynbuf_op<AsyncWriteStream,
- DynamicBuffer, CompletionCondition, WriteHandler>,
- Executor>
-{
- typedef typename associated_executor<WriteHandler, Executor>::type type;
-
- static type get(
- const detail::write_dynbuf_op<AsyncWriteStream,
- DynamicBuffer, CompletionCondition, WriteHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncWriteStream,
- typename DynamicBuffer, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- ASIO_MOVE_ARG(WriteHandler) handler,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- return async_write(s,
- ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- transfer_all(), ASIO_MOVE_CAST(WriteHandler)(handler));
-}
-
-template <typename AsyncWriteStream, typename DynamicBuffer,
- typename CompletionCondition, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s,
- ASIO_MOVE_ARG(DynamicBuffer) buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(WriteHandler) handler,
- typename enable_if<
- is_dynamic_buffer<typename decay<DynamicBuffer>::type>::value
- >::type*)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::write_dynbuf_op<AsyncWriteStream,
- typename decay<DynamicBuffer>::type,
- CompletionCondition, ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- s, ASIO_MOVE_CAST(DynamicBuffer)(buffers),
- completion_condition, init.completion_handler)(
- asio::error_code(), 0, 1);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename AsyncWriteStream, typename Allocator, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- return async_write(s, basic_streambuf_ref<Allocator>(b),
- ASIO_MOVE_CAST(WriteHandler)(handler));
-}
-
-template <typename AsyncWriteStream, typename Allocator,
- typename CompletionCondition, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write(AsyncWriteStream& s,
- asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- return async_write(s, basic_streambuf_ref<Allocator>(b),
- completion_condition, ASIO_MOVE_CAST(WriteHandler)(handler));
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_WRITE_HPP
diff --git a/lib/asio/impl/write_at.hpp b/lib/asio/impl/write_at.hpp
deleted file mode 100644
index cc6f336..0000000
--- a/lib/asio/impl/write_at.hpp
+++ /dev/null
@@ -1,572 +0,0 @@
-//
-// impl/write_at.hpp
-// ~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef ASIO_IMPL_WRITE_AT_HPP
-#define ASIO_IMPL_WRITE_AT_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1200)
-# pragma once
-#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
-#include "asio/associated_allocator.hpp"
-#include "asio/associated_executor.hpp"
-#include "asio/buffer.hpp"
-#include "asio/completion_condition.hpp"
-#include "asio/detail/array_fwd.hpp"
-#include "asio/detail/base_from_completion_cond.hpp"
-#include "asio/detail/bind_handler.hpp"
-#include "asio/detail/consuming_buffers.hpp"
-#include "asio/detail/dependent_type.hpp"
-#include "asio/detail/handler_alloc_helpers.hpp"
-#include "asio/detail/handler_cont_helpers.hpp"
-#include "asio/detail/handler_invoke_helpers.hpp"
-#include "asio/detail/handler_type_requirements.hpp"
-#include "asio/detail/throw_error.hpp"
-
-#include "asio/detail/push_options.hpp"
-
-namespace asio {
-
-namespace detail
-{
- template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
- typename ConstBufferIterator, typename CompletionCondition>
- std::size_t write_at_buffer_sequence(SyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- const ConstBufferIterator&, CompletionCondition completion_condition,
- asio::error_code& ec)
- {
- ec = asio::error_code();
- asio::detail::consuming_buffers<const_buffer,
- ConstBufferSequence, ConstBufferIterator> tmp(buffers);
- while (!tmp.empty())
- {
- if (std::size_t max_size = detail::adapt_completion_condition_result(
- completion_condition(ec, tmp.total_consumed())))
- {
- tmp.consume(d.write_some_at(offset + tmp.total_consumed(),
- tmp.prepare(max_size), ec));
- }
- else
- break;
- }
- return tmp.total_consumed();;
- }
-} // namespace detail
-
-template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
- typename CompletionCondition>
-std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- return detail::write_at_buffer_sequence(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition, ec);
-}
-
-template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write_at(
- d, offset, buffers, transfer_all(), ec);
- asio::detail::throw_error(ec, "write_at");
- return bytes_transferred;
-}
-
-template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- asio::error_code& ec)
-{
- return write_at(d, offset, buffers, transfer_all(), ec);
-}
-
-template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
- typename CompletionCondition>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write_at(
- d, offset, buffers, completion_condition, ec);
- asio::detail::throw_error(ec, "write_at");
- return bytes_transferred;
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-template <typename SyncRandomAccessWriteDevice, typename Allocator,
- typename CompletionCondition>
-std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition, asio::error_code& ec)
-{
- std::size_t bytes_transferred = write_at(
- d, offset, b.data(), completion_condition, ec);
- b.consume(bytes_transferred);
- return bytes_transferred;
-}
-
-template <typename SyncRandomAccessWriteDevice, typename Allocator>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write_at(d, offset, b, transfer_all(), ec);
- asio::detail::throw_error(ec, "write_at");
- return bytes_transferred;
-}
-
-template <typename SyncRandomAccessWriteDevice, typename Allocator>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- asio::error_code& ec)
-{
- return write_at(d, offset, b, transfer_all(), ec);
-}
-
-template <typename SyncRandomAccessWriteDevice, typename Allocator,
- typename CompletionCondition>
-inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition)
-{
- asio::error_code ec;
- std::size_t bytes_transferred = write_at(
- d, offset, b, completion_condition, ec);
- asio::detail::throw_error(ec, "write_at");
- return bytes_transferred;
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-namespace detail
-{
- template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- class write_at_op
- : detail::base_from_completion_cond<CompletionCondition>
- {
- public:
- write_at_op(AsyncRandomAccessWriteDevice& device,
- uint64_t offset, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition, WriteHandler& handler)
- : detail::base_from_completion_cond<
- CompletionCondition>(completion_condition),
- device_(device),
- offset_(offset),
- buffers_(buffers),
- start_(0),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- write_at_op(const write_at_op& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(other.handler_)
- {
- }
-
- write_at_op(write_at_op&& other)
- : detail::base_from_completion_cond<CompletionCondition>(other),
- device_(other.device_),
- offset_(other.offset_),
- buffers_(other.buffers_),
- start_(other.start_),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- std::size_t bytes_transferred, int start = 0)
- {
- std::size_t max_size;
- switch (start_ = start)
- {
- case 1:
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- do
- {
- device_.async_write_some_at(
- offset_ + buffers_.total_consumed(), buffers_.prepare(max_size),
- ASIO_MOVE_CAST(write_at_op)(*this));
- return; default:
- buffers_.consume(bytes_transferred);
- if ((!ec && bytes_transferred == 0) || buffers_.empty())
- break;
- max_size = this->check_for_completion(ec, buffers_.total_consumed());
- } while (max_size > 0);
-
- handler_(ec, buffers_.total_consumed());
- }
- }
-
- //private:
- AsyncRandomAccessWriteDevice& device_;
- uint64_t offset_;
- asio::detail::consuming_buffers<const_buffer,
- ConstBufferSequence, ConstBufferIterator> buffers_;
- int start_;
- WriteHandler handler_;
- };
-
- template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline bool asio_handler_is_continuation(
- write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
- {
- return this_handler->start_ == 0 ? true
- : asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler>
- inline void start_write_at_buffer_sequence_op(AsyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- const ConstBufferIterator&, CompletionCondition completion_condition,
- WriteHandler& handler)
- {
- detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>(
- d, offset, buffers, completion_condition, handler)(
- asio::error_code(), 0, 1);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler, typename Allocator>
-struct associated_allocator<
- detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>,
- Allocator>
-{
- typedef typename associated_allocator<WriteHandler, Allocator>::type type;
-
- static type get(
- const detail::write_at_op<AsyncRandomAccessWriteDevice,
- ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>& h,
- const Allocator& a = Allocator()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator>::get(h.handler_, a);
- }
-};
-
-template <typename AsyncRandomAccessWriteDevice,
- typename ConstBufferSequence, typename ConstBufferIterator,
- typename CompletionCondition, typename WriteHandler, typename Executor>
-struct associated_executor<
- detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
- ConstBufferIterator, CompletionCondition, WriteHandler>,
- Executor>
-{
- typedef typename associated_executor<WriteHandler, Executor>::type type;
-
- static type get(
- const detail::write_at_op<AsyncRandomAccessWriteDevice,
- ConstBufferSequence, ConstBufferIterator,
- CompletionCondition, WriteHandler>& h,
- const Executor& ex = Executor()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
- typename CompletionCondition, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write_at(AsyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_write_at_buffer_sequence_op(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), completion_condition,
- init.completion_handler);
-
- return init.result.get();
-}
-
-template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
- typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write_at(AsyncRandomAccessWriteDevice& d,
- uint64_t offset, const ConstBufferSequence& buffers,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- detail::start_write_at_buffer_sequence_op(d, offset, buffers,
- asio::buffer_sequence_begin(buffers), transfer_all(),
- init.completion_handler);
-
- return init.result.get();
-}
-
-#if !defined(ASIO_NO_EXTENSIONS)
-#if !defined(ASIO_NO_IOSTREAM)
-
-namespace detail
-{
- template <typename Allocator, typename WriteHandler>
- class write_at_streambuf_op
- {
- public:
- write_at_streambuf_op(
- asio::basic_streambuf<Allocator>& streambuf,
- WriteHandler& handler)
- : streambuf_(streambuf),
- handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
- {
- }
-
-#if defined(ASIO_HAS_MOVE)
- write_at_streambuf_op(const write_at_streambuf_op& other)
- : streambuf_(other.streambuf_),
- handler_(other.handler_)
- {
- }
-
- write_at_streambuf_op(write_at_streambuf_op&& other)
- : streambuf_(other.streambuf_),
- handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_))
- {
- }
-#endif // defined(ASIO_HAS_MOVE)
-
- void operator()(const asio::error_code& ec,
- const std::size_t bytes_transferred)
- {
- streambuf_.consume(bytes_transferred);
- handler_(ec, bytes_transferred);
- }
-
- //private:
- asio::basic_streambuf<Allocator>& streambuf_;
- WriteHandler handler_;
- };
-
- template <typename Allocator, typename WriteHandler>
- inline void* asio_handler_allocate(std::size_t size,
- write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
- {
- return asio_handler_alloc_helpers::allocate(
- size, this_handler->handler_);
- }
-
- template <typename Allocator, typename WriteHandler>
- inline void asio_handler_deallocate(void* pointer, std::size_t size,
- write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
- {
- asio_handler_alloc_helpers::deallocate(
- pointer, size, this_handler->handler_);
- }
-
- template <typename Allocator, typename WriteHandler>
- inline bool asio_handler_is_continuation(
- write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
-
- template <typename Function, typename Allocator, typename WriteHandler>
- inline void asio_handler_invoke(Function& function,
- write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Function, typename Allocator, typename WriteHandler>
- inline void asio_handler_invoke(const Function& function,
- write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
- {
- asio_handler_invoke_helpers::invoke(
- function, this_handler->handler_);
- }
-
- template <typename Allocator, typename WriteHandler>
- inline write_at_streambuf_op<Allocator, WriteHandler>
- make_write_at_streambuf_op(
- asio::basic_streambuf<Allocator>& b, WriteHandler handler)
- {
- return write_at_streambuf_op<Allocator, WriteHandler>(b, handler);
- }
-} // namespace detail
-
-#if !defined(GENERATING_DOCUMENTATION)
-
-template <typename Allocator, typename WriteHandler, typename Allocator1>
-struct associated_allocator<
- detail::write_at_streambuf_op<Allocator, WriteHandler>,
- Allocator1>
-{
- typedef typename associated_allocator<WriteHandler, Allocator1>::type type;
-
- static type get(
- const detail::write_at_streambuf_op<Allocator, WriteHandler>& h,
- const Allocator1& a = Allocator1()) ASIO_NOEXCEPT
- {
- return associated_allocator<WriteHandler, Allocator1>::get(h.handler_, a);
- }
-};
-
-template <typename Executor, typename WriteHandler, typename Executor1>
-struct associated_executor<
- detail::write_at_streambuf_op<Executor, WriteHandler>,
- Executor1>
-{
- typedef typename associated_executor<WriteHandler, Executor1>::type type;
-
- static type get(
- const detail::write_at_streambuf_op<Executor, WriteHandler>& h,
- const Executor1& ex = Executor1()) ASIO_NOEXCEPT
- {
- return associated_executor<WriteHandler, Executor1>::get(h.handler_, ex);
- }
-};
-
-#endif // !defined(GENERATING_DOCUMENTATION)
-
-template <typename AsyncRandomAccessWriteDevice, typename Allocator,
- typename CompletionCondition, typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write_at(AsyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- CompletionCondition completion_condition,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- async_write_at(d, offset, b.data(), completion_condition,
- detail::write_at_streambuf_op<Allocator, ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- b, init.completion_handler));
-
- return init.result.get();
-}
-
-template <typename AsyncRandomAccessWriteDevice, typename Allocator,
- typename WriteHandler>
-inline ASIO_INITFN_RESULT_TYPE(WriteHandler,
- void (asio::error_code, std::size_t))
-async_write_at(AsyncRandomAccessWriteDevice& d,
- uint64_t offset, asio::basic_streambuf<Allocator>& b,
- ASIO_MOVE_ARG(WriteHandler) handler)
-{
- // If you get an error on the following line it means that your handler does
- // not meet the documented type requirements for a WriteHandler.
- ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
-
- async_completion<WriteHandler,
- void (asio::error_code, std::size_t)> init(handler);
-
- async_write_at(d, offset, b.data(), transfer_all(),
- detail::write_at_streambuf_op<Allocator, ASIO_HANDLER_TYPE(
- WriteHandler, void (asio::error_code, std::size_t))>(
- b, init.completion_handler));
-
- return init.result.get();
-}
-
-#endif // !defined(ASIO_NO_IOSTREAM)
-#endif // !defined(ASIO_NO_EXTENSIONS)
-
-} // namespace asio
-
-#include "asio/detail/pop_options.hpp"
-
-#endif // ASIO_IMPL_WRITE_AT_HPP