1389 lines
		
	
	
		
			56 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			1389 lines
		
	
	
		
			56 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// write.hpp
							 | 
						||
| 
								 | 
							
								// ~~~~~~~~~
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2003-2022 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_WRITE_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_ASIO_WRITE_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER) && (_MSC_VER >= 1200)
							 | 
						||
| 
								 | 
							
								# pragma once
							 | 
						||
| 
								 | 
							
								#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/asio/detail/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <cstddef>
							 | 
						||
| 
								 | 
							
								#include <boost/asio/async_result.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/asio/buffer.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/asio/error.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								# include <boost/asio/basic_streambuf_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/asio/detail/push_options.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace asio {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @defgroup write boost::asio::write
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @brief The @c write function is a composed operation that writes a certain
							 | 
						||
| 
								 | 
							
								 * amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								/*@{*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written. The sum
							 | 
						||
| 
								 | 
							
								 * of the buffer sizes indicates the maximum number of bytes to write to the
							 | 
						||
| 
								 | 
							
								 * stream.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Example
							 | 
						||
| 
								 | 
							
								 * To write a single data buffer use the @ref buffer function as follows:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(s, boost::asio::buffer(data, size)); @endcode
							 | 
						||
| 
								 | 
							
								 * See the @ref buffer documentation for information on writing multiple
							 | 
						||
| 
								 | 
							
								 * buffers in one go, and how to use it with arrays, boost::array or
							 | 
						||
| 
								 | 
							
								 * std::vector.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all()); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename ConstBufferSequence>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written. The sum
							 | 
						||
| 
								 | 
							
								 * of the buffer sizes indicates the maximum number of bytes to write to the
							 | 
						||
| 
								 | 
							
								 * stream.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Example
							 | 
						||
| 
								 | 
							
								 * To write a single data buffer use the @ref buffer function as follows:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(s, boost::asio::buffer(data, size), ec); @endcode
							 | 
						||
| 
								 | 
							
								 * See the @ref buffer documentation for information on writing multiple
							 | 
						||
| 
								 | 
							
								 * buffers in one go, and how to use it with arrays, boost::array or
							 | 
						||
| 
								 | 
							
								 * std::vector.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all(), ec); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename ConstBufferSequence>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written. The sum
							 | 
						||
| 
								 | 
							
								 * of the buffer sizes indicates the maximum number of bytes to write to the
							 | 
						||
| 
								 | 
							
								 * stream.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Example
							 | 
						||
| 
								 | 
							
								 * To write a single data buffer use the @ref buffer function as follows:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(s, boost::asio::buffer(data, size),
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_at_least(32)); @endcode
							 | 
						||
| 
								 | 
							
								 * See the @ref buffer documentation for information on writing multiple
							 | 
						||
| 
								 | 
							
								 * buffers in one go, and how to use it with arrays, boost::array or
							 | 
						||
| 
								 | 
							
								 * std::vector.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename ConstBufferSequence,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written. The sum
							 | 
						||
| 
								 | 
							
								 * of the buffer sizes indicates the maximum number of bytes to write to the
							 | 
						||
| 
								 | 
							
								 * stream.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes written. If an error occurs, returns the total
							 | 
						||
| 
								 | 
							
								 * number of bytes successfully transferred prior to the error.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename ConstBufferSequence,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition, boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all()); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v1>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all(), ec); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v1>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v1,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes written. If an error occurs, returns the total
							 | 
						||
| 
								 | 
							
								 * number of bytes successfully transferred prior to the error.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v1,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition, boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_IOSTREAM)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b The basic_streambuf object from which data will be written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, b,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all()); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename Allocator>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& b);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b The basic_streambuf object from which data will be written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, b,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all(), ec); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename Allocator>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& b,
							 | 
						||
| 
								 | 
							
								    boost::system::error_code& ec);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b The basic_streambuf object from which data will be written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename Allocator,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& b,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b The basic_streambuf object from which data will be written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes written. If an error occurs, returns the total
							 | 
						||
| 
								 | 
							
								 * number of bytes successfully transferred prior to the error.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename Allocator,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& b,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition, boost::system::error_code& ec);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all()); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v2>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write all of the supplied data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note This overload is equivalent to calling:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::write(
							 | 
						||
| 
								 | 
							
								 *     s, buffers,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_all(), ec); @endcode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v2>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes transferred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @throws boost::system::system_error Thrown on failure.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v2,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Write a certain amount of data to a stream before returning.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to write a certain number of bytes of data to a stream.
							 | 
						||
| 
								 | 
							
								 * The call will block until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the SyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Successfully written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param ec Set to indicate what error occurred, if any.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns The number of bytes written. If an error occurs, returns the total
							 | 
						||
| 
								 | 
							
								 * number of bytes successfully transferred prior to the error.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename SyncWriteStream, typename DynamicBuffer_v2,
							 | 
						||
| 
								 | 
							
								    typename CompletionCondition>
							 | 
						||
| 
								 | 
							
								std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition, boost::system::error_code& ec,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*@}*/
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @defgroup async_write boost::asio::async_write
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @brief The @c async_write function is a composed asynchronous operation that
							 | 
						||
