SeqAn3 3.4.3-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
in_file_iterator.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2026 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2026 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <cassert>
13#include <ios>
14#include <ranges>
15
17
18namespace seqan3::detail
19{
20
37template <typename file_type>
39{
40 static_assert(!std::is_const_v<file_type>,
41 "You cannot iterate over const files, because the iterator changes the file.");
42
43public:
50 using value_type = typename file_type::value_type;
52 using reference = typename file_type::reference;
54 using const_reference = typename file_type::reference;
56 using size_type = typename file_type::size_type;
58 using difference_type = typename file_type::difference_type;
60 using pointer = typename file_type::value_type *;
64
69 constexpr in_file_iterator() = default;
71 constexpr in_file_iterator(in_file_iterator const &) = default;
73 constexpr in_file_iterator & operator=(in_file_iterator const &) = default;
75 constexpr in_file_iterator(in_file_iterator &&) = default;
77 constexpr in_file_iterator & operator=(in_file_iterator &&) = default;
79 ~in_file_iterator() = default;
80
82 constexpr in_file_iterator(file_type & _host) noexcept : host{&_host}
83 {}
85
91 {
92 assert(host != nullptr);
93 host->read_next_record();
94 return *this;
95 }
96
98 void operator++(int)
99 {
100 assert(host != nullptr);
101 ++(*this);
102 }
103
106 {
107 assert(host != nullptr);
108 return host->record_buffer;
109 }
110
112 reference operator*() const noexcept
113 {
114 assert(host != nullptr);
115 return host->record_buffer;
116 }
118
125 constexpr bool operator==(std::default_sentinel_t const &) const noexcept
126 {
127 assert(host != nullptr);
128 return host->at_end;
129 }
130
132 constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
133 {
134 assert(host != nullptr);
135 return !host->at_end;
136 }
137
139 constexpr friend bool operator==(std::default_sentinel_t const &, in_file_iterator const & it) noexcept
140 {
141 return (it == std::default_sentinel);
142 }
143
145 constexpr friend bool operator!=(std::default_sentinel_t const &, in_file_iterator const & it) noexcept
146 {
147 return (it != std::default_sentinel);
148 }
150
158 {
159 assert(host != nullptr);
160 return host->position_buffer;
161 }
162
165 {
166 assert(host != nullptr);
167 host->secondary_stream->seekg(pos);
168 if (host->secondary_stream->fail())
169 {
170 throw std::runtime_error{"Seeking to file position failed!"};
171 }
172 host->at_end = false; // iterator will not be at end if seeking to a specific record
173 host->read_next_record();
174 return *this;
175 }
177
178private:
180 file_type * host{};
181};
182
183} // namespace seqan3::detail
Input iterator necessary for providing a range-like interface in input file.
Definition in_file_iterator.hpp:39
typename file_type::value_type value_type
The value type.
Definition in_file_iterator.hpp:50
constexpr in_file_iterator & operator=(in_file_iterator &&)=default
Move assignment.
constexpr in_file_iterator()=default
Default constructor.
constexpr friend bool operator==(std::default_sentinel_t const &, in_file_iterator const &it) noexcept
Checks whether it is equal to the sentinel.
Definition in_file_iterator.hpp:139
void operator++(int)
Post-increment is the same as pre-increment, but returns void.
Definition in_file_iterator.hpp:98
constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
Checks whether *this is not equal to the sentinel.
Definition in_file_iterator.hpp:132
typename file_type::reference const_reference
The const reference type.
Definition in_file_iterator.hpp:54
std::streampos file_position() const
Returns the current position in the file via std::streampos.
Definition in_file_iterator.hpp:157
reference operator*() noexcept
Dereference returns the currently buffered record.
Definition in_file_iterator.hpp:105
in_file_iterator & operator++()
Move to the next record in the file and return a reference to it.
Definition in_file_iterator.hpp:90
constexpr in_file_iterator(in_file_iterator const &)=default
Copy constructor.
~in_file_iterator()=default
Use default deconstructor.
typename file_type::reference reference
The reference type.
Definition in_file_iterator.hpp:52
file_type * host
Pointer to file host.
Definition in_file_iterator.hpp:180
constexpr in_file_iterator & operator=(in_file_iterator const &)=default
Copy construction via assignment.
constexpr in_file_iterator(file_type &_host) noexcept
Construct with reference to host.
Definition in_file_iterator.hpp:82
typename file_type::difference_type difference_type
The difference type. A signed integer type, usually std::ptrdiff_t.
Definition in_file_iterator.hpp:58
typename file_type::value_type * pointer
The pointer type.
Definition in_file_iterator.hpp:60
constexpr bool operator==(std::default_sentinel_t const &) const noexcept
Checks whether *this is equal to the sentinel.
Definition in_file_iterator.hpp:125
reference operator*() const noexcept
Dereference returns the currently buffered record.
Definition in_file_iterator.hpp:112
in_file_iterator & seek_to(std::streampos const &pos)
Low level API. Sets the current position of the iterator to the given position, throws if at end of f...
Definition in_file_iterator.hpp:164
constexpr in_file_iterator(in_file_iterator &&)=default
Move constructor.
typename file_type::size_type size_type
The size type.
Definition in_file_iterator.hpp:56
constexpr friend bool operator!=(std::default_sentinel_t const &, in_file_iterator const &it) noexcept
Checks whether it is not equal to the sentinel.
Definition in_file_iterator.hpp:145
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides platform and dependency checks.
Hide me