SeqAn3  3.1.0-rc.1
The Modern C++ library for sequence analysis.
in_file_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 
13 #pragma once
14 
15 #include <cassert>
16 #include <seqan3/std/ranges>
17 
18 #include <seqan3/core/platform.hpp>
19 
20 namespace seqan3::detail
21 {
22 
39 template <typename file_type>
41 {
42  static_assert(!std::is_const_v<file_type>,
43  "You cannot iterate over const files, because the iterator changes the file.");
44 public:
51  using value_type = typename file_type::value_type;
53  using reference = typename file_type::reference;
55  using const_reference = typename file_type::reference;
57  using size_type = typename file_type::size_type;
59  using difference_type = typename file_type::difference_type;
61  using pointer = typename file_type::value_type *;
65 
70  constexpr in_file_iterator() = default;
72  constexpr in_file_iterator(in_file_iterator const &) = default;
74  constexpr in_file_iterator & operator=(in_file_iterator const &) = default;
76  constexpr in_file_iterator (in_file_iterator &&) = default;
78  constexpr in_file_iterator & operator=(in_file_iterator &&) = default;
80  ~in_file_iterator() = default;
81 
83  constexpr in_file_iterator(file_type & _host) noexcept :
84  host{&_host}
85  {}
87 
93  {
94  assert(host != nullptr);
95  host->read_next_record();
96  return *this;
97  }
98 
100  void operator++(int)
101  {
102  assert(host != nullptr);
103  ++(*this);
104  }
105 
107  reference operator*() noexcept
108  {
109  assert(host != nullptr);
110  return host->record_buffer;
111  }
112 
114  reference operator*() const noexcept
115  {
116  assert(host != nullptr);
117  return host->record_buffer;
118  }
120 
127  constexpr bool operator==(std::default_sentinel_t const &) const noexcept
128  {
129  assert(host != nullptr);
130  return host->at_end;
131  }
132 
134  constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
135  {
136  assert(host != nullptr);
137  return !host->at_end;
138  }
139 
141  constexpr friend bool operator==(std::default_sentinel_t const &,
142  in_file_iterator const & it) noexcept
143  {
144  return (it == std::default_sentinel);
145  }
146 
148  constexpr friend bool operator!=(std::default_sentinel_t const &,
149  in_file_iterator const & it) noexcept
150  {
151  return (it != std::default_sentinel);
152  }
154 
155 private:
157  file_type * host{};
158 };
159 
160 } // namespace seqan3::detail
Input iterator necessary for providing a range-like interface in input file.
Definition: in_file_iterator.hpp:41
constexpr in_file_iterator & operator=(in_file_iterator &&)=default
Move assignment.
typename file_type::value_type value_type
The value type.
Definition: in_file_iterator.hpp:51
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:141
void operator++(int)
Post-increment is the same as pre-increment, but returns void.
Definition: in_file_iterator.hpp:100
in_file_iterator & operator++()
Move to the next record in the file and return a reference to it.
Definition: in_file_iterator.hpp:92
constexpr bool operator!=(std::default_sentinel_t const &) const noexcept
Checks whether *this is not equal to the sentinel.
Definition: in_file_iterator.hpp:134
typename file_type::reference const_reference
The const reference type.
Definition: in_file_iterator.hpp:55
reference operator*() noexcept
Dereference returns the currently buffered record.
Definition: in_file_iterator.hpp:107
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:53
file_type * host
Pointer to file host.
Definition: in_file_iterator.hpp:157
constexpr in_file_iterator(file_type &_host) noexcept
Construct with reference to host.
Definition: in_file_iterator.hpp:83
typename file_type::difference_type difference_type
The difference type. A signed integer type, usually std::ptrdiff_t.
Definition: in_file_iterator.hpp:59
typename file_type::value_type * pointer
The pointer type.
Definition: in_file_iterator.hpp:61
constexpr bool operator==(std::default_sentinel_t const &) const noexcept
Checks whether *this is equal to the sentinel.
Definition: in_file_iterator.hpp:127
constexpr in_file_iterator & operator=(in_file_iterator const &)=default
Copy construction via assignment.
reference operator*() const noexcept
Dereference returns the currently buffered record.
Definition: in_file_iterator.hpp:114
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:57
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:148
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.
Adaptations of concepts from the Ranges TS.