23namespace seqan3::detail
37template <
typename char_t,
typename traits_t = std::
char_traits<
char_t>>
38class fast_ostreambuf_iterator
42 stream_buffer_exposer<char_t, traits_t> * stream_buf =
nullptr;
48 using difference_type = ptrdiff_t;
49 using value_type = char_t;
50 using reference = char_t;
58 fast_ostreambuf_iterator() noexcept = default;
59 fast_ostreambuf_iterator(fast_ostreambuf_iterator const &) noexcept = default;
60 fast_ostreambuf_iterator(fast_ostreambuf_iterator &&) noexcept = default;
61 fast_ostreambuf_iterator & operator=(fast_ostreambuf_iterator const &) noexcept = default;
62 fast_ostreambuf_iterator & operator=(fast_ostreambuf_iterator &&) noexcept = default;
63 ~fast_ostreambuf_iterator() noexcept = default;
66 explicit fast_ostreambuf_iterator(
std::basic_streambuf<char_t, traits_t> & ibuf) :
67 stream_buf{
reinterpret_cast<stream_buffer_exposer<char_t, traits_t> *
>(&ibuf)}
69 assert(stream_buf !=
nullptr);
70 if (stream_buf->pptr() == stream_buf->epptr())
71 stream_buf->overflow();
79 fast_ostreambuf_iterator & operator++()
84 fast_ostreambuf_iterator & operator++(
int)
91 fast_ostreambuf_iterator & operator*()
97 fast_ostreambuf_iterator & operator=(char_t
const c)
99 assert(stream_buf !=
nullptr);
100 if (stream_buf->pptr() == stream_buf->epptr())
102 if (stream_buf->sputc(c) == traits_t::eof())
111 *stream_buf->pptr() = c;
112 stream_buf->pbump(1);
118 bool failed() const noexcept
120 return stream_buf->overflow() == traits_t::eof();
141 template <std::ranges::forward_range range_type>
143 requires std::ranges::borrowed_range<range_type>
145 auto write_range(range_type && rng)
147 using sen_t = std::ranges::sentinel_t<range_type>;
148 using it_t = std::ranges::iterator_t<range_type>;
151 sen_t
end = std::ranges::end(rng);
155 size_t const buffer_space = stream_buf->epptr() - stream_buf->pptr();
157 if constexpr (std::ranges::sized_range<range_type>)
159 size_t const characters_to_write = std::min<size_t>(std::ranges::distance(it, end), buffer_space);
160 auto copy_res = std::ranges::copy_n(it, characters_to_write, stream_buf->pptr());
162 stream_buf->pbump(characters_to_write);
167 for (; it !=
end && i < buffer_space; ++it, ++i)
168 *stream_buf->pptr() = *it;
169 stream_buf->pbump(i);
176 if (stream_buf->overflow(*it) == traits_t::eof())
191 template <std::ranges::forward_range range_type>
192 void write_range(range_type && rng)
202 template <
typename number_type>
204 requires std::is_arithmetic_v<number_type>
206 auto write_number(number_type num)
208 if (stream_buf->epptr() - stream_buf->pptr() > 300)
210 auto res =
std::to_chars(stream_buf->pptr(), stream_buf->epptr(), num);
211 stream_buf->pbump(res.ptr - stream_buf->pptr());
216 auto res =
std::to_chars(&arithmetic_buffer[0], &arithmetic_buffer[0] +
sizeof(arithmetic_buffer), num);
217 write_range(std::ranges::subrange<char *, char *>(&arithmetic_buffer[0], res.ptr));
225 void write_end_of_line(
bool const add_cr)
The <algorithm> header from C++20's standard library.
The <iterator> header from C++20's standard library.
SeqAn specific customisations in the standard namespace.
The <ranges> header from C++20's standard library.
The <charconv> header from C++17's standard library.
Provides seqan3::detail::stream_buffer_exposer.