SeqAn3  3.2.0
The Modern C++ library for sequence analysis.
all_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 <ranges>
16 
17 #if __cpp_lib_ranges >= 202110L
18 
19 # include <seqan3/core/platform.hpp>
20 
21 namespace seqan3::detail
22 {
23 using std::ranges::owning_view;
24 using std::ranges::views::all;
25 using std::ranges::views::all_t;
26 
27 } // namespace seqan3::detail
28 #else
31 
32 namespace seqan3::detail
33 {
34 
39 template <std::ranges::range rng_t>
40  requires std::movable<rng_t> && (!seqan3::detail::is_type_specialisation_of_v<rng_t, std::initializer_list>)
41 class owning_view : public std::ranges::view_interface<owning_view<rng_t>>
42 {
43 private:
45  rng_t rng = rng_t();
46 
47 public:
48  owning_view()
49  requires std::default_initializable<rng_t>
50  = default;
51  owning_view(owning_view const &) = delete;
52  owning_view & operator=(owning_view const &) = delete;
53  owning_view(owning_view &&) = default;
54  owning_view & operator=(owning_view &&) = default;
55  ~owning_view() = default;
56 
58  constexpr owning_view(rng_t && r) : rng(std::move(r))
59  {}
60 
62  constexpr rng_t & base() & noexcept
63  {
64  return rng;
65  }
66 
68  constexpr rng_t const & base() const & noexcept
69  {
70  return rng;
71  }
72 
74  constexpr rng_t && base() && noexcept
75  {
76  return std::move(rng);
77  }
78 
80  constexpr rng_t const && base() const && noexcept
81  {
82  return std::move(rng);
83  }
84 
86  constexpr std::ranges::iterator_t<rng_t> begin()
87  {
88  return std::ranges::begin(rng);
89  }
90 
92  constexpr auto begin() const
93  requires std::ranges::range<rng_t const>
94  {
95  return std::ranges::begin(rng);
96  }
97 
99  constexpr std::ranges::sentinel_t<rng_t> end()
100  {
101  return std::ranges::end(rng);
102  }
103 
105  constexpr auto end() const
106  requires std::ranges::range<rng_t const>
107  {
108  return std::ranges::end(rng);
109  }
110 
112  constexpr bool empty()
113  requires requires { std::ranges::empty(rng); }
114  {
115  return std::ranges::empty(rng);
116  }
117 
119  constexpr bool empty() const
120  requires requires { std::ranges::empty(rng); }
121  {
122  return std::ranges::empty(rng);
123  }
124 
126  constexpr auto size()
127  requires std::ranges::sized_range<rng_t>
128  {
129  return std::ranges::size(rng);
130  }
131 
133  constexpr auto size() const
134  requires std::ranges::sized_range<rng_t const>
135  {
136  return std::ranges::size(rng);
137  }
138 
140  constexpr auto data()
141  requires std::ranges::contiguous_range<rng_t>
142  {
143  return std::ranges::data(rng);
144  }
145 
147  constexpr auto data() const
148  requires std::ranges::contiguous_range<rng_t const>
149  {
150  return std::ranges::data(rng);
151  }
152 };
153 
157 class all_fn : public adaptor_base<all_fn>
158 {
159 private:
161  friend adaptor_base<all_fn>;
162 
164  template <typename t>
165  static constexpr bool decays_to_view = std::ranges::view<std::decay_t<t>>;
166 
168  template <typename t>
169  static constexpr bool valid_for_ref_view = requires { std::ranges::ref_view(std::declval<t>()); };
170 
172  template <typename t>
173  static constexpr bool valid_for_owning_view = requires { owning_view(std::declval<t>()); };
174 
175 public:
176  using adaptor_base<all_fn>::adaptor_base;
177 
188  template <std::ranges::range rng_t>
189  requires decays_to_view<rng_t> || valid_for_ref_view<rng_t> || valid_for_owning_view<rng_t>
190  static auto impl(rng_t && rng)
191  {
192  if constexpr (decays_to_view<rng_t>)
193  return std::forward<rng_t>(rng);
194  else if constexpr (valid_for_ref_view<rng_t>)
195  return std::ranges::ref_view{std::forward<rng_t>(rng)};
196  else
197  return owning_view{std::forward<rng_t>(rng)};
198  }
199 };
200 
204 inline constexpr auto all = all_fn{};
205 
209 template <std::ranges::range rng_t>
210 using all_t = decltype(all(std::declval<rng_t>()));
211 
212 } // namespace seqan3::detail
213 #endif // __cpp_lib_ranges >= 202110L
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
T begin(T... args)
T data(T... args)
T empty(T... args)
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
constexpr size_t size
The size of a type pack.
Definition: type_pack/traits.hpp:146
SeqAn specific customisations in the standard namespace.
Provides platform and dependency checks.
The <ranges> header from C++20's standard library.
Provides type traits for working with templates.