]> git.proxmox.com Git - ceph.git/blame - ceph/src/Beast/include/beast/core/detail/sync_ostream.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / Beast / include / beast / core / detail / sync_ostream.hpp
CommitLineData
7c673cae
FG
1//
2// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
7
8#ifndef BEAST_DETAIL_SYNC_OSTREAM_HPP
9#define BEAST_DETAIL_SYNC_OSTREAM_HPP
10
11#include <beast/core/buffer_concepts.hpp>
12#include <beast/core/error.hpp>
13#include <boost/asio/buffer.hpp>
14#include <ostream>
15
16namespace beast {
17namespace detail {
18
19/** A SyncWriteStream which outputs to a `std::ostream`
20
21 Objects of this type meet the requirements of @b SyncWriteStream.
22*/
23class sync_ostream
24{
25 std::ostream& os_;
26
27public:
28 /** Construct the stream.
29
30 @param os The associated `std::ostream`. All buffers
31 written will be passed to the associated output stream.
32 */
33 sync_ostream(std::ostream& os)
34 : os_(os)
35 {
36 }
37
38 template<class ConstBufferSequence>
39 std::size_t
40 write_some(ConstBufferSequence const& buffers);
41
42 template<class ConstBufferSequence>
43 std::size_t
44 write_some(ConstBufferSequence const& buffers,
45 error_code& ec);
46};
47
48template<class ConstBufferSequence>
49std::size_t
50sync_ostream::
51write_some(ConstBufferSequence const& buffers)
52{
53 static_assert(
54 is_ConstBufferSequence<ConstBufferSequence>::value,
55 "ConstBufferSequence requirements not met");
56 error_code ec;
57 auto const n = write_some(buffers, ec);
58 if(ec)
59 throw system_error{ec};
60 return n;
61}
62
63template<class ConstBufferSequence>
64std::size_t
65sync_ostream::
66write_some(ConstBufferSequence const& buffers,
67 error_code& ec)
68{
69 static_assert(
70 is_ConstBufferSequence<ConstBufferSequence>::value,
71 "ConstBufferSequence requirements not met");
72 std::size_t n = 0;
73 using boost::asio::buffer_cast;
74 using boost::asio::buffer_size;
75 for(auto const& buffer : buffers)
76 {
77 os_.write(buffer_cast<char const*>(buffer),
78 buffer_size(buffer));
79 if(os_.fail())
80 {
81 ec = errc::make_error_code(
82 errc::no_stream_resources);
83 break;
84 }
85 n += buffer_size(buffer);
86 }
87 return n;
88}
89
90} // detail
91} // beast
92
93#endif