SeqAn3
3.4.0
The Modern C++ library for sequence analysis.
Toggle main menu visibility
Loading...
Searching...
No Matches
in_file_iterator.hpp
Go to the documentation of this file.
1
// SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
2
// SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
3
// SPDX-License-Identifier: BSD-3-Clause
4
9
10
#pragma once
11
12
#include <
cassert
>
13
#include <
ios
>
14
#include <ranges>
15
16
#include <
seqan3/core/platform.hpp
>
17
18
namespace
seqan3::detail
19
{
20
37
template
<
typename
file_type>
38
class
in_file_iterator
39
{
40
static_assert
(!
std::is_const_v<file_type>
,
41
"You cannot iterate over const files, because the iterator changes the file."
);
42
43
public
:
48
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 *;
62
using
iterator_category = std::input_iterator_tag;
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
90
in_file_iterator & operator++()
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
105
reference operator*() noexcept
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
123
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
155
157
std::streampos file_position()
const
158
{
159
assert(host !=
nullptr
);
160
return
host->position_buffer;
161
}
162
164
in_file_iterator & seek_to(std::streampos
const
& pos)
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
178
private
:
180
file_type * host{};
181
};
182
183
}
// namespace seqan3::detail
cassert
ios
std::is_const_v
T is_const_v
platform.hpp
Provides platform and dependency checks.
Hide me
Version:
seqan3
io
detail
in_file_iterator.hpp
Generated on
for SeqAn3 by
1.17.0