| 
								 | 
							
								 * writes a certain amount of data to a stream before completion.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								/*@{*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write all of the supplied data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Example
							 | 
						||
| 
								 | 
							
								 * To write a single data buffer use the @ref buffer function as follows:
							 | 
						||
| 
								 | 
							
								 * @code
							 | 
						||
| 
								 | 
							
								 * boost::asio::async_write(s, boost::asio::buffer(data, size), handler);
							 | 
						||
| 
								 | 
							
								 * @endcode
							 | 
						||
| 
								 | 
							
								 * See the @ref buffer documentation for information on writing multiple
							 | 
						||
| 
								 | 
							
								 * buffers in one go, and how to use it with arrays, boost::array or
							 | 
						||
| 
								 | 
							
								 * std::vector.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream, typename ConstBufferSequence,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken
							 | 
						||
| 
								 | 
							
								        BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
							 | 
						||
| 
								 | 
							
								          typename AsyncWriteStream::executor_type)>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token
							 | 
						||
| 
								 | 
							
								      BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
							 | 
						||
| 
								 | 
							
								        typename AsyncWriteStream::executor_type),
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write a certain amount of data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied buffers has been written. That is, the
							 | 
						||
| 
								 | 
							
								 * bytes transferred is equal to the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers One or more buffers containing the data to be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest async_write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's async_write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Example
							 | 
						||
| 
								 | 
							
								 * To write a single data buffer use the @ref buffer function as follows:
							 | 
						||
| 
								 | 
							
								 * @code boost::asio::async_write(s,
							 | 
						||
| 
								 | 
							
								 *     boost::asio::buffer(data, size),
							 | 
						||
| 
								 | 
							
								 *     boost::asio::transfer_at_least(32),
							 | 
						||
| 
								 | 
							
								 *     handler); @endcode
							 | 
						||
| 
								 | 
							
								 * See the @ref buffer documentation for information on writing multiple
							 | 
						||
| 
								 | 
							
								 * buffers in one go, and how to use it with arrays, boost::array or
							 | 
						||
| 
								 | 
							
								 * std::vector.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream,
							 | 
						||
| 
								 | 
							
								    typename ConstBufferSequence, typename CompletionCondition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_const_buffer_sequence<ConstBufferSequence>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write all of the supplied data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called. Successfully
							 | 
						||
| 
								 | 
							
								 * written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream, typename DynamicBuffer_v1,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken
							 | 
						||
| 
								 | 
							
								        BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
							 | 
						||
| 
								 | 
							
								          typename AsyncWriteStream::executor_type)>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token
							 | 
						||
| 
								 | 
							
								      BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
							 | 
						||
| 
								 | 
							
								        typename AsyncWriteStream::executor_type),
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write a certain amount of data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called. Successfully
							 | 
						||
| 
								 | 
							
								 * written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest async_write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's async_write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream,
							 | 
						||
| 
								 | 
							
								    typename DynamicBuffer_v1, typename CompletionCondition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_ASIO_NO_IOSTREAM)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write all of the supplied data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b A basic_streambuf object from which data will be written. Ownership
							 | 
						||
| 
								 | 
							
								 * of the streambuf is retained by the caller, which must guarantee that it
							 | 
						||
| 
								 | 
							
								 * remains valid until the completion handler is called.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream, typename Allocator,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken
							 | 
						||
| 
								 | 
							
								        BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
							 | 
						||
| 
								 | 
							
								          typename AsyncWriteStream::executor_type)>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token
							 | 
						||
| 
								 | 
							
								      BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
							 | 
						||
| 
								 | 
							
								        typename AsyncWriteStream::executor_type));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write a certain amount of data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied basic_streambuf has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param b A basic_streambuf object from which data will be written. Ownership
							 | 
						||
| 
								 | 
							
								 * of the streambuf is retained by the caller, which must guarantee that it
							 | 
						||
| 
								 | 
							
								 * remains valid until the completion handler is called.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest async_write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's async_write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream,
							 | 
						||
| 
								 | 
							
								    typename Allocator, typename CompletionCondition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write all of the supplied data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li An error occurred.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called. Successfully
							 | 
						||
| 
								 | 
							
								 * written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream, typename DynamicBuffer_v2,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken
							 | 
						||
| 
								 | 
							
								        BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
							 | 
						||
| 
								 | 
							
								          typename AsyncWriteStream::executor_type)>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token
							 | 
						||
| 
								 | 
							
								      BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
							 | 
						||
| 
								 | 
							
								        typename AsyncWriteStream::executor_type),
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Start an asynchronous operation to write a certain amount of data to a
							 | 
						||
| 
								 | 
							
								/// stream.
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This function is used to asynchronously write a certain number of bytes of
							 | 
						||
| 
								 | 
							
								 * data to a stream. It is an initiating function for an @ref
							 | 
						||
| 
								 | 
							
								 * asynchronous_operation, and always returns immediately. The asynchronous
							 | 
						||
| 
								 | 
							
								 * operation will continue until one of the following conditions is true:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li All of the data in the supplied dynamic buffer sequence has been written.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li The completion_condition function object returns 0.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This operation is implemented in terms of zero or more calls to the stream's
							 | 
						||
| 
								 | 
							
								 * async_write_some function, and is known as a <em>composed operation</em>. The
							 | 
						||
| 
								 | 
							
								 * program must ensure that the stream performs no other write operations (such
							 | 
						||
| 
								 | 
							
								 * as async_write, the stream's async_write_some function, or any other composed
							 | 
						||
| 
								 | 
							
								 * operations that perform writes) until this operation completes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param s The stream to which the data is to be written. The type must support
							 | 
						||
| 
								 | 
							
								 * the AsyncWriteStream concept.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param buffers The dynamic buffer sequence from which data will be written.
							 | 
						||
| 
								 | 
							
								 * Although the buffers object may be copied as necessary, ownership of the
							 | 
						||
| 
								 | 
							
								 * underlying memory blocks is retained by the caller, which must guarantee
							 | 
						||
| 
								 | 
							
								 * that they remain valid until the completion handler is called. Successfully
							 | 
						||
| 
								 | 
							
								 * written data is automatically consumed from the buffers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param completion_condition The function object to be called to determine
							 | 
						||
| 
								 | 
							
								 * whether the write operation is complete. The signature of the function object
							 | 
						||
| 
								 | 
							
								 * must be:
							 | 
						||
| 
								 | 
							
								 * @code std::size_t completion_condition(
							 | 
						||
| 
								 | 
							
								 *   // Result of latest async_write_some operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes transferred so far.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * A return value of 0 indicates that the write operation is complete. A
							 | 
						||
| 
								 | 
							
								 * non-zero return value indicates the maximum number of bytes to be written on
							 | 
						||
| 
								 | 
							
								 * the next call to the stream's async_write_some function.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param token The @ref completion_token that will be used to produce a
							 | 
						||
| 
								 | 
							
								 * completion handler, which will be called when the write completes.
							 | 
						||
| 
								 | 
							
								 * Potential completion tokens include @ref use_future, @ref use_awaitable,
							 | 
						||
| 
								 | 
							
								 * @ref yield_context, or a function object with the correct completion
							 | 
						||
| 
								 | 
							
								 * signature. The function signature of the completion handler must be:
							 | 
						||
| 
								 | 
							
								 * @code void handler(
							 | 
						||
| 
								 | 
							
								 *   // Result of operation.
							 | 
						||
| 
								 | 
							
								 *   const boost::system::error_code& error,
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   // Number of bytes written from the buffers. If an error
							 | 
						||
| 
								 | 
							
								 *   // occurred, this will be less than the sum of the buffer sizes.
							 | 
						||
| 
								 | 
							
								 *   std::size_t bytes_transferred
							 | 
						||
| 
								 | 
							
								 * ); @endcode
							 | 
						||
| 
								 | 
							
								 * Regardless of whether the asynchronous operation completes immediately or
							 | 
						||
| 
								 | 
							
								 * not, the completion handler will not be invoked from within this function.
							 | 
						||
| 
								 | 
							
								 * On immediate completion, invocation of the handler will be performed in a
							 | 
						||
| 
								 | 
							
								 * manner equivalent to using boost::asio::post().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Completion Signature
							 | 
						||
| 
								 | 
							
								 * @code void(boost::system::error_code, std::size_t) @endcode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @par Per-Operation Cancellation
							 | 
						||
| 
								 | 
							
								 * This asynchronous operation supports cancellation for the following
							 | 
						||
| 
								 | 
							
								 * boost::asio::cancellation_type values:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @li @c cancellation_type::partial
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * if they are also supported by the @c AsyncWriteStream type's
							 | 
						||
| 
								 | 
							
								 * @c async_write_some operation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								template <typename AsyncWriteStream,
							 | 
						||
| 
								 | 
							
								    typename DynamicBuffer_v2, typename CompletionCondition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
							 | 
						||
| 
								 | 
							
								      std::size_t)) WriteToken>
							 | 
						||
| 
								 | 
							
								BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteToken,
							 | 
						||
| 
								 | 
							
								    void (boost::system::error_code, std::size_t))
							 | 
						||
| 
								 | 
							
								async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
							 | 
						||
| 
								 | 
							
								    CompletionCondition completion_condition,
							 | 
						||
| 
								 | 
							
								    BOOST_ASIO_MOVE_ARG(WriteToken) token,
							 | 
						||
| 
								 | 
							
								    typename constraint<
							 | 
						||
| 
								 | 
							
								      is_dynamic_buffer_v2<DynamicBuffer_v2>::value
							 | 
						||
| 
								 | 
							
								    >::type = 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace asio
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/asio/detail/pop_options.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/asio/impl/write.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_ASIO_WRITE_HPP
							 |