17#if __cpp_lib_ranges >= 202110L
21namespace seqan3::detail
23using std::ranges::owning_view;
24using std::ranges::views::all;
25using std::ranges::views::all_t;
32namespace seqan3::detail
39template <std::ranges::range rng_t>
40 requires std::movable<rng_t> && (!seqan3::detail::is_type_specialisation_of_v<rng_t, std::initializer_list>)
41class owning_view :
public std::ranges::view_interface<owning_view<rng_t>>
49 requires std::default_initializable<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()
92 constexpr auto begin() const
93 requires
std::ranges::range<rng_t const>
99 constexpr std::ranges::sentinel_t<rng_t>
end()
101 return std::ranges::end(rng);
105 constexpr auto end() const
106 requires
std::ranges::range<rng_t const>
108 return std::ranges::end(rng);
112 constexpr bool empty()
113 requires requires { std::ranges::empty(rng); }
115 return std::ranges::empty(rng);
119 constexpr bool empty() const
120 requires requires { std::ranges::empty(rng); }
122 return std::ranges::empty(rng);
126 constexpr auto size()
127 requires std::ranges::sized_range<rng_t>
133 constexpr auto size() const
134 requires
std::ranges::sized_range<rng_t const>
140 constexpr auto data()
141 requires std::ranges::contiguous_range<rng_t>
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);
157class 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)};
204inline constexpr auto all = all_fn{};
209template <std::ranges::range rng_t>
210using all_t =
decltype(all(std::declval<rng_t>()));
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:146
SeqAn specific customisations in the standard namespace.
Provides type traits for working with templates.