17 #if __cpp_lib_ranges >= 202110L
21 namespace seqan3::detail
23 using std::ranges::owning_view;
24 using std::ranges::views::all;
25 using std::ranges::views::all_t;
32 namespace seqan3::detail
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>>
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;
58 constexpr owning_view(rng_t && r) : rng(
std::move(r))
62 constexpr rng_t & base() & noexcept
68 constexpr rng_t
const & base() const & noexcept
74 constexpr rng_t && base() && noexcept
76 return std::move(rng);
80 constexpr rng_t
const && base() const && noexcept
82 return std::move(rng);
86 constexpr std::ranges::iterator_t<rng_t>
begin()
88 return std::ranges::begin(rng);
92 constexpr
auto begin() const
95 return std::ranges::begin(rng);
99 constexpr std::ranges::sentinel_t<rng_t>
end()
101 return std::ranges::end(rng);
105 constexpr
auto end() const
108 return std::ranges::end(rng);
112 constexpr
bool empty()
115 return std::ranges::empty(rng);
119 constexpr
bool empty() const
122 return std::ranges::empty(rng);
126 constexpr
auto size()
133 constexpr
auto size() const
140 constexpr
auto data()
143 return std::ranges::data(rng);
147 constexpr
auto data() const
148 requires std::ranges::contiguous_range<rng_t const>
150 return std::ranges::data(rng);
157 class all_fn :
public adaptor_base<all_fn>
161 friend adaptor_base<all_fn>;
164 template <
typename t>
165 static constexpr
bool decays_to_view = std::ranges::view<std::decay_t<t>>;
168 template <
typename t>
169 static constexpr
bool valid_for_ref_view =
requires { std::ranges::ref_view(std::declval<t>()); };
172 template <
typename t>
173 static constexpr
bool valid_for_owning_view =
requires { owning_view(std::declval<t>()); };
176 using adaptor_base<all_fn>::adaptor_base;
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)
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)};
197 return owning_view{std::forward<rng_t>(rng)};
204 inline constexpr
auto all = all_fn{};
209 template <std::ranges::range rng_t>
210 using all_t = decltype(all(std::declval<rng_t>()));
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
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.
The <ranges> header from C++20's standard library.
Provides type traits for working with templates.