20#ifndef PLYWOOT_BUFFERED_OSTREAM_HPP
21#define PLYWOOT_BUFFERED_OSTREAM_HPP
36constexpr std::size_t OStreamBufferSize{1024 * 1024};
40namespace plywoot::detail {
53 explicit BufferedOStream(std::ostream &os) : os_{os} {}
57 ~BufferedOStream() { flush(); }
60 BufferedOStream(
const BufferedOStream &) =
delete;
61 BufferedOStream &operator=(
const BufferedOStream &) =
delete;
67 if (c_ == eob_) flush();
72 void write(
const char *src, std::size_t n)
74 if (n >= OStreamBufferSize)
81 if (c_ + n >= eob_) { flush(); }
82 std::memcpy(c_, src, n);
91 constexpr int MIN_BUFFER_SIZE = 100;
92 if (c_ + MIN_BUFFER_SIZE >= eob_) { flush(); }
93 c_ = std::to_chars(c_, c_ + MIN_BUFFER_SIZE, t).ptr;
100 if (c_ +
sizeof(T) >= eob_) { flush(); }
101 std::memcpy(c_,
reinterpret_cast<const char *
>(&t),
sizeof(T));
109 os_.write(buffer_.get(), c_ - buffer_.get());
114 std::unique_ptr<char[]> buffer_{
new char[OStreamBufferSize]};
120 char *c_{buffer_.get()};
122 const char *eob_{buffer_.get() + OStreamBufferSize};