SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
persist_view.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, 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 <algorithm>
16 #include <concepts>
17 #include <memory>
18 #include <ranges>
19 
25 
26 namespace seqan3::detail
27 {
28 
29 // ============================================================================
30 // view_persist
31 // ============================================================================
32 
44 template <std::ranges::input_range urng_t>
45 class view_persist : public std::ranges::view_interface<view_persist<urng_t>>
46 {
47 private:
50 
51 public:
55  view_persist() noexcept = default;
56  constexpr view_persist(view_persist const & rhs) noexcept = default;
57  constexpr view_persist(view_persist && rhs) noexcept = default;
58  constexpr view_persist & operator=(view_persist const & rhs) noexcept = default;
59  constexpr view_persist & operator=(view_persist && rhs) noexcept = default;
60  ~view_persist() noexcept = default;
61 
65  view_persist(urng_t && _urange) : urange{new urng_t{std::move(_urange)}}
66  {}
68 
85  auto begin() noexcept
86  {
87  return std::ranges::begin(*urange);
88  }
89 
91  auto begin() const noexcept
93  {
94  return std::ranges::cbegin(*urange);
95  }
96 
110  auto end() noexcept
111  {
112  return std::ranges::end(*urange);
113  }
114 
116  auto end() const noexcept
118  {
119  return std::ranges::cend(*urange);
120  }
122 };
123 
126 template <typename urng_t>
127 view_persist(urng_t &&) -> view_persist<std::remove_reference_t<urng_t>>;
128 
129 // ============================================================================
130 // persist_fn (adaptor definition)
131 // ============================================================================
132 
134 
137 class persist_fn : public adaptor_base<persist_fn>
138 {
139 private:
141  using base_t = adaptor_base<persist_fn>;
142 
143 public:
145  using base_t::base_t;
146 
147 private:
149  friend base_t;
150 
154  template <std::ranges::viewable_range urng_t>
155  static auto impl(urng_t && urange)
156  {
157  return std::views::all(std::forward<urng_t>(urange));
158  }
159 
163  template <std::ranges::range urng_t>
164  static auto impl(urng_t && urange)
165  {
166  static_assert(!std::is_lvalue_reference_v<urng_t>, "BUG: lvalue-reference in persist_fn::impl().");
167  return view_persist{std::move(urange)};
168  }
169 };
171 
172 // ============================================================================
173 // detail::persist (adaptor instance definition)
174 // ============================================================================
175 
219 inline constexpr auto persist = persist_fn{};
220 
221 } // namespace seqan3::detail
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
T begin(T... args)
The <concepts> header from C++20's standard library.
Provides various transformation traits used by the range module.
T end(T... args)
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
Specifies requirements of an input range type for which the const version of that type satisfies the ...
Provides various transformation traits for use on iterators.
The <ranges> header from C++20's standard library.
Provides seqan3::detail::transformation_trait_or.
Additional non-standard concepts for ranges.