63class AsciiOutputStream :
public OutputStreamWrapperBase<OStream> {
66 Buffer(std::streamsize precision)
67 : _precision{precision} {
71 template<
typename V,
typename D>
72 void push(V&& value, D&& delimiter) {
74 if constexpr (std::floating_point<std::remove_cvref_t<V>>)
75 std::format_to(std::back_inserter(_string_buf),
76 "{:.{}g}{}", std::forward<V>(value), _precision, std::forward<D>(delimiter)
79 std::format_to(std::back_inserter(_string_buf),
80 "{}{}", std::forward<V>(value), std::forward<D>(delimiter)
83 _stream_buf << std::forward<V>(value) << std::forward<D>(delimiter);
87 void prepare_readout() {
91 _string_buf = std::move(_stream_buf).str();
97 return std::span{_string_buf.data(), _string_buf.size()};
105 void _init_stream_buf() {
107 _stream_buf.precision(_precision);
110 std::streamsize _precision;
111 std::string _string_buf;
112 std::ostringstream _stream_buf;
117 : OutputStreamWrapperBase<OStream>(s)
118 , _opts{std::move(opts)}
121 template<
typename T, std::
size_t size>
122 void write(std::span<T, size> data) {
123 std::size_t count_entries = 0;
124 std::size_t count_buffer_lines = 0;
126 using PrintType =
typename Encoding::Detail::AsciiPrintType<T>::type;
127 Buffer buffer(std::numeric_limits<PrintType>::digits10);
128 while (count_entries < data.size()) {
129 buffer.push(count_entries > 0 ?
"\n" :
"", _opts.line_prefix);
132 const auto num_entries = min(_opts.entries_per_line, data.size() - count_entries);
133 for (
const auto& value : data.subspan(count_entries, num_entries))
134 buffer.push(
static_cast<PrintType
>(value), _opts.delimiter);
137 count_entries += num_entries;
138 ++count_buffer_lines;
141 if (count_buffer_lines >= _opts.num_cached_lines) {
142 buffer.prepare_readout();
143 this->_write_raw(buffer.data());
145 count_buffer_lines = 0;
150 buffer.prepare_readout();
151 this->_write_raw(buffer.data());