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>
37class in_file_iterator
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 *;
61 using iterator_category = std::input_iterator_tag;
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
89 in_file_iterator & operator++()
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
104 reference operator*() noexcept
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
156 std::streampos file_position() const
157 {
158 assert(host != nullptr);
159 return host->position_buffer;
160 }
161
163 in_file_iterator & seek_to(std::streampos const & pos)
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
T operator!=(T... args)
Provides platform and dependency checks.
Hide me