SeqAn3  3.0.0
The Modern C++ library for sequence analysis.
persist.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2019, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2019, 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 <range/v3/algorithm/copy.hpp>
16 
20 #include <seqan3/io/exception.hpp>
21 #include <seqan3/range/concept.hpp>
25 #include <seqan3/std/algorithm>
26 #include <seqan3/std/concepts>
27 #include <seqan3/std/ranges>
28 
29 namespace seqan3::detail
30 {
31 
32 // ============================================================================
33 // view_persist
34 // ============================================================================
35 
47 template <std::ranges::InputRange urng_t>
48 class view_persist : public ranges::view_interface<view_persist<urng_t>>
49 {
50 private:
53 
54 public:
58  using reference = reference_t<urng_t>;
61  using const_reference = reference;
63  using value_type = value_type_t<urng_t>;
65  using size_type = detail::transformation_trait_or_t<seqan3::size_type<urng_t>, void>;
67  using difference_type = difference_type_t<urng_t>;
69  using iterator = std::ranges::iterator_t<urng_t>;
71  using const_iterator = iterator;
73 
77  view_persist() noexcept = default;
78  constexpr view_persist(view_persist const & rhs) noexcept = default;
79  constexpr view_persist(view_persist && rhs) noexcept = default;
80  constexpr view_persist & operator=(view_persist const & rhs) noexcept = default;
81  constexpr view_persist & operator=(view_persist && rhs) noexcept = default;
82  ~view_persist() noexcept = default;
83 
87  view_persist(urng_t && _urange) :
88  urange{new urng_t{std::move(_urange)}}
89  {}
91 
108  const_iterator begin() const noexcept
109  {
110  return seqan3::begin(*urange);
111  }
112 
114  const_iterator cbegin() const noexcept
115  {
116  return begin();
117  }
118 
132  auto end() const noexcept
133  {
134  return seqan3::end(*urange);
135  }
136 
138  auto cend() const noexcept
139  {
140  return end();
141  }
143 };
144 
147 template <typename urng_t>
148 view_persist(urng_t &&) -> view_persist<std::remove_reference_t<urng_t>>;
149 
150 // ============================================================================
151 // persist_fn (adaptor definition)
152 // ============================================================================
153 
155 
157 class persist_fn : public adaptor_base<persist_fn>
158 {
159 private:
161  using base_t = adaptor_base<persist_fn>;
162 
163 public:
165  using base_t::base_t;
166 
167 private:
169  friend base_t;
170 
174  template <std::ranges::ViewableRange urng_t>
175  static auto impl(urng_t && urange)
176  {
177  return std::view::all(std::forward<urng_t>(urange));
178  }
179 
183  template <std::ranges::Range urng_t>
184  static auto impl(urng_t && urange)
185  {
186  static_assert(!std::is_lvalue_reference_v<urng_t>, "BUG: lvalue-reference in persist_fn::impl().");
187  return view_persist{std::move(urange)};
188  }
189 };
191 
192 } // namespace seqan3::detail
193 
194 // ============================================================================
195 // view::persist (adaptor instance definition)
196 // ============================================================================
197 
198 namespace seqan3::view
199 {
200 
251 inline auto constexpr persist = detail::persist_fn{};
252 
254 
255 } // namespace seqan3::view
::ranges::cbegin cbegin
Alias for ranges::cbegin. Returns an iterator to the beginning of a range.
Definition: ranges:209
Provides exceptions used in the I/O module.
Provides various shortcuts for common std::ranges functions.
Provides seqan3::detail::transformation_trait_or.
constexpr auto all
A view adaptor that behaves like std::view:all, but type erases contiguous ranges.
Definition: view_all.hpp:160
::ranges::view_interface< urng_t > view_interface
Alias for ranges::view_interface.
Definition: ranges:220
Provides various transformation traits for use on iterators.
Additional non-standard concepts for ranges.
The Concepts library.
Auxiliary header for the view submodule .
::ranges::iterator_t iterator_t
Alias for ranges::iterator_t. Obtains the iterator type of a range.
Definition: ranges:204
Adaptations of concepts from the Ranges TS.
::ranges::begin begin
Alias for ranges::begin. Returns an iterator to the beginning of a range.
Definition: ranges:174
The SeqAn3 namespace for views.
auto constexpr persist
A view adaptor that wraps rvalue references of non-views.
Definition: persist.hpp:251
Definition: aligned_sequence_concept.hpp:35
Adaptations of algorithms from the Ranges TS.
Provides various transformation traits used by the range module.
::ranges::cend cend
Alias for ranges::cend. Returns an iterator to the end of a range.
Definition: ranges:214
Adaptations of concepts from the standard library.
::ranges::end end
Alias for ranges::end. Returns an iterator to the end of a range.
Definition: ranges:179