SeqAn3
in_file_iterator.hpp
Go to the documentation of this file.
1 // ============================================================================
2 // SeqAn - The Library for Sequence Analysis
3 // ============================================================================
4 //
5 // Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin
6 // Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of Knut Reinert or the FU Berlin nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
25 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 // DAMAGE.
32 //
33 // ============================================================================
34 
40 #pragma once
41 
42 #include <cassert>
43 
44 #include <range/v3/range_fwd.hpp>
45 
46 #include <seqan3/core/platform.hpp>
47 
48 #include <seqan3/std/ranges>
49 
50 namespace seqan3::detail
51 {
52 
69 template <typename file_type>
70 class in_file_iterator
71 {
72  static_assert(!std::is_const_v<file_type>,
73  "You cannot iterate over const files, because the iterator changes the file.");
74 public:
79  using value_type = typename file_type::value_type;
80  using reference = typename file_type::reference;
81  using const_reference = typename file_type::reference;
82  using size_type = typename file_type::size_type;
83  using difference_type = typename file_type::difference_type;
84  using pointer = typename file_type::value_type *;
86  using iterator_category = std::input_iterator_tag;
88 
92  constexpr in_file_iterator() = default;
95  constexpr in_file_iterator(in_file_iterator const &) = default;
97  constexpr in_file_iterator & operator=(in_file_iterator const &) = default;
99  constexpr in_file_iterator (in_file_iterator &&) = default;
101  constexpr in_file_iterator & operator=(in_file_iterator &&) = default;
103  ~in_file_iterator() = default;
104 
106  constexpr in_file_iterator(file_type & _host) noexcept :
107  host{&_host}
108  {}
110 
114  in_file_iterator & operator++()
116  {
117  assert(host != nullptr);
118  host->read_next_record();
119  return *this;
120  }
121 
123  void operator++(int)
124  {
125  assert(host != nullptr);
126  ++(*this);
127  }
128 
130  reference operator*() noexcept
131  {
132  assert(host != nullptr);
133  return host->front();
134  }
135 
137  reference operator*() const noexcept
138  {
139  assert(host != nullptr);
140  return host->front();
141  }
143 
148  constexpr bool operator==(std::ranges::default_sentinel const &) const noexcept
149  {
150  assert(host != nullptr);
151  return host->at_end;
152  }
153 
154  constexpr bool operator!=(std::ranges::default_sentinel const &) const noexcept
155  {
156  assert(host != nullptr);
157  return !host->at_end;
158  }
159 
160  constexpr friend bool operator==(std::ranges::default_sentinel const &,
161  in_file_iterator const & it) noexcept
162  {
163  return (it == std::ranges::default_sentinel{});
164  }
165 
166  constexpr friend bool operator!=(std::ranges::default_sentinel const &,
167  in_file_iterator const & it) noexcept
168  {
169  return (it != std::ranges::default_sentinel{});
170  }
172 
173 private:
175  file_type * host{};
176 };
177 
178 } // namespace seqan3::detail
Contains platform and dependency checks.
Adaptations of concepts from the Ranges TS.
Definition: aligned_sequence_concept.hpp:288
::ranges::default_sentinel default_sentinel
Alias for ranges::default_sentinel. Empty sentinel type for use with iterator types that know the bou...
Definition: ranges:215