SeqAn3 3.4.0-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-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <cassert>
13#include <ranges>
14
16
17namespace seqan3::detail
18{
19
36template <typename file_type>
38{
39 static_assert(!std::is_const_v<file_type>,
40 "You cannot iterate over const files, because the iterator changes the file.");
41
42public:
49 using value_type = typename file_type::value_type;
51 using reference = typename file_type::reference;
53 using const_reference = typename file_type::reference;
55 using size_type = typename file_type::size_type;
57 using difference_type = typename file_type::difference_type;
59 using pointer = typename file_type::value_type *;
63
68 constexpr in_file_iterator() = default;
70 constexpr in_file_iterator(in_file_iterator const &) = default;
72 constexpr in_file_iterator & operator=(in_file_iterator const &) = default;
74 constexpr in_file_iterator(in_file_iterator &&) = default;
76 constexpr in_file_iterator & operator=(in_file_iterator &&) = default;
78 ~in_file_iterator() = default;
79
81 constexpr in_file_iterator(file_type & _host) noexcept : host{&_host}
82 {}
84
90 {
91 assert(host != nullptr);
92 host->read_next_record();
93 return *this;
94 }
95
97 void operator++(int)
98 {
99 assert(host != nullptr);
100 ++(*this);
101 }
102
105 {
106 assert(host != nullptr);
107 return host->record_buffer;
108 }
109
111 reference operator*() const noexcept
112 {
113 assert(host != nullptr);
114 return host->record_buffer;
115 }
117
124 constexpr bool operator==(std::default_sentinel_t const &) const noexcept
125 {
126 assert(host != nullptr);
127 return host->at_end;
128 }
129
131 constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
132 {
133 assert(host != nullptr);
134 return !host->at_end;
135 }
136
138 constexpr friend bool operator==(std::default_sentinel_t const &, in_file_iterator const & it) noexcept
139 {
140 return (it == std::default_sentinel);
141 }
142
144 constexpr friend bool operator!=(std::default_sentinel_t const &, in_file_iterator const & it) noexcept
145 {
146 return (it != std::default_sentinel);
147 }
149
157 {
158 assert(host != nullptr);
159 return host->position_buffer;
160 }
161
164 {
165 assert(host != nullptr);
166 host->secondary_stream->seekg(pos);
167 if (host->secondary_stream->fail())
168 {
169 throw std::runtime_error{"Seeking to file position failed!"};
170 }
171 host->at_end = false; // iterator will not be at end if seeking to a specific record
172 host->read_next_record();
173 return *this;
174 }
176
177private:
179 file_type * host{};
180};
181
182} // namespace seqan3::detail
Input iterator necessary for providing a range-like interface in input file.
Definition in_file_iterator.hpp:38
typename file_type::value_type value_type
The value type.
Definition in_file_iterator.hpp:49
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:138
void operator++(int)
Post-increment is the same as pre-increment, but returns void.
Definition in_file_iterator.hpp:97
constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
Checks whether *this is not equal to the sentinel.
Definition in_file_iterator.hpp:131
typename file_type::reference const_reference
The const reference type.
Definition in_file_iterator.hpp:53
std::streampos file_position() const
Returns the current position in the file via std::streampos.
Definition in_file_iterator.hpp:156
reference operator*() noexcept
Dereference returns the currently buffered record.
Definition in_file_iterator.hpp:104
in_file_iterator & operator++()
Move to the next record in the file and return a reference to it.
Definition in_file_iterator.hpp:89
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:51
file_type * host
Pointer to file host.
Definition in_file_iterator.hpp:179
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:81
typename file_type::difference_type difference_type
The difference type. A signed integer type, usually std::ptrdiff_t.
Definition in_file_iterator.hpp:57
typename file_type::value_type * pointer
The pointer type.
Definition in_file_iterator.hpp:59
constexpr bool operator==(std::default_sentinel_t const &) const noexcept
Checks whether *this is equal to the sentinel.
Definition in_file_iterator.hpp:124
reference operator*() const noexcept
Dereference returns the currently buffered record.
Definition in_file_iterator.hpp:111
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:163
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:55
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:144
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides platform and dependency checks.
Hide me