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>>
74 template <
typename char_t,
typename traits_t = std::
char_traits<
char_t>>
75 class fast_istreambuf_iterator
79 stream_buffer_exposer<char_t, traits_t> * stream_buf =
nullptr;
85 using difference_type = ptrdiff_t;
86 using value_type = char_t;
87 using reference = char_t;
95 fast_istreambuf_iterator() noexcept = default;
96 fast_istreambuf_iterator(fast_istreambuf_iterator const &) noexcept = default;
97 fast_istreambuf_iterator(fast_istreambuf_iterator &&) noexcept = default;
98 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator const &) noexcept = default;
99 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator &&) noexcept = default;
100 ~fast_istreambuf_iterator() noexcept = default;
103 explicit fast_istreambuf_iterator(
std::basic_streambuf<char_t, traits_t> & ibuf) :
104 stream_buf{
reinterpret_cast<stream_buffer_exposer<char_t, traits_t> *
>(&ibuf)}
106 assert(stream_buf !=
nullptr);
107 stream_buf->underflow();
114 fast_istreambuf_iterator & operator++()
117 assert(stream_buf !=
nullptr);
118 if ((stream_buf->gptr() + 1) == stream_buf->egptr())
119 stream_buf->snextc();
121 stream_buf->gbump(1);
133 reference operator*()
const
135 assert(stream_buf !=
nullptr);
136 return *stream_buf->gptr();
143 friend bool operator==(fast_istreambuf_iterator
const & lhs, std::ranges::default_sentinel_t
const &) noexcept
146 assert(lhs.stream_buf !=
nullptr);
148 return (lhs.stream_buf->gptr() == lhs.stream_buf->egptr());
152 friend bool operator!=(fast_istreambuf_iterator
const & lhs, std::ranges::default_sentinel_t
const &) noexcept
154 return !(lhs == std::ranges::default_sentinel);
158 friend bool operator==(std::ranges::default_sentinel_t
const &, fast_istreambuf_iterator
const & rhs) noexcept
160 return rhs == std::ranges::default_sentinel;
164 friend bool operator!=(std::ranges::default_sentinel_t
const &, fast_istreambuf_iterator
const & rhs) noexcept
166 return !(rhs == std::ranges::default_sentinel);
180 #ifdef __cpp_lib_ranges
208 #endif // __cpp_lib_ranges