diff --git a/include/beast/core/detail/sync_ostream.hpp b/include/beast/core/detail/sync_ostream.hpp new file mode 100644 index 00000000..2d5b9e82 --- /dev/null +++ b/include/beast/core/detail/sync_ostream.hpp @@ -0,0 +1,93 @@ +// +// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail 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 BEAST_DETAIL_SYNC_OSTREAM_HPP +#define BEAST_DETAIL_SYNC_OSTREAM_HPP + +#include +#include +#include +#include + +namespace beast { +namespace detail { + +/** A SyncWriteStream which outputs to a `std::ostream` + + Objects of this type meet the requirements of @b SyncWriteStream. +*/ +class sync_ostream +{ + std::ostream& os_; + +public: + /** Construct the stream. + + @param os The associated `std::ostream`. All buffers + written will be passed to the associated output stream. + */ + sync_ostream(std::ostream& os) + : os_(os) + { + } + + template + std::size_t + write_some(ConstBufferSequence const& buffers); + + template + std::size_t + write_some(ConstBufferSequence const& buffers, + error_code& ec); +}; + +template +std::size_t +sync_ostream:: +write_some(ConstBufferSequence const& buffers) +{ + static_assert( + is_ConstBufferSequence::value, + "ConstBufferSequence requirements not met"); + error_code ec; + auto const n = write_some(buffers, ec); + if(ec) + throw system_error{ec}; + return n; +} + +template +std::size_t +sync_ostream:: +write_some(ConstBufferSequence const& buffers, + error_code& ec) +{ + static_assert( + is_ConstBufferSequence::value, + "ConstBufferSequence requirements not met"); + std::size_t n = 0; + using boost::asio::buffer_cast; + using boost::asio::buffer_size; + for(auto const& buffer : buffers) + { + os_.write(buffer_cast(buffer), + buffer_size(buffer)); + if(os_.fail()) + { + ec = errc::make_error_code( + errc::no_stream_resources); + break; + } + n += buffer_size(buffer); + } + return n; +} + +} // detail +} // beast + +#endif diff --git a/include/beast/http/impl/write.ipp b/include/beast/http/impl/write.ipp index 1ed0a4cc..de443d7f 100644 --- a/include/beast/http/impl/write.ipp +++ b/include/beast/http/impl/write.ipp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -598,55 +599,6 @@ async_write(AsyncWriteStream& stream, return completion.result.get(); } -namespace detail { - -class ostream_SyncStream -{ - std::ostream& os_; - -public: - ostream_SyncStream(std::ostream& os) - : os_(os) - { - } - - template - std::size_t - write_some(ConstBufferSequence const& buffers) - { - error_code ec; - auto const n = write_some(buffers, ec); - if(ec) - throw system_error{ec}; - return n; - } - - template - std::size_t - write_some(ConstBufferSequence const& buffers, - error_code& ec) - { - std::size_t n = 0; - using boost::asio::buffer_cast; - using boost::asio::buffer_size; - for(auto const& buffer : buffers) - { - os_.write(buffer_cast(buffer), - buffer_size(buffer)); - if(os_.fail()) - { - ec = errc::make_error_code( - errc::no_stream_resources); - break; - } - n += buffer_size(buffer); - } - return n; - } -}; - -} // detail - template std::ostream& operator<<(std::ostream& os, @@ -659,7 +611,7 @@ operator<<(std::ostream& os, static_assert(is_Writer>::value, "Writer requirements not met"); - detail::ostream_SyncStream oss(os); + beast::detail::sync_ostream oss{os}; error_code ec; write(oss, msg, ec); if(ec && ec != boost::asio::error::eof)