diff options
Diffstat (limited to '3rdParty/Boost/src/boost/asio/impl')
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/buffered_read_stream.hpp | 360 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/buffered_write_stream.hpp | 340 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/connect.hpp | 107 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/error.ipp | 13 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/handler_alloc_hook.ipp | 79 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/io_service.hpp | 25 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/io_service.ipp | 4 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/read.hpp | 159 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/read_at.hpp | 199 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/read_until.hpp | 201 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/serial_port_base.hpp | 2 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/serial_port_base.ipp | 35 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/write.hpp | 146 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/impl/write_at.hpp | 174 |
14 files changed, 1499 insertions, 345 deletions
diff --git a/3rdParty/Boost/src/boost/asio/impl/buffered_read_stream.hpp b/3rdParty/Boost/src/boost/asio/impl/buffered_read_stream.hpp new file mode 100644 index 0000000..00bc204 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/impl/buffered_read_stream.hpp @@ -0,0 +1,360 @@ +// +// impl/buffered_read_stream.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_BUFFERED_READ_STREAM_HPP +#define BOOST_ASIO_IMPL_BUFFERED_READ_STREAM_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> +#include <boost/asio/detail/handler_invoke_helpers.hpp> +#include <boost/asio/detail/handler_type_requirements.hpp> + +#include <boost/asio/detail/push_options.hpp> + +namespace boost { +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(boost::system::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_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) + { + } + +#if defined(BOOST_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_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) + { + } +#endif // defined(BOOST_ASIO_HAS_MOVE) + + void operator()(const boost::system::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 boost_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) + { + boost_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 boost_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) + { + boost_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) + { + boost_asio_handler_invoke_helpers::invoke( + function, this_handler->handler_); + } +} // namespace detail + +template <typename Stream> +template <typename ReadHandler> +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +buffered_read_stream<Stream>::async_fill( + BOOST_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. + BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; + + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(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<BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + storage_, previous_size, init.handler)); + + return init.result.get(); +} + +template <typename Stream> +template <typename MutableBufferSequence> +std::size_t buffered_read_stream<Stream>::read_some( + const MutableBufferSequence& buffers) +{ + if (boost::asio::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, boost::system::error_code& ec) +{ + ec = boost::system::error_code(); + + if (boost::asio::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_(handler) + { + } + +#if defined(BOOST_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_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) + { + } +#endif // defined(BOOST_ASIO_HAS_MOVE) + + void operator()(const boost::system::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 = boost::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 boost_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) + { + boost_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 boost_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) + { + boost_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) + { + boost_asio_handler_invoke_helpers::invoke( + function, this_handler->handler_); + } +} // namespace detail + +template <typename Stream> +template <typename MutableBufferSequence, typename ReadHandler> +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +buffered_read_stream<Stream>::async_read_some( + const MutableBufferSequence& buffers, + BOOST_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. + BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; + + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + if (boost::asio::buffer_size(buffers) == 0 || !storage_.empty()) + { + next_layer_.async_read_some(boost::asio::mutable_buffers_1(0, 0), + detail::buffered_read_some_handler< + MutableBufferSequence, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + storage_, buffers, init.handler)); + } + else + { + this->async_fill(detail::buffered_read_some_handler< + MutableBufferSequence, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + storage_, buffers, init.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, boost::system::error_code& ec) +{ + ec = boost::system::error_code(); + if (storage_.empty() && !this->fill(ec)) + return 0; + return this->peek_copy(buffers); +} + +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IMPL_BUFFERED_READ_STREAM_HPP diff --git a/3rdParty/Boost/src/boost/asio/impl/buffered_write_stream.hpp b/3rdParty/Boost/src/boost/asio/impl/buffered_write_stream.hpp new file mode 100644 index 0000000..6501208 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/impl/buffered_write_stream.hpp @@ -0,0 +1,340 @@ +// +// impl/buffered_write_stream.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP +#define BOOST_ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> +#include <boost/asio/detail/handler_invoke_helpers.hpp> +#include <boost/asio/detail/handler_type_requirements.hpp> + +#include <boost/asio/detail/push_options.hpp> + +namespace boost { +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(boost::system::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_(handler) + { + } + +#if defined(BOOST_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_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) + { + } +#endif // defined(BOOST_ASIO_HAS_MOVE) + + void operator()(const boost::system::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 boost_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) + { + boost_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 boost_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) + { + boost_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) + { + boost_asio_handler_invoke_helpers::invoke( + function, this_handler->handler_); + } +} + +template <typename Stream> +template <typename WriteHandler> +BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +buffered_write_stream<Stream>::async_flush( + BOOST_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. + BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + async_write(next_layer_, buffer(storage_.data(), storage_.size()), + detail::buffered_flush_handler<BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + storage_, init.handler)); + + return init.result.get(); +} + +template <typename Stream> +template <typename ConstBufferSequence> +std::size_t buffered_write_stream<Stream>::write_some( + const ConstBufferSequence& buffers) +{ + if (boost::asio::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, boost::system::error_code& ec) +{ + ec = boost::system::error_code(); + + if (boost::asio::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_(handler) + { + } + +#if defined(BOOST_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_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) + { + } +#endif // defined(BOOST_ASIO_HAS_MOVE) + + void operator()(const boost::system::error_code& ec, std::size_t) + { + if (ec) + { + const std::size_t length = 0; + handler_(ec, length); + } + else + { + std::size_t orig_size = storage_.size(); + std::size_t space_avail = storage_.capacity() - orig_size; + std::size_t bytes_avail = boost::asio::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 = boost::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 boost_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) + { + boost_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 boost_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) + { + boost_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) + { + boost_asio_handler_invoke_helpers::invoke( + function, this_handler->handler_); + } +} // namespace detail + +template <typename Stream> +template <typename ConstBufferSequence, typename WriteHandler> +BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +buffered_write_stream<Stream>::async_write_some( + const ConstBufferSequence& buffers, + BOOST_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. + BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + if (boost::asio::buffer_size(buffers) == 0 + || storage_.size() < storage_.capacity()) + { + next_layer_.async_write_some(boost::asio::const_buffers_1(0, 0), + detail::buffered_write_some_handler< + ConstBufferSequence, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + storage_, buffers, init.handler)); + } + else + { + this->async_flush(detail::buffered_write_some_handler< + ConstBufferSequence, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + storage_, buffers, init.handler)); + } + + return init.result.get(); +} + +template <typename Stream> +template <typename ConstBufferSequence> +std::size_t buffered_write_stream<Stream>::copy( + const ConstBufferSequence& buffers) +{ + std::size_t orig_size = storage_.size(); + std::size_t space_avail = storage_.capacity() - orig_size; + std::size_t bytes_avail = boost::asio::buffer_size(buffers); + std::size_t length = bytes_avail < space_avail ? bytes_avail : space_avail; + storage_.resize(orig_size + length); + return boost::asio::buffer_copy( + storage_.data() + orig_size, buffers, length); +} + +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP diff --git a/3rdParty/Boost/src/boost/asio/impl/connect.hpp b/3rdParty/Boost/src/boost/asio/impl/connect.hpp index a21bb2d..68a903e 100644 --- a/3rdParty/Boost/src/boost/asio/impl/connect.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/connect.hpp @@ -1,11 +1,11 @@ // // impl/connect.hpp // ~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_CONNECT_HPP @@ -15,12 +15,13 @@ # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/consuming_buffers.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/error.hpp> #include <boost/asio/detail/push_options.hpp> @@ -181,39 +182,42 @@ namespace detail const ConnectCondition& connect_condition, ComposedConnectHandler& handler) : base_from_connect_condition<ConnectCondition>(connect_condition), socket_(sock), iter_(begin), end_(end), + start_(0), handler_(BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) connect_op(const connect_op& other) : base_from_connect_condition<ConnectCondition>(other), socket_(other.socket_), iter_(other.iter_), end_(other.end_), + start_(other.start_), handler_(other.handler_) { } connect_op(connect_op&& other) : base_from_connect_condition<ConnectCondition>(other), socket_(other.socket_), iter_(other.iter_), end_(other.end_), + start_(other.start_), handler_(BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(boost::system::error_code ec, int start = 0) { - switch (start) + switch (start_ = start) { case 1: for (;;) { this->check_condition(ec, iter_, end_); @@ -255,12 +259,13 @@ namespace detail } //private: basic_socket<Protocol, SocketService>& socket_; Iterator iter_; Iterator end_; + int start_; ComposedConnectHandler handler_; }; template <typename Protocol, typename SocketService, typename Iterator, typename ConnectCondition, typename ComposedConnectHandler> inline void* asio_handler_allocate(std::size_t size, @@ -278,12 +283,22 @@ namespace detail ConnectCondition, ComposedConnectHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename Protocol, typename SocketService, typename Iterator, + typename ConnectCondition, typename ComposedConnectHandler> + inline bool asio_handler_is_continuation( + connect_op<Protocol, SocketService, Iterator, + ConnectCondition, ComposedConnectHandler>* this_handler) + { + return boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename Protocol, typename SocketService, typename Iterator, typename ConnectCondition, typename ComposedConnectHandler> inline void asio_handler_invoke(Function& function, connect_op<Protocol, SocketService, Iterator, ConnectCondition, ComposedConnectHandler>* this_handler) @@ -299,91 +314,115 @@ namespace detail connect_op<Protocol, SocketService, Iterator, ConnectCondition, ComposedConnectHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename Protocol, typename SocketService, typename Iterator, - typename ConnectCondition, typename ComposedConnectHandler> - inline connect_op<Protocol, SocketService, Iterator, - ConnectCondition, ComposedConnectHandler> - make_connect_op(basic_socket<Protocol, SocketService>& sock, - const Iterator& begin, const Iterator& end, - const ConnectCondition& connect_condition, - ComposedConnectHandler handler) - { - return connect_op<Protocol, SocketService, Iterator, - ConnectCondition, ComposedConnectHandler>( - sock, begin, end, connect_condition, handler); - } } // namespace detail template <typename Protocol, typename SocketService, typename Iterator, typename ComposedConnectHandler> -inline void async_connect(basic_socket<Protocol, SocketService>& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler, + void (boost::system::error_code, Iterator)) +async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin, BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ComposedConnectHandler. BOOST_ASIO_COMPOSED_CONNECT_HANDLER_CHECK( ComposedConnectHandler, handler, Iterator) type_check; - detail::make_connect_op(s, begin, Iterator(), - detail::default_connect_condition(), - BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler))( - boost::system::error_code(), 1); + detail::async_result_init<ComposedConnectHandler, + void (boost::system::error_code, Iterator)> init( + BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler)); + + detail::connect_op<Protocol, SocketService, Iterator, + detail::default_connect_condition, BOOST_ASIO_HANDLER_TYPE( + ComposedConnectHandler, void (boost::system::error_code, Iterator))>(s, + begin, Iterator(), detail::default_connect_condition(), init.handler)( + boost::system::error_code(), 1); + + return init.result.get(); } template <typename Protocol, typename SocketService, typename Iterator, typename ComposedConnectHandler> -inline void async_connect(basic_socket<Protocol, SocketService>& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler, + void (boost::system::error_code, Iterator)) +async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin, Iterator end, BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ComposedConnectHandler. BOOST_ASIO_COMPOSED_CONNECT_HANDLER_CHECK( ComposedConnectHandler, handler, Iterator) type_check; - detail::make_connect_op(s, begin, end, - detail::default_connect_condition(), - BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler))( - boost::system::error_code(), 1); + detail::async_result_init<ComposedConnectHandler, + void (boost::system::error_code, Iterator)> init( + BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler)); + + detail::connect_op<Protocol, SocketService, Iterator, + detail::default_connect_condition, BOOST_ASIO_HANDLER_TYPE( + ComposedConnectHandler, void (boost::system::error_code, Iterator))>(s, + begin, end, detail::default_connect_condition(), init.handler)( + boost::system::error_code(), 1); + + return init.result.get(); } template <typename Protocol, typename SocketService, typename Iterator, typename ConnectCondition, typename ComposedConnectHandler> -inline void async_connect(basic_socket<Protocol, SocketService>& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler, + void (boost::system::error_code, Iterator)) +async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin, ConnectCondition connect_condition, BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ComposedConnectHandler. BOOST_ASIO_COMPOSED_CONNECT_HANDLER_CHECK( ComposedConnectHandler, handler, Iterator) type_check; - detail::make_connect_op(s, begin, Iterator(), connect_condition, - BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler))( - boost::system::error_code(), 1); + detail::async_result_init<ComposedConnectHandler, + void (boost::system::error_code, Iterator)> init( + BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler)); + + detail::connect_op<Protocol, SocketService, Iterator, + ConnectCondition, BOOST_ASIO_HANDLER_TYPE( + ComposedConnectHandler, void (boost::system::error_code, Iterator))>(s, + begin, Iterator(), connect_condition, init.handler)( + boost::system::error_code(), 1); + + return init.result.get(); } template <typename Protocol, typename SocketService, typename Iterator, typename ConnectCondition, typename ComposedConnectHandler> -void async_connect(basic_socket<Protocol, SocketService>& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler, + void (boost::system::error_code, Iterator)) +async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin, Iterator end, ConnectCondition connect_condition, BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ComposedConnectHandler. BOOST_ASIO_COMPOSED_CONNECT_HANDLER_CHECK( ComposedConnectHandler, handler, Iterator) type_check; - detail::make_connect_op(s, begin, end, connect_condition, - BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler))( - boost::system::error_code(), 1); + detail::async_result_init<ComposedConnectHandler, + void (boost::system::error_code, Iterator)> init( + BOOST_ASIO_MOVE_CAST(ComposedConnectHandler)(handler)); + + detail::connect_op<Protocol, SocketService, Iterator, + ConnectCondition, BOOST_ASIO_HANDLER_TYPE( + ComposedConnectHandler, void (boost::system::error_code, Iterator))>(s, + begin, end, connect_condition, init.handler)( + boost::system::error_code(), 1); + + return init.result.get(); } } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/error.ipp b/3rdParty/Boost/src/boost/asio/impl/error.ipp index cfb7a99..ae43418 100644 --- a/3rdParty/Boost/src/boost/asio/impl/error.ipp +++ b/3rdParty/Boost/src/boost/asio/impl/error.ipp @@ -1,11 +1,11 @@ // // impl/error.ipp // ~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_ERROR_IPP @@ -13,28 +13,29 @@ #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include <boost/asio/detail/config.hpp> +#include <string> #include <boost/asio/error.hpp> #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { namespace error { -#if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) +#if !defined(BOOST_ASIO_WINDOWS) && !defined(__CYGWIN__) namespace detail { class netdb_category : public boost::system::error_category { public: - const char* name() const + const char* name() const BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.netdb"; } std::string message(int value) const { @@ -60,13 +61,13 @@ const boost::system::error_category& get_netdb_category() namespace detail { class addrinfo_category : public boost::system::error_category { public: - const char* name() const + const char* name() const BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.addrinfo"; } std::string message(int value) const { @@ -83,20 +84,20 @@ public: const boost::system::error_category& get_addrinfo_category() { static detail::addrinfo_category instance; return instance; } -#endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) +#endif // !defined(BOOST_ASIO_WINDOWS) && !defined(__CYGWIN__) namespace detail { class misc_category : public boost::system::error_category { public: - const char* name() const + const char* name() const BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.misc"; } std::string message(int value) const { diff --git a/3rdParty/Boost/src/boost/asio/impl/handler_alloc_hook.ipp b/3rdParty/Boost/src/boost/asio/impl/handler_alloc_hook.ipp new file mode 100644 index 0000000..2561f3b --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/impl/handler_alloc_hook.ipp @@ -0,0 +1,79 @@ +// +// impl/handler_alloc_hook.ipp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP +#define BOOST_ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/config.hpp> +#include <boost/asio/detail/call_stack.hpp> +#include <boost/asio/handler_alloc_hook.hpp> + +#if !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) +# if defined(BOOST_ASIO_HAS_IOCP) +# include <boost/asio/detail/win_iocp_thread_info.hpp> +# else // defined(BOOST_ASIO_HAS_IOCP) +# include <boost/asio/detail/task_io_service_thread_info.hpp> +# endif // defined(BOOST_ASIO_HAS_IOCP) +#endif // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) + +#include <boost/asio/detail/push_options.hpp> + +namespace boost { +namespace asio { + +#if defined(BOOST_ASIO_HAS_IOCP) +namespace detail { class win_iocp_io_service; } +#endif // defined(BOOST_ASIO_HAS_IOCP) + +void* asio_handler_allocate(std::size_t size, ...) +{ +#if !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) +# if defined(BOOST_ASIO_HAS_IOCP) + typedef detail::win_iocp_io_service io_service_impl; + typedef detail::win_iocp_thread_info thread_info; +# else // defined(BOOST_ASIO_HAS_IOCP) + typedef detail::task_io_service io_service_impl; + typedef detail::task_io_service_thread_info thread_info; +# endif // defined(BOOST_ASIO_HAS_IOCP) + typedef detail::call_stack<io_service_impl, thread_info> call_stack; + return thread_info::allocate(call_stack::top(), size); +#else // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) + return ::operator new(size); +#endif // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) +} + +void asio_handler_deallocate(void* pointer, std::size_t size, ...) +{ +#if !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) +# if defined(BOOST_ASIO_HAS_IOCP) + typedef detail::win_iocp_io_service io_service_impl; + typedef detail::win_iocp_thread_info thread_info; +# else // defined(BOOST_ASIO_HAS_IOCP) + typedef detail::task_io_service io_service_impl; + typedef detail::task_io_service_thread_info thread_info; +# endif // defined(BOOST_ASIO_HAS_IOCP) + typedef detail::call_stack<io_service_impl, thread_info> call_stack; + thread_info::deallocate(call_stack::top(), pointer, size); +#else // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) + (void)size; + ::operator delete(pointer); +#endif // !defined(BOOST_ASIO_DISABLE_SMALL_BLOCK_RECYCLING) +} + +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP diff --git a/3rdParty/Boost/src/boost/asio/impl/io_service.hpp b/3rdParty/Boost/src/boost/asio/impl/io_service.hpp index 510de0e..4c6f2e1 100644 --- a/3rdParty/Boost/src/boost/asio/impl/io_service.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/io_service.hpp @@ -1,11 +1,11 @@ // // impl/io_service.hpp // ~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_IO_SERVICE_HPP @@ -74,30 +74,43 @@ inline bool has_service(io_service& ios) #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { template <typename CompletionHandler> -inline void io_service::dispatch( - BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) +inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionHandler, void ()) +io_service::dispatch(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a CompletionHandler. BOOST_ASIO_COMPLETION_HANDLER_CHECK(CompletionHandler, handler) type_check; - impl_.dispatch(BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)); + detail::async_result_init< + CompletionHandler, void ()> init( + BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)); + + impl_.dispatch(init.handler); + + return init.result.get(); } template <typename CompletionHandler> -inline void io_service::post(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) +inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionHandler, void ()) +io_service::post(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a CompletionHandler. BOOST_ASIO_COMPLETION_HANDLER_CHECK(CompletionHandler, handler) type_check; - impl_.post(BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)); + detail::async_result_init< + CompletionHandler, void ()> init( + BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)); + + impl_.post(init.handler); + + return init.result.get(); } template <typename Handler> #if defined(GENERATING_DOCUMENTATION) unspecified #else diff --git a/3rdParty/Boost/src/boost/asio/impl/io_service.ipp b/3rdParty/Boost/src/boost/asio/impl/io_service.ipp index 1e3af48..0bb5bbf 100644 --- a/3rdParty/Boost/src/boost/asio/impl/io_service.ipp +++ b/3rdParty/Boost/src/boost/asio/impl/io_service.ipp @@ -1,11 +1,11 @@ // // impl/io_service.ipp // ~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_IO_SERVICE_IPP @@ -13,14 +13,14 @@ #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include <boost/asio/detail/config.hpp> -#include <boost/limits.hpp> #include <boost/asio/io_service.hpp> +#include <boost/asio/detail/limits.hpp> #include <boost/asio/detail/scoped_ptr.hpp> #include <boost/asio/detail/service_registry.hpp> #include <boost/asio/detail/throw_error.hpp> #if defined(BOOST_ASIO_HAS_IOCP) # include <boost/asio/detail/win_iocp_io_service.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/read.hpp b/3rdParty/Boost/src/boost/asio/impl/read.hpp index 9290cd4..86f8776 100644 --- a/3rdParty/Boost/src/boost/asio/impl/read.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/read.hpp @@ -1,11 +1,11 @@ // // impl/read.hpp // ~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_READ_HPP @@ -21,12 +21,13 @@ #include <boost/asio/detail/array_fwd.hpp> #include <boost/asio/detail/base_from_completion_cond.hpp> #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/consuming_buffers.hpp> #include <boost/asio/detail/dependent_type.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/error.hpp> #include <boost/asio/detail/push_options.hpp> @@ -80,13 +81,13 @@ inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, boost::system::error_code ec; std::size_t bytes_transferred = read(s, buffers, completion_condition, ec); boost::asio::detail::throw_error(ec, "read"); return bytes_transferred; } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) template <typename SyncReadStream, typename Allocator, typename CompletionCondition> std::size_t read(SyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, boost::system::error_code& ec) @@ -135,13 +136,13 @@ inline std::size_t read(SyncReadStream& s, boost::system::error_code ec; std::size_t bytes_transferred = read(s, b, completion_condition, ec); boost::asio::detail::throw_error(ec, "read"); return bytes_transferred; } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename AsyncReadStream, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> class read_op @@ -151,41 +152,44 @@ namespace detail 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), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_op(read_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { - switch (start) + switch (start_ = start) { case 1: buffers_.prepare(this->check_for_completion(ec, total_transferred_)); for (;;) { stream_.async_read_some(buffers_, @@ -204,12 +208,13 @@ namespace detail } //private: AsyncReadStream& stream_; boost::asio::detail::consuming_buffers< mutable_buffer, MutableBufferSequence> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncReadStream, typename CompletionCondition, typename ReadHandler> @@ -222,42 +227,45 @@ namespace detail const boost::asio::mutable_buffers_1& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_op(const read_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_op(read_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { stream_.async_read_some( @@ -275,12 +283,13 @@ namespace detail } } //private: AsyncReadStream& stream_; boost::asio::mutable_buffer buffer_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Elem, typename CompletionCondition, typename ReadHandler> @@ -292,31 +301,34 @@ namespace detail read_op(AsyncReadStream& stream, const boost::array<Elem, 2>& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_op(read_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -327,13 +339,13 @@ namespace detail boost::array<boost::asio::mutable_buffer, 2> >::type bufs = {{ boost::asio::mutable_buffer(buffers_[0]), boost::asio::mutable_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -354,12 +366,13 @@ namespace detail } } //private: AsyncReadStream& stream_; boost::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; #if defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -373,31 +386,34 @@ namespace detail read_op(AsyncReadStream& stream, const std::array<Elem, 2>& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_op(read_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -408,13 +424,13 @@ namespace detail std::array<boost::asio::mutable_buffer, 2> >::type bufs = {{ boost::asio::mutable_buffer(buffers_[0]), boost::asio::mutable_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -435,12 +451,13 @@ namespace detail } } //private: AsyncReadStream& stream_; std::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; #endif // defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -461,12 +478,23 @@ namespace detail CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename MutableBufferSequence, + typename CompletionCondition, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_op<AsyncReadStream, MutableBufferSequence, + CompletionCondition, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler>* this_handler) @@ -482,56 +510,64 @@ namespace detail read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename MutableBufferSequence, - typename CompletionCondition, typename ReadHandler> - inline read_op<AsyncReadStream, MutableBufferSequence, - CompletionCondition, ReadHandler> - make_read_op(AsyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, ReadHandler handler) - { - return read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, - ReadHandler>(s, buffers, completion_condition, handler); - } } // namespace detail template <typename AsyncReadStream, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> -inline void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_op( - s, buffers, completion_condition, - BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_op<AsyncReadStream, MutableBufferSequence, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + s, buffers, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncReadStream, typename MutableBufferSequence, typename ReadHandler> -inline void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_op( - s, buffers, transfer_all(), BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_op<AsyncReadStream, MutableBufferSequence, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + s, buffers, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename AsyncReadStream, typename Allocator, typename CompletionCondition, typename ReadHandler> class read_streambuf_op @@ -542,42 +578,45 @@ namespace detail basic_streambuf<Allocator>& streambuf, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), streambuf_(streambuf), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_streambuf_op(const read_streambuf_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), streambuf_(other.streambuf_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_streambuf_op(read_streambuf_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), streambuf_(other.streambuf_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size, bytes_available; - switch (start) + switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, total_transferred_); bytes_available = read_size_helper(streambuf_, max_size); for (;;) { @@ -596,12 +635,13 @@ namespace detail } } //private: AsyncReadStream& stream_; boost::asio::basic_streambuf<Allocator>& streambuf_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Allocator, typename CompletionCondition, typename ReadHandler> @@ -620,12 +660,23 @@ namespace detail CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename Allocator, + typename CompletionCondition, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_streambuf_op<AsyncReadStream, Allocator, + CompletionCondition, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename Allocator, typename CompletionCondition, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_streambuf_op<AsyncReadStream, Allocator, CompletionCondition, ReadHandler>* this_handler) { @@ -639,57 +690,65 @@ namespace detail read_streambuf_op<AsyncReadStream, Allocator, CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename Allocator, - typename CompletionCondition, typename ReadHandler> - inline read_streambuf_op<AsyncReadStream, Allocator, - CompletionCondition, ReadHandler> - make_read_streambuf_op( - AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, - CompletionCondition completion_condition, ReadHandler handler) - { - return read_streambuf_op<AsyncReadStream, Allocator, CompletionCondition, - ReadHandler>(s, b, completion_condition, handler); - } } // namespace detail template <typename AsyncReadStream, typename Allocator, typename CompletionCondition, typename ReadHandler> -inline void async_read(AsyncReadStream& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_streambuf_op( - s, b, completion_condition, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_streambuf_op<AsyncReadStream, Allocator, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + s, b, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncReadStream, typename Allocator, typename ReadHandler> -inline void async_read(AsyncReadStream& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_streambuf_op( - s, b, transfer_all(), BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_streambuf_op<AsyncReadStream, Allocator, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE( + ReadHandler, void (boost::system::error_code, std::size_t))>( + s, b, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/read_at.hpp b/3rdParty/Boost/src/boost/asio/impl/read_at.hpp index 08e37fe..877a7c7 100644 --- a/3rdParty/Boost/src/boost/asio/impl/read_at.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/read_at.hpp @@ -1,11 +1,11 @@ // // impl/read_at.hpp // ~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_READ_AT_HPP @@ -21,12 +21,13 @@ #include <boost/asio/detail/array_fwd.hpp> #include <boost/asio/detail/base_from_completion_cond.hpp> #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/consuming_buffers.hpp> #include <boost/asio/detail/dependent_type.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/error.hpp> #include <boost/asio/detail/push_options.hpp> @@ -34,13 +35,13 @@ namespace boost { namespace asio { template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence, typename CompletionCondition> std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers, + uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, boost::system::error_code& ec) { ec = boost::system::error_code(); boost::asio::detail::consuming_buffers< mutable_buffer, MutableBufferSequence> tmp(buffers); std::size_t total_transferred = 0; @@ -57,48 +58,48 @@ std::size_t read_at(SyncRandomAccessReadDevice& d, } return total_transferred; } template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence> inline std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers) + uint64_t offset, const MutableBufferSequence& buffers) { boost::system::error_code ec; std::size_t bytes_transferred = read_at( d, offset, buffers, transfer_all(), ec); boost::asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence> inline std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers, + uint64_t offset, const MutableBufferSequence& buffers, boost::system::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, - boost::uint64_t offset, const MutableBufferSequence& buffers, + uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition) { boost::system::error_code ec; std::size_t bytes_transferred = read_at( d, offset, buffers, completion_condition, ec); boost::asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) template <typename SyncRandomAccessReadDevice, typename Allocator, typename CompletionCondition> std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, boost::system::error_code& ec) { ec = boost::system::error_code(); std::size_t total_transferred = 0; std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, total_transferred)); @@ -115,92 +116,95 @@ std::size_t read_at(SyncRandomAccessReadDevice& d, } return total_transferred; } template <typename SyncRandomAccessReadDevice, typename Allocator> inline std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b) + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b) { boost::system::error_code ec; std::size_t bytes_transferred = read_at( d, offset, b, transfer_all(), ec); boost::asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } template <typename SyncRandomAccessReadDevice, typename Allocator> inline std::size_t read_at(SyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, boost::system::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, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition) { boost::system::error_code ec; std::size_t bytes_transferred = read_at( d, offset, b, completion_condition, ec); boost::asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> class read_at_op : detail::base_from_completion_cond<CompletionCondition> { public: read_at_op(AsyncRandomAccessReadDevice& device, - boost::uint64_t offset, const MutableBufferSequence& buffers, + 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), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { - switch (start) + switch (start_ = start) { case 1: buffers_.prepare(this->check_for_completion(ec, total_transferred_)); for (;;) { device_.async_read_some_at(offset_ + total_transferred_, @@ -217,66 +221,70 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::detail::consuming_buffers< mutable_buffer, MutableBufferSequence> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncRandomAccessReadDevice, typename CompletionCondition, typename ReadHandler> class read_at_op<AsyncRandomAccessReadDevice, boost::asio::mutable_buffers_1, CompletionCondition, ReadHandler> : detail::base_from_completion_cond<CompletionCondition> { public: read_at_op(AsyncRandomAccessReadDevice& device, - boost::uint64_t offset, const boost::asio::mutable_buffers_1& buffers, + uint64_t offset, const boost::asio::mutable_buffers_1& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_at_op(const read_at_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_at_op(read_at_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { device_.async_read_some_at(offset_ + total_transferred_, @@ -293,54 +301,58 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::mutable_buffer buffer_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncRandomAccessReadDevice, typename Elem, typename CompletionCondition, typename ReadHandler> class read_at_op<AsyncRandomAccessReadDevice, boost::array<Elem, 2>, CompletionCondition, ReadHandler> : detail::base_from_completion_cond<CompletionCondition> { public: read_at_op(AsyncRandomAccessReadDevice& device, - boost::uint64_t offset, const boost::array<Elem, 2>& buffers, + uint64_t offset, const boost::array<Elem, 2>& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -351,13 +363,13 @@ namespace detail boost::array<boost::asio::mutable_buffer, 2> >::type bufs = {{ boost::asio::mutable_buffer(buffers_[0]), boost::asio::mutable_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -378,14 +390,15 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; #if defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -394,40 +407,43 @@ namespace detail class read_at_op<AsyncRandomAccessReadDevice, std::array<Elem, 2>, CompletionCondition, ReadHandler> : detail::base_from_completion_cond<CompletionCondition> { public: read_at_op(AsyncRandomAccessReadDevice& device, - boost::uint64_t offset, const std::array<Elem, 2>& buffers, + uint64_t offset, const std::array<Elem, 2>& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -438,13 +454,13 @@ namespace detail std::array<boost::asio::mutable_buffer, 2> >::type bufs = {{ boost::asio::mutable_buffer(buffers_[0]), boost::asio::mutable_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -465,14 +481,15 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; std::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; #endif // defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -495,12 +512,24 @@ namespace detail CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncRandomAccessReadDevice, + typename MutableBufferSequence, typename CompletionCondition, + typename ReadHandler> + inline bool asio_handler_is_continuation( + read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, + CompletionCondition, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncRandomAccessReadDevice, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, CompletionCondition, ReadHandler>* this_handler) @@ -523,104 +552,125 @@ namespace detail template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> inline read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, CompletionCondition, ReadHandler> make_read_at_op(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers, + uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ReadHandler handler) { return read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, CompletionCondition, ReadHandler>( d, offset, buffers, completion_condition, handler); } } // namespace detail template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence, typename CompletionCondition, typename ReadHandler> -inline void async_read_at(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_at(AsyncRandomAccessReadDevice& d, + uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_at_op( - d, offset, buffers, completion_condition, - BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + d, offset, buffers, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence, typename ReadHandler> -inline void async_read_at(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, const MutableBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_at(AsyncRandomAccessReadDevice& d, + uint64_t offset, const MutableBufferSequence& buffers, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_at_op( - d, offset, buffers, transfer_all(), - BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + d, offset, buffers, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_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, - boost::uint64_t offset, basic_streambuf<Allocator>& streambuf, + 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_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_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_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size, bytes_available; - switch (start) + switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, total_transferred_); bytes_available = read_size_helper(streambuf_, max_size); for (;;) { @@ -639,14 +689,15 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::basic_streambuf<Allocator>& streambuf_; + int start_; std::size_t total_transferred_; ReadHandler handler_; }; template <typename AsyncRandomAccessReadDevice, typename Allocator, typename CompletionCondition, typename ReadHandler> @@ -665,12 +716,23 @@ namespace detail CompletionCondition, ReadHandler>* this_handler) { boost_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 + : boost_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) { @@ -684,61 +746,66 @@ namespace detail read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator, CompletionCondition, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncRandomAccessReadDevice, typename Allocator, - typename CompletionCondition, typename ReadHandler> - inline read_at_streambuf_op<AsyncRandomAccessReadDevice, - Allocator, CompletionCondition, ReadHandler> - make_read_at_streambuf_op(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, - CompletionCondition completion_condition, ReadHandler handler) - { - return read_at_streambuf_op<AsyncRandomAccessReadDevice, - Allocator, CompletionCondition, ReadHandler>( - d, offset, b, completion_condition, handler); - } } // namespace detail template <typename AsyncRandomAccessReadDevice, typename Allocator, typename CompletionCondition, typename ReadHandler> -inline void async_read_at(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_at(AsyncRandomAccessReadDevice& d, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_at_streambuf_op( - d, offset, b, completion_condition, - BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + d, offset, b, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncRandomAccessReadDevice, typename Allocator, typename ReadHandler> -inline void async_read_at(AsyncRandomAccessReadDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, +inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_at(AsyncRandomAccessReadDevice& d, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_at_streambuf_op( - d, offset, b, transfer_all(), - BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + d, offset, b, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/read_until.hpp b/3rdParty/Boost/src/boost/asio/impl/read_until.hpp index 1b9a8f3..349c447 100644 --- a/3rdParty/Boost/src/boost/asio/impl/read_until.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/read_until.hpp @@ -1,11 +1,11 @@ // // impl/read_until.hpp // ~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_READ_UNTIL_HPP @@ -16,19 +16,20 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include <algorithm> #include <string> #include <vector> #include <utility> -#include <boost/limits.hpp> #include <boost/asio/buffer.hpp> #include <boost/asio/buffers_iterator.hpp> #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> +#include <boost/asio/detail/limits.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { @@ -186,12 +187,14 @@ std::size_t read_until(SyncReadStream& s, b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } +#if defined(BOOST_ASIO_HAS_BOOST_REGEX) + template <typename SyncReadStream, typename Allocator> inline std::size_t read_until(SyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, const boost::regex& expr) { boost::system::error_code ec; std::size_t bytes_transferred = read_until(s, b, expr, ec); @@ -253,17 +256,19 @@ std::size_t read_until(SyncReadStream& s, b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } +#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX) + template <typename SyncReadStream, typename Allocator, typename MatchCondition> std::size_t read_until(SyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, MatchCondition match_condition, boost::system::error_code& ec, - typename boost::enable_if<is_match_condition<MatchCondition> >::type*) + typename enable_if<is_match_condition<MatchCondition>::value>::type*) { std::size_t search_position = 0; for (;;) { // Determine the range of the data to be searched. typedef typename boost::asio::basic_streambuf< @@ -308,13 +313,13 @@ std::size_t read_until(SyncReadStream& s, } } template <typename SyncReadStream, typename Allocator, typename MatchCondition> inline std::size_t read_until(SyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, MatchCondition match_condition, - typename boost::enable_if<is_match_condition<MatchCondition> >::type*) + typename enable_if<is_match_condition<MatchCondition>::value>::type*) { boost::system::error_code ec; std::size_t bytes_transferred = read_until(s, b, match_condition, ec); boost::asio::detail::throw_error(ec, "read_until"); return bytes_transferred; } @@ -328,43 +333,46 @@ namespace detail read_until_delim_op(AsyncReadStream& stream, boost::asio::basic_streambuf<Allocator>& streambuf, char delim, ReadHandler& handler) : stream_(stream), streambuf_(streambuf), delim_(delim), + start_(0), search_position_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_until_delim_op(const read_until_delim_op& other) : stream_(other.stream_), streambuf_(other.streambuf_), 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_), streambuf_(other.streambuf_), delim_(other.delim_), + start_(other.start_), search_position_(other.search_position_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::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) + switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. @@ -427,12 +435,13 @@ namespace detail } //private: AsyncReadStream& stream_; boost::asio::basic_streambuf<Allocator>& streambuf_; char delim_; + int start_; std::size_t search_position_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Allocator, typename ReadHandler> inline void* asio_handler_allocate(std::size_t size, @@ -449,12 +458,22 @@ namespace detail Allocator, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename Allocator, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_until_delim_op<AsyncReadStream, + Allocator, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename Allocator, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_until_delim_op<AsyncReadStream, Allocator, ReadHandler>* this_handler) { @@ -468,36 +487,36 @@ namespace detail read_until_delim_op<AsyncReadStream, Allocator, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename Allocator, typename ReadHandler> - inline read_until_delim_op<AsyncReadStream, Allocator, ReadHandler> - make_read_until_delim_op(AsyncReadStream& s, - boost::asio::basic_streambuf<Allocator>& b, - char delim, ReadHandler handler) - { - return read_until_delim_op<AsyncReadStream, Allocator, ReadHandler>( - s, b, delim, handler); - } } // namespace detail template <typename AsyncReadStream, typename Allocator, typename ReadHandler> -void async_read_until(AsyncReadStream& s, +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_until(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, char delim, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_until_delim_op( - s, b, delim, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_until_delim_op<AsyncReadStream, + Allocator, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + s, b, delim, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } namespace detail { template <typename AsyncReadStream, typename Allocator, typename ReadHandler> class read_until_delim_string_op @@ -506,43 +525,46 @@ namespace detail read_until_delim_string_op(AsyncReadStream& stream, boost::asio::basic_streambuf<Allocator>& streambuf, const std::string& delim, ReadHandler& handler) : stream_(stream), streambuf_(streambuf), delim_(delim), + start_(0), search_position_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_until_delim_string_op(const read_until_delim_string_op& other) : stream_(other.stream_), streambuf_(other.streambuf_), 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_), streambuf_(other.streambuf_), delim_(BOOST_ASIO_MOVE_CAST(std::string)(other.delim_)), + start_(other.start_), search_position_(other.search_position_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::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) + switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. @@ -616,12 +638,13 @@ namespace detail } //private: AsyncReadStream& stream_; boost::asio::basic_streambuf<Allocator>& streambuf_; std::string delim_; + int start_; std::size_t search_position_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Allocator, typename ReadHandler> inline void* asio_handler_allocate(std::size_t size, @@ -638,12 +661,22 @@ namespace detail Allocator, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename Allocator, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_until_delim_string_op<AsyncReadStream, + Allocator, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename Allocator, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_until_delim_string_op<AsyncReadStream, Allocator, ReadHandler>* this_handler) { @@ -657,38 +690,40 @@ namespace detail read_until_delim_string_op<AsyncReadStream, Allocator, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename Allocator, typename ReadHandler> - inline read_until_delim_string_op<AsyncReadStream, Allocator, ReadHandler> - make_read_until_delim_string_op(AsyncReadStream& s, - boost::asio::basic_streambuf<Allocator>& b, - const std::string& delim, ReadHandler handler) - { - return read_until_delim_string_op<AsyncReadStream, Allocator, ReadHandler>( - s, b, delim, handler); - } } // namespace detail template <typename AsyncReadStream, typename Allocator, typename ReadHandler> -void async_read_until(AsyncReadStream& s, +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_until(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, const std::string& delim, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_until_delim_string_op( - s, b, delim, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_until_delim_string_op<AsyncReadStream, + Allocator, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + s, b, delim, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } +#if defined(BOOST_ASIO_HAS_BOOST_REGEX) + namespace detail { template <typename AsyncReadStream, typename Allocator, typename RegEx, typename ReadHandler> class read_until_expr_op { @@ -696,43 +731,46 @@ namespace detail read_until_expr_op(AsyncReadStream& stream, boost::asio::basic_streambuf<Allocator>& streambuf, const boost::regex& expr, ReadHandler& handler) : stream_(stream), streambuf_(streambuf), expr_(expr), + start_(0), search_position_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_until_expr_op(const read_until_expr_op& other) : stream_(other.stream_), streambuf_(other.streambuf_), 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_), streambuf_(other.streambuf_), expr_(other.expr_), + start_(other.start_), search_position_(other.search_position_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::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) + switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. @@ -809,12 +847,13 @@ namespace detail } //private: AsyncReadStream& stream_; boost::asio::basic_streambuf<Allocator>& streambuf_; RegEx expr_; + int start_; std::size_t search_position_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Allocator, typename RegEx, typename ReadHandler> @@ -833,12 +872,23 @@ namespace detail Allocator, RegEx, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename Allocator, + typename RegEx, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_until_expr_op<AsyncReadStream, + Allocator, RegEx, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename Allocator, typename RegEx, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_until_expr_op<AsyncReadStream, Allocator, RegEx, ReadHandler>* this_handler) { @@ -852,39 +902,40 @@ namespace detail read_until_expr_op<AsyncReadStream, Allocator, RegEx, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename Allocator, - typename RegEx, typename ReadHandler> - inline read_until_expr_op<AsyncReadStream, Allocator, RegEx, ReadHandler> - make_read_until_expr_op(AsyncReadStream& s, - boost::asio::basic_streambuf<Allocator>& b, - const RegEx& expr, ReadHandler handler) - { - return read_until_expr_op<AsyncReadStream, Allocator, RegEx, ReadHandler>( - s, b, expr, handler); - } } // namespace detail template <typename AsyncReadStream, typename Allocator, typename ReadHandler> -void async_read_until(AsyncReadStream& s, +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_until(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, const boost::regex& expr, BOOST_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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_until_expr_op( - s, b, expr, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_until_expr_op<AsyncReadStream, Allocator, + boost::regex, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + s, b, expr, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } +#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX) + namespace detail { template <typename AsyncReadStream, typename Allocator, typename MatchCondition, typename ReadHandler> class read_until_match_op { @@ -892,43 +943,46 @@ namespace detail read_until_match_op(AsyncReadStream& stream, boost::asio::basic_streambuf<Allocator>& streambuf, MatchCondition match_condition, ReadHandler& handler) : stream_(stream), streambuf_(streambuf), match_condition_(match_condition), + start_(0), search_position_(0), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) read_until_match_op(const read_until_match_op& other) : stream_(other.stream_), streambuf_(other.streambuf_), 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_), streambuf_(other.streambuf_), match_condition_(other.match_condition_), + start_(other.start_), search_position_(other.search_position_), handler_(BOOST_ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::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) + switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. @@ -1001,12 +1055,13 @@ namespace detail } //private: AsyncReadStream& stream_; boost::asio::basic_streambuf<Allocator>& streambuf_; MatchCondition match_condition_; + int start_; std::size_t search_position_; ReadHandler handler_; }; template <typename AsyncReadStream, typename Allocator, typename MatchCondition, typename ReadHandler> @@ -1025,12 +1080,23 @@ namespace detail Allocator, MatchCondition, ReadHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncReadStream, typename Allocator, + typename MatchCondition, typename ReadHandler> + inline bool asio_handler_is_continuation( + read_until_match_op<AsyncReadStream, + Allocator, MatchCondition, ReadHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncReadStream, typename Allocator, typename MatchCondition, typename ReadHandler> inline void asio_handler_invoke(Function& function, read_until_match_op<AsyncReadStream, Allocator, MatchCondition, ReadHandler>* this_handler) { @@ -1044,41 +1110,38 @@ namespace detail read_until_match_op<AsyncReadStream, Allocator, MatchCondition, ReadHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncReadStream, typename Allocator, - typename MatchCondition, typename ReadHandler> - inline read_until_match_op<AsyncReadStream, Allocator, - MatchCondition, ReadHandler> - make_read_until_match_op(AsyncReadStream& s, - boost::asio::basic_streambuf<Allocator>& b, - MatchCondition match_condition, ReadHandler handler) - { - return read_until_match_op<AsyncReadStream, - Allocator, MatchCondition, ReadHandler>( - s, b, match_condition, handler); - } } // namespace detail template <typename AsyncReadStream, typename Allocator, typename MatchCondition, typename ReadHandler> -void async_read_until(AsyncReadStream& s, +BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t)) +async_read_until(AsyncReadStream& s, boost::asio::basic_streambuf<Allocator>& b, MatchCondition match_condition, BOOST_ASIO_MOVE_ARG(ReadHandler) handler, - typename boost::enable_if<is_match_condition<MatchCondition> >::type*) + 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. BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - detail::make_read_until_match_op( - s, b, match_condition, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + ReadHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); + + detail::read_until_match_op<AsyncReadStream, Allocator, + MatchCondition, BOOST_ASIO_HANDLER_TYPE(ReadHandler, + void (boost::system::error_code, std::size_t))>( + s, b, match_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/serial_port_base.hpp b/3rdParty/Boost/src/boost/asio/impl/serial_port_base.hpp index 3066045..92be00d 100644 --- a/3rdParty/Boost/src/boost/asio/impl/serial_port_base.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/serial_port_base.hpp @@ -1,11 +1,11 @@ // // impl/serial_port_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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) // diff --git a/3rdParty/Boost/src/boost/asio/impl/serial_port_base.ipp b/3rdParty/Boost/src/boost/asio/impl/serial_port_base.ipp index 0344fa5..51f66c1 100644 --- a/3rdParty/Boost/src/boost/asio/impl/serial_port_base.ipp +++ b/3rdParty/Boost/src/boost/asio/impl/serial_port_base.ipp @@ -1,11 +1,11 @@ // // impl/serial_port_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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) // @@ -18,19 +18,19 @@ #include <boost/asio/detail/config.hpp> #if defined(BOOST_ASIO_HAS_SERIAL_PORT) #include <stdexcept> -#include <boost/throw_exception.hpp> #include <boost/asio/error.hpp> #include <boost/asio/serial_port_base.hpp> +#include <boost/asio/detail/throw_exception.hpp> #if defined(GENERATING_DOCUMENTATION) # define BOOST_ASIO_OPTION_STORAGE implementation_defined -#elif defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#elif defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) # define BOOST_ASIO_OPTION_STORAGE DCB #else # define BOOST_ASIO_OPTION_STORAGE termios #endif #include <boost/asio/detail/push_options.hpp> @@ -38,13 +38,13 @@ namespace boost { namespace asio { boost::system::error_code serial_port_base::baud_rate::store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) const { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) storage.BaudRate = value_; #else speed_t baud; switch (value_) { // Do POSIX-specified rates first. @@ -108,13 +108,12 @@ boost::system::error_code serial_port_base::baud_rate::store( case 3500000: baud = B3500000; break; # endif # ifdef B4000000 case 4000000: baud = B4000000; break; # endif default: - baud = B0; ec = boost::asio::error::invalid_argument; return ec; } # if defined(_BSD_SOURCE) ::cfsetspeed(&storage, baud); # else @@ -126,13 +125,13 @@ boost::system::error_code serial_port_base::baud_rate::store( return ec; } boost::system::error_code serial_port_base::baud_rate::load( const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) value_ = storage.BaudRate; #else speed_t baud = ::cfgetospeed(&storage); switch (baud) { // First do those specified by POSIX. @@ -212,20 +211,20 @@ 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"); - boost::throw_exception(ex); + boost::asio::detail::throw_exception(ex); } } boost::system::error_code serial_port_base::flow_control::store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) const { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) storage.fOutxCtsFlow = FALSE; storage.fOutxDsrFlow = FALSE; storage.fTXContinueOnXoff = TRUE; storage.fDtrControl = DTR_CONTROL_ENABLE; storage.fDsrSensitivity = FALSE; storage.fOutX = FALSE; @@ -286,13 +285,13 @@ boost::system::error_code serial_port_base::flow_control::store( return ec; } boost::system::error_code serial_port_base::flow_control::load( const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.fOutX && storage.fInX) { value_ = software; } else if (storage.fOutxCtsFlow && storage.fRtsControl == RTS_CONTROL_HANDSHAKE) { @@ -330,20 +329,20 @@ boost::system::error_code serial_port_base::flow_control::load( 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"); - boost::throw_exception(ex); + boost::asio::detail::throw_exception(ex); } } boost::system::error_code serial_port_base::parity::store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) const { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) switch (value_) { case none: storage.fParity = FALSE; storage.Parity = NOPARITY; break; @@ -384,13 +383,13 @@ boost::system::error_code serial_port_base::parity::store( return ec; } boost::system::error_code serial_port_base::parity::load( const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.Parity == EVENPARITY) { value_ = even; } else if (storage.Parity == ODDPARITY) { @@ -425,20 +424,20 @@ 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"); - boost::throw_exception(ex); + boost::asio::detail::throw_exception(ex); } } boost::system::error_code serial_port_base::stop_bits::store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) const { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) switch (value_) { case one: storage.StopBits = ONESTOPBIT; break; case onepointfive: @@ -468,13 +467,13 @@ boost::system::error_code serial_port_base::stop_bits::store( return ec; } boost::system::error_code serial_port_base::stop_bits::load( const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.StopBits == ONESTOPBIT) { value_ = one; } else if (storage.StopBits == ONE5STOPBITS) { @@ -498,20 +497,20 @@ boost::system::error_code serial_port_base::stop_bits::load( 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"); - boost::throw_exception(ex); + boost::asio::detail::throw_exception(ex); } } boost::system::error_code serial_port_base::character_size::store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) const { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) storage.ByteSize = value_; #else storage.c_cflag &= ~CSIZE; switch (value_) { case 5: storage.c_cflag |= CS5; break; @@ -525,13 +524,13 @@ boost::system::error_code serial_port_base::character_size::store( return ec; } boost::system::error_code serial_port_base::character_size::load( const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec) { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) value_ = storage.ByteSize; #else 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; } diff --git a/3rdParty/Boost/src/boost/asio/impl/write.hpp b/3rdParty/Boost/src/boost/asio/impl/write.hpp index 61422e4..ef0c092 100644 --- a/3rdParty/Boost/src/boost/asio/impl/write.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/write.hpp @@ -1,11 +1,11 @@ // // impl/write.hpp // ~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_WRITE_HPP @@ -20,12 +20,13 @@ #include <boost/asio/detail/array_fwd.hpp> #include <boost/asio/detail/base_from_completion_cond.hpp> #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/consuming_buffers.hpp> #include <boost/asio/detail/dependent_type.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/detail/push_options.hpp> @@ -78,13 +79,13 @@ inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, boost::system::error_code ec; std::size_t bytes_transferred = write(s, buffers, completion_condition, ec); boost::asio::detail::throw_error(ec, "write"); return bytes_transferred; } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) template <typename SyncWriteStream, typename Allocator, typename CompletionCondition> std::size_t write(SyncWriteStream& s, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, boost::system::error_code& ec) @@ -121,13 +122,13 @@ inline std::size_t write(SyncWriteStream& s, boost::system::error_code ec; std::size_t bytes_transferred = write(s, b, completion_condition, ec); boost::asio::detail::throw_error(ec, "write"); return bytes_transferred; } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename AsyncWriteStream, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> class write_op @@ -137,41 +138,44 @@ namespace detail 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), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { - switch (start) + switch (start_ = start) { case 1: buffers_.prepare(this->check_for_completion(ec, total_transferred_)); for (;;) { stream_.async_write_some(buffers_, @@ -190,12 +194,13 @@ namespace detail } //private: AsyncWriteStream& stream_; boost::asio::detail::consuming_buffers< const_buffer, ConstBufferSequence> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncWriteStream, typename CompletionCondition, typename WriteHandler> @@ -209,42 +214,45 @@ namespace detail CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) write_op(const write_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { stream_.async_write_some( @@ -262,12 +270,13 @@ namespace detail } } //private: AsyncWriteStream& stream_; boost::asio::mutable_buffer buffer_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncWriteStream, typename CompletionCondition, typename WriteHandler> @@ -281,42 +290,45 @@ namespace detail CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) write_op(const write_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { stream_.async_write_some( @@ -334,12 +346,13 @@ namespace detail } } //private: AsyncWriteStream& stream_; boost::asio::const_buffer buffer_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncWriteStream, typename Elem, typename CompletionCondition, typename WriteHandler> @@ -351,31 +364,34 @@ namespace detail write_op(AsyncWriteStream& stream, const boost::array<Elem, 2>& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -386,13 +402,13 @@ namespace detail boost::array<boost::asio::const_buffer, 2> >::type bufs = {{ boost::asio::const_buffer(buffers_[0]), boost::asio::const_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -413,12 +429,13 @@ namespace detail } } //private: AsyncWriteStream& stream_; boost::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; #if defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -432,31 +449,34 @@ namespace detail write_op(AsyncWriteStream& stream, const std::array<Elem, 2>& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), stream_(other.stream_), buffers_(other.buffers_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -467,13 +487,13 @@ namespace detail std::array<boost::asio::const_buffer, 2> >::type bufs = {{ boost::asio::const_buffer(buffers_[0]), boost::asio::const_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -494,12 +514,13 @@ namespace detail } } //private: AsyncWriteStream& stream_; std::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; #endif // defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -520,12 +541,23 @@ namespace detail CompletionCondition, WriteHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncWriteStream, typename ConstBufferSequence, + typename CompletionCondition, typename WriteHandler> + inline bool asio_handler_is_continuation( + write_op<AsyncWriteStream, ConstBufferSequence, + CompletionCondition, WriteHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncWriteStream, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> inline void asio_handler_invoke(Function& function, write_op<AsyncWriteStream, ConstBufferSequence, CompletionCondition, WriteHandler>* this_handler) @@ -541,56 +573,64 @@ namespace detail write_op<AsyncWriteStream, ConstBufferSequence, CompletionCondition, WriteHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename AsyncWriteStream, typename ConstBufferSequence, - typename CompletionCondition, typename WriteHandler> - inline write_op<AsyncWriteStream, ConstBufferSequence, - CompletionCondition, WriteHandler> - make_write_op(AsyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, WriteHandler handler) - { - return write_op<AsyncWriteStream, ConstBufferSequence, CompletionCondition, - WriteHandler>(s, buffers, completion_condition, handler); - } } // namespace detail template <typename AsyncWriteStream, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> -inline void async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - detail::make_write_op( - s, buffers, completion_condition, - BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + detail::write_op<AsyncWriteStream, ConstBufferSequence, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + s, buffers, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncWriteStream, typename ConstBufferSequence, typename WriteHandler> -inline void async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - detail::make_write_op( - s, buffers, transfer_all(), BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + detail::write_op<AsyncWriteStream, ConstBufferSequence, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + s, buffers, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename Allocator, typename WriteHandler> class write_streambuf_handler { @@ -641,12 +681,20 @@ namespace detail write_streambuf_handler<Allocator, WriteHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename Allocator, typename WriteHandler> + inline bool asio_handler_is_continuation( + write_streambuf_handler<Allocator, WriteHandler>* this_handler) + { + return boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename Allocator, typename WriteHandler> inline void asio_handler_invoke(Function& function, write_streambuf_handler<Allocator, WriteHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); @@ -656,53 +704,63 @@ namespace detail inline void asio_handler_invoke(const Function& function, write_streambuf_handler<Allocator, WriteHandler>* this_handler) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } - - template <typename Allocator, typename WriteHandler> - inline write_streambuf_handler<Allocator, WriteHandler> - make_write_streambuf_handler( - boost::asio::basic_streambuf<Allocator>& b, WriteHandler handler) - { - return write_streambuf_handler<Allocator, WriteHandler>(b, handler); - } } // namespace detail template <typename AsyncWriteStream, typename Allocator, typename CompletionCondition, typename WriteHandler> -inline void async_write(AsyncWriteStream& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write(AsyncWriteStream& s, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + async_write(s, b.data(), completion_condition, - detail::make_write_streambuf_handler( - b, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))); + detail::write_streambuf_handler<Allocator, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + b, init.handler)); + + return init.result.get(); } template <typename AsyncWriteStream, typename Allocator, typename WriteHandler> -inline void async_write(AsyncWriteStream& s, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write(AsyncWriteStream& s, boost::asio::basic_streambuf<Allocator>& b, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + async_write(s, b.data(), transfer_all(), - detail::make_write_streambuf_handler( - b, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))); + detail::write_streambuf_handler<Allocator, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + b, init.handler)); + + return init.result.get(); } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> diff --git a/3rdParty/Boost/src/boost/asio/impl/write_at.hpp b/3rdParty/Boost/src/boost/asio/impl/write_at.hpp index acba02f..0d0dc4b 100644 --- a/3rdParty/Boost/src/boost/asio/impl/write_at.hpp +++ b/3rdParty/Boost/src/boost/asio/impl/write_at.hpp @@ -1,11 +1,11 @@ // // impl/write_at.hpp // ~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 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 BOOST_ASIO_IMPL_WRITE_AT_HPP @@ -20,25 +20,26 @@ #include <boost/asio/detail/array_fwd.hpp> #include <boost/asio/detail/base_from_completion_cond.hpp> #include <boost/asio/detail/bind_handler.hpp> #include <boost/asio/detail/consuming_buffers.hpp> #include <boost/asio/detail/dependent_type.hpp> #include <boost/asio/detail/handler_alloc_helpers.hpp> +#include <boost/asio/detail/handler_cont_helpers.hpp> #include <boost/asio/detail/handler_invoke_helpers.hpp> #include <boost/asio/detail/handler_type_requirements.hpp> #include <boost/asio/detail/throw_error.hpp> #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence, typename CompletionCondition> std::size_t write_at(SyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers, + uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, boost::system::error_code& ec) { ec = boost::system::error_code(); boost::asio::detail::consuming_buffers< const_buffer, ConstBufferSequence> tmp(buffers); std::size_t total_transferred = 0; @@ -55,136 +56,139 @@ std::size_t write_at(SyncRandomAccessWriteDevice& d, } return total_transferred; } template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence> inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers) + uint64_t offset, const ConstBufferSequence& buffers) { boost::system::error_code ec; std::size_t bytes_transferred = write_at( d, offset, buffers, transfer_all(), ec); boost::asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence> inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers, + uint64_t offset, const ConstBufferSequence& buffers, boost::system::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, - boost::uint64_t offset, const ConstBufferSequence& buffers, + uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition) { boost::system::error_code ec; std::size_t bytes_transferred = write_at( d, offset, buffers, completion_condition, ec); boost::asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) template <typename SyncRandomAccessWriteDevice, typename Allocator, typename CompletionCondition> std::size_t write_at(SyncRandomAccessWriteDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, boost::system::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, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b) + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b) { boost::system::error_code ec; std::size_t bytes_transferred = write_at(d, offset, b, transfer_all(), ec); boost::asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } template <typename SyncRandomAccessWriteDevice, typename Allocator> inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, boost::system::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, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition) { boost::system::error_code ec; std::size_t bytes_transferred = write_at( d, offset, b, completion_condition, ec); boost::asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> class write_at_op : detail::base_from_completion_cond<CompletionCondition> { public: write_at_op(AsyncRandomAccessWriteDevice& device, - boost::uint64_t offset, const ConstBufferSequence& buffers, + 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), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { - switch (start) + switch (start_ = start) { case 1: buffers_.prepare(this->check_for_completion(ec, total_transferred_)); for (;;) { device_.async_write_some_at( @@ -202,67 +206,71 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessWriteDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::detail::consuming_buffers< const_buffer, ConstBufferSequence> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncRandomAccessWriteDevice, typename CompletionCondition, typename WriteHandler> class write_at_op<AsyncRandomAccessWriteDevice, boost::asio::mutable_buffers_1, CompletionCondition, WriteHandler> : detail::base_from_completion_cond<CompletionCondition> { public: write_at_op(AsyncRandomAccessWriteDevice& device, - boost::uint64_t offset, const boost::asio::mutable_buffers_1& buffers, + uint64_t offset, const boost::asio::mutable_buffers_1& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) write_at_op(const write_at_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_at_op(write_at_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { device_.async_write_some_at(offset_ + total_transferred_, @@ -279,66 +287,70 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessWriteDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::mutable_buffer buffer_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncRandomAccessWriteDevice, typename CompletionCondition, typename WriteHandler> class write_at_op<AsyncRandomAccessWriteDevice, boost::asio::const_buffers_1, CompletionCondition, WriteHandler> : detail::base_from_completion_cond<CompletionCondition> { public: write_at_op(AsyncRandomAccessWriteDevice& device, - boost::uint64_t offset, const boost::asio::const_buffers_1& buffers, + uint64_t offset, const boost::asio::const_buffers_1& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffer_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_ASIO_HAS_MOVE) write_at_op(const write_at_op& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } write_at_op(write_at_op&& other) : detail::base_from_completion_cond<CompletionCondition>(other), device_(other.device_), offset_(other.offset_), buffer_(other.buffer_), + start_(other.start_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) void operator()(const boost::system::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { device_.async_write_some_at(offset_ + total_transferred_, @@ -355,54 +367,58 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessWriteDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::asio::const_buffer buffer_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; template <typename AsyncRandomAccessWriteDevice, typename Elem, typename CompletionCondition, typename WriteHandler> class write_at_op<AsyncRandomAccessWriteDevice, boost::array<Elem, 2>, CompletionCondition, WriteHandler> : detail::base_from_completion_cond<CompletionCondition> { public: write_at_op(AsyncRandomAccessWriteDevice& device, - boost::uint64_t offset, const boost::array<Elem, 2>& buffers, + uint64_t offset, const boost::array<Elem, 2>& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -413,13 +429,13 @@ namespace detail boost::array<boost::asio::const_buffer, 2> >::type bufs = {{ boost::asio::const_buffer(buffers_[0]), boost::asio::const_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -440,14 +456,15 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessWriteDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; boost::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; #if defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -456,40 +473,43 @@ namespace detail class write_at_op<AsyncRandomAccessWriteDevice, std::array<Elem, 2>, CompletionCondition, WriteHandler> : detail::base_from_completion_cond<CompletionCondition> { public: write_at_op(AsyncRandomAccessWriteDevice& device, - boost::uint64_t offset, const std::array<Elem, 2>& buffers, + uint64_t offset, const std::array<Elem, 2>& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), + start_(0), total_transferred_(0), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(BOOST_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_), total_transferred_(other.total_transferred_), 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_), total_transferred_(other.total_transferred_), handler_(BOOST_ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(BOOST_ASIO_HAS_MOVE) @@ -500,13 +520,13 @@ namespace detail std::array<boost::asio::const_buffer, 2> >::type bufs = {{ boost::asio::const_buffer(buffers_[0]), boost::asio::const_buffer(buffers_[1]) }}; std::size_t buffer_size0 = boost::asio::buffer_size(bufs[0]); std::size_t buffer_size1 = boost::asio::buffer_size(bufs[1]); std::size_t n = 0; - switch (start) + switch (start_ = start) { case 1: n = this->check_for_completion(ec, total_transferred_); for (;;) { bufs[0] = boost::asio::buffer(bufs[0] + total_transferred_, n); @@ -527,14 +547,15 @@ namespace detail handler_(ec, static_cast<const std::size_t&>(total_transferred_)); } } //private: AsyncRandomAccessWriteDevice& device_; - boost::uint64_t offset_; + uint64_t offset_; std::array<Elem, 2> buffers_; + int start_; std::size_t total_transferred_; WriteHandler handler_; }; #endif // defined(BOOST_ASIO_HAS_STD_ARRAY) @@ -555,12 +576,23 @@ namespace detail CompletionCondition, WriteHandler>* this_handler) { boost_asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } + template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, + typename CompletionCondition, typename WriteHandler> + inline bool asio_handler_is_continuation( + write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, + CompletionCondition, WriteHandler>* this_handler) + { + return this_handler->start_ == 0 ? true + : boost_asio_handler_cont_helpers::is_continuation( + this_handler->handler_); + } + template <typename Function, typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> inline void asio_handler_invoke(Function& function, write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, CompletionCondition, WriteHandler>* this_handler) @@ -582,55 +614,73 @@ namespace detail template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> inline write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, CompletionCondition, WriteHandler> make_write_at_op(AsyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers, + uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, WriteHandler handler) { return write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, CompletionCondition, WriteHandler>( d, offset, buffers, completion_condition, handler); } } // namespace detail template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler> -inline void async_write_at(AsyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write_at(AsyncRandomAccessWriteDevice& d, + uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - detail::make_write_at_op( - d, offset, buffers, completion_condition, - BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, + CompletionCondition, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + d, offset, buffers, completion_condition, init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence, typename WriteHandler> -inline void async_write_at(AsyncRandomAccessWriteDevice& d, - boost::uint64_t offset, const ConstBufferSequence& buffers, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write_at(AsyncRandomAccessWriteDevice& d, + uint64_t offset, const ConstBufferSequence& buffers, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - detail::make_write_at_op( - d, offset, buffers, transfer_all(), - BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))( - boost::system::error_code(), 0, 1); + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + + detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence, + detail::transfer_all_t, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + d, offset, buffers, transfer_all(), init.handler)( + boost::system::error_code(), 0, 1); + + return init.result.get(); } -#if !defined(BOOST_NO_IOSTREAM) +#if !defined(BOOST_ASIO_NO_IOSTREAM) namespace detail { template <typename Allocator, typename WriteHandler> class write_at_streambuf_op { @@ -682,12 +732,20 @@ namespace detail write_at_streambuf_op<Allocator, WriteHandler>* this_handler) { boost_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 boost_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) { boost_asio_handler_invoke_helpers::invoke( function, this_handler->handler_); @@ -709,42 +767,60 @@ namespace detail return write_at_streambuf_op<Allocator, WriteHandler>(b, handler); } } // namespace detail template <typename AsyncRandomAccessWriteDevice, typename Allocator, typename CompletionCondition, typename WriteHandler> -inline void async_write_at(AsyncRandomAccessWriteDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write_at(AsyncRandomAccessWriteDevice& d, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, CompletionCondition completion_condition, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + async_write_at(d, offset, b.data(), completion_condition, - detail::make_write_at_streambuf_op( - b, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))); + detail::write_at_streambuf_op<Allocator, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + b, init.handler)); + + return init.result.get(); } template <typename AsyncRandomAccessWriteDevice, typename Allocator, typename WriteHandler> -inline void async_write_at(AsyncRandomAccessWriteDevice& d, - boost::uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, +inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler, + void (boost::system::error_code, std::size_t)) +async_write_at(AsyncRandomAccessWriteDevice& d, + uint64_t offset, boost::asio::basic_streambuf<Allocator>& b, BOOST_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. BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; + detail::async_result_init< + WriteHandler, void (boost::system::error_code, std::size_t)> init( + BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); + async_write_at(d, offset, b.data(), transfer_all(), - detail::make_write_at_streambuf_op( - b, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler))); + detail::write_at_streambuf_op<Allocator, BOOST_ASIO_HANDLER_TYPE( + WriteHandler, void (boost::system::error_code, std::size_t))>( + b, init.handler)); + + return init.result.get(); } -#endif // !defined(BOOST_NO_IOSTREAM) +#endif // !defined(BOOST_ASIO_NO_IOSTREAM) } // namespace asio } // namespace boost #include <boost/asio/detail/pop_options.hpp> |