SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
fast_istreambuf_iterator.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
14#pragma once
15
16#include <cassert>
17#include <seqan3/std/iterator>
18
20
21namespace seqan3::detail
22{
35template <typename char_t, typename traits_t = std::char_traits<char_t>>
36class fast_istreambuf_iterator
37{
38private:
40 stream_buffer_exposer<char_t, traits_t> * stream_buf = nullptr;
41
42public:
46 using difference_type = ptrdiff_t;
47 using value_type = char_t;
48 using reference = char_t;
49 using pointer = void;
50 using iterator_category = std::input_iterator_tag;
52
56 fast_istreambuf_iterator() noexcept = default;
57 fast_istreambuf_iterator(fast_istreambuf_iterator const &) noexcept = default;
58 fast_istreambuf_iterator(fast_istreambuf_iterator &&) noexcept = default;
59 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator const &) noexcept = default;
60 fast_istreambuf_iterator & operator=(fast_istreambuf_iterator &&) noexcept = default;
61 ~fast_istreambuf_iterator() noexcept = default;
62
64 explicit fast_istreambuf_iterator(std::basic_streambuf<char_t, traits_t> & ibuf) :
65 stream_buf{reinterpret_cast<stream_buffer_exposer<char_t, traits_t> *>(&ibuf)}
66 {
67 assert(stream_buf != nullptr);
68 stream_buf->underflow(); // ensure the stream buffer has content on construction
69 }
71
76 fast_istreambuf_iterator & operator++()
77 {
78 assert(stream_buf != nullptr);
79 if ((stream_buf->gptr() + 1) == stream_buf->egptr())
80 stream_buf->snextc(); // move right, then underflow()
81 else
82 stream_buf->gbump(1);
83 return *this;
84 }
85
87 void operator++(int)
88 {
89 ++(*this);
90 }
92
94 reference operator*() const
95 {
96 assert(stream_buf != nullptr);
97 return *stream_buf->gptr();
98 }
99
105 friend bool operator==(fast_istreambuf_iterator const & lhs, std::default_sentinel_t const &) noexcept
106 {
107 assert(lhs.stream_buf != nullptr);
108 // compare size of remaining buffer; since ++ always resizes if possible, safe to compare pointers here
109 return (lhs.stream_buf->gptr() == lhs.stream_buf->egptr());
110 }
111
113 friend bool operator!=(fast_istreambuf_iterator const & lhs, std::default_sentinel_t const &) noexcept
114 {
115 return !(lhs == std::default_sentinel);
116 }
117
119 friend bool operator==(std::default_sentinel_t const &, fast_istreambuf_iterator const & rhs) noexcept
120 {
121 return rhs == std::default_sentinel;
122 }
123
125 friend bool operator!=(std::default_sentinel_t const &, fast_istreambuf_iterator const & rhs) noexcept
126 {
127 return !(rhs == std::default_sentinel);
128 }
130};
131
132} // namespace seqan3::detail
The <iterator> header from C++20's standard library.
SeqAn specific customisations in the standard namespace.
T operator!=(T... args)
Provides seqan3::detail::stream_buffer_exposer.