24 #ifndef STATICLIB_IO_BUFFERED_SINK_HPP
25 #define STATICLIB_IO_BUFFERED_SINK_HPP
32 #include "staticlib/config.hpp"
44 template <
typename Sink, std::
size_t buf_size = 4096>
54 std::array<char, buf_size> buffer;
72 sink(std::move(sink)) { }
106 sink(std::move(other.sink)),
107 buffer(std::move(other.buffer)),
121 sink = std::move(other.sink);
122 buffer = std::move(other.buffer);
137 size_t ulen = span.
size();
138 if (ulen >= buffer.size()) {
139 write_to_sink(buffer.data(), pos);
141 avail = buffer.size();
142 write_to_sink(span.
data(), ulen);
143 }
else if (ulen <= avail) {
144 std::memcpy(buffer.data() + pos, span.
data(), ulen);
150 write_to_sink(buffer.data(), buffer.size());
152 avail = buffer.size();
155 write_to_sink(buffer.data(), pos);
156 std::memcpy(buffer.data(), span.
data(), ulen);
158 avail = buffer.size() - ulen;
169 std::streamsize flushed = 0;
171 write_to_sink(buffer.data(), pos);
174 avail = buffer.size();
176 flushed += sink.flush();
199 void write_to_sink(
const char* buf,
size_t length) {
201 while (result < length) {
202 size_t ulen = length - result;
203 if (!sl::support::is_streamsize(ulen)) {
204 ulen =
static_cast<size_t> (std::numeric_limits<std::streamsize>::max());
206 std::streamsize amt = sink.write({buf + result,
static_cast<std::streamsize
>(ulen)});
207 if (!sl::support::is_sizet(amt))
throw io_exception(TRACEMSG(
208 "Invalid result returned by underlying 'write' operation: [" + sl::support::to_string(amt) +
"]"));
209 result +=
static_cast<size_t> (amt);
222 template <
typename Sink,
223 class =
typename std::enable_if<!std::is_lvalue_reference<Sink>::value>::type>
235 template <
typename Sink>