17 #ifndef __cpp_lib_ranges
18 #include <range/v3/iterator/stream_iterators.hpp>
19 #endif // __cpp_lib_ranges
24 namespace seqan3::detail
40 template <
typename char_t,
typename traits_t = std::
char_traits<
char_t>>
72 template <
typename char_t,
typename traits_t = std::
char_traits<
char_t>>
73 class fast_istreambuf_iterator
77 stream_buffer_exposer<char_t, traits_t> * stream_buf =
nullptr;
83 using difference_type = ptrdiff_t;
84 using value_type = char_t;
85 using reference = char_t;
93 fast_istreambuf_iterator() noexcept = default;
94 fast_istreambuf_iterator(fast_istreambuf_iterator const &) noexcept = default;
95 fast_istreambuf_iterator(fast_istreambuf_iterator &&) noexcept = default;
96 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator const &) noexcept = default;
97 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator &&) noexcept = default;
98 ~fast_istreambuf_iterator() noexcept = default;
101 explicit fast_istreambuf_iterator(
std::basic_streambuf<char_t, traits_t> & ibuf) :
102 stream_buf{
reinterpret_cast<stream_buffer_exposer<char_t, traits_t> *
>(&ibuf)}
104 assert(stream_buf !=
nullptr);
105 stream_buf->underflow();
112 fast_istreambuf_iterator & operator++()
115 assert(stream_buf !=
nullptr);
116 if ((stream_buf->gptr() + 1) == stream_buf->egptr())
117 stream_buf->snextc();
119 stream_buf->gbump(1);
131 reference operator*()
const
133 assert(stream_buf !=
nullptr);
134 return *stream_buf->gptr();
141 friend bool operator==(fast_istreambuf_iterator
const & lhs, std::ranges::default_sentinel_t
const &) noexcept
144 assert(lhs.stream_buf !=
nullptr);
146 return (lhs.stream_buf->gptr() == lhs.stream_buf->egptr());
150 friend bool operator!=(fast_istreambuf_iterator
const & lhs, std::ranges::default_sentinel_t
const &) noexcept
152 return !(lhs == std::ranges::default_sentinel);
156 friend bool operator==(std::ranges::default_sentinel_t
const &, fast_istreambuf_iterator
const & rhs) noexcept
158 return rhs == std::ranges::default_sentinel;
162 friend bool operator!=(std::ranges::default_sentinel_t
const &, fast_istreambuf_iterator
const & rhs) noexcept
164 return !(rhs == std::ranges::default_sentinel);
178 #ifdef __cpp_lib_ranges
206 #endif // __cpp_lib_ranges