32 namespace seqan3::detail
53 template <std::ranges::view urng_t,
bool exactly,
bool or_throw>
54 class view_take :
public std::ranges::view_interface<view_take<urng_t, exactly, or_throw>>
56 #if SEQAN3_VERSION_MAJOR == 3 && SEQAN3_VERSION_MINOR == 1
57 #pragma warning "Move this class to seqan3/io/detail/take_exactly_view.hpp and name it view_take_exactly; substitute exactly with = true."
67 template <
bool const_range>
75 using iterator = basic_iterator<false>;
81 using const_iterator = basic_iterator<true>;
88 view_take() =
default;
89 view_take(view_take
const & rhs) =
default;
90 view_take(view_take && rhs) =
default;
91 view_take & operator=(view_take
const & rhs) =
default;
92 view_take & operator=(view_take && rhs) =
default;
93 ~view_take() =
default;
100 constexpr view_take(urng_t _urange,
size_t const _size)
101 : urange{
std::
move(_urange)}, target_size{_size}
103 if constexpr (std::ranges::sized_range<urng_t>)
107 if constexpr (exactly && or_throw)
111 "You are trying to construct a detail::take_exactly_or_throw from a range that is strictly "
129 template <std::ranges::viewable_range rng_t>
131 requires std::constructible_from<rng_t, std::views::all_t<rng_t>>
133 constexpr view_take(rng_t && _urange,
size_t const _size)
134 : view_take{
std::views::all(
std::
forward<rng_t>(_urange)), _size}
154 constexpr
auto begin() noexcept
156 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
163 constexpr
auto begin() const noexcept
166 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
185 constexpr
auto end() noexcept
187 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
190 return std::ranges::end(urange);
194 constexpr
auto end() const noexcept
197 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
200 return std::ranges::cend(urange);
219 constexpr
auto size() const noexcept
220 requires exactly ||
std::ranges::sized_range<urng_t>
228 template <
typename urng_t,
229 bool exactly =
false,
230 bool or_throw =
false>
231 view_take(urng_t && ,
size_t) -> view_take<std::views::all_t<urng_t>, exactly, or_throw>;
235 template <std::ranges::view urng_t,
bool exactly,
bool or_throw>
236 template <
bool const_range>
237 class view_take<urng_t, exactly, or_throw>::basic_iterator :
238 public inherited_iterator_base<basic_iterator<const_range>, maybe_const_iterator_t<const_range, urng_t>>
242 using base_base_t = maybe_const_iterator_t<const_range, urng_t>;
244 using base_t = inherited_iterator_base<basic_iterator, maybe_const_iterator_t<const_range, urng_t>>;
247 using sentinel_type = maybe_const_sentinel_t<const_range, urng_t>;
263 basic_iterator() =
default;
264 basic_iterator(basic_iterator
const & rhs) =
default;
265 basic_iterator(basic_iterator && rhs) =
default;
266 basic_iterator & operator=(basic_iterator
const & rhs) =
default;
267 basic_iterator & operator=(basic_iterator && rhs) =
default;
268 ~basic_iterator() =
default;
271 constexpr basic_iterator(base_base_t
const & it) noexcept(noexcept(base_t{it})) :
276 constexpr basic_iterator(base_base_t it,
278 size_t const _max_pos,
279 view_take * host =
nullptr) noexcept(noexcept(base_t{it})) :
280 base_t{
std::
move(it)}, pos{_pos}, max_pos(_max_pos)
286 using typename base_t::difference_type;
287 using typename base_t::reference;
295 constexpr basic_iterator & operator++() noexcept(noexcept(++
std::declval<base_t &>()))
297 base_t::operator++();
299 if constexpr (exactly && !std::forward_iterator<base_base_t>)
300 --host_ptr->target_size;
305 constexpr basic_iterator operator++(
int) noexcept(noexcept(++std::declval<basic_iterator &>()) &&
306 std::is_nothrow_copy_constructible_v<basic_iterator>)
308 basic_iterator cpy{*
this};
314 constexpr basic_iterator & operator--() noexcept(noexcept(--
std::declval<base_base_t &>()))
316 requires
std::bidirectional_iterator<base_base_t>
319 base_t::operator--();
325 constexpr basic_iterator operator--(
int) noexcept(noexcept(--std::declval<basic_iterator &>()) &&
326 std::is_nothrow_copy_constructible_v<basic_iterator>)
328 requires std::bidirectional_iterator<base_base_t>
331 basic_iterator cpy{*
this};
337 constexpr basic_iterator & operator+=(difference_type
const skip)
338 noexcept(noexcept(std::declval<base_t &>() += skip))
340 requires std::random_access_iterator<base_base_t>
343 base_t::operator+=(skip);
349 constexpr basic_iterator & operator-=(difference_type
const skip)
350 noexcept(noexcept(std::declval<base_t &>() -= skip))
352 requires std::random_access_iterator<base_base_t>
355 base_t::operator-=(skip);
367 constexpr
bool operator==(basic_iterator
const & rhs)
const
368 noexcept(!or_throw && noexcept(std::declval<base_base_t &>() == std::declval<base_base_t &>()))
370 requires
std::forward_iterator<base_base_t>
373 return this->base() == rhs.base();
377 constexpr
bool operator==(sentinel_type
const & rhs)
const
378 noexcept(!or_throw && noexcept(std::declval<base_base_t const &>() == std::declval<sentinel_type const &>()))
383 if (this->base() == rhs)
385 if constexpr (or_throw)
386 throw unexpected_end_of_input{
"Reached end of input before designated size."};
397 constexpr
friend bool operator==(sentinel_type
const & lhs, basic_iterator
const & rhs)
398 noexcept(noexcept(rhs == lhs))
404 constexpr
bool operator!=(sentinel_type
const & rhs)
const
405 noexcept(noexcept(std::declval<basic_iterator &>() == rhs))
407 return !(*
this == rhs);
411 constexpr
bool operator!=(basic_iterator
const & rhs)
const
412 noexcept(noexcept(std::declval<basic_iterator &>() == rhs))
414 requires std::forward_iterator<base_base_t>
417 return !(*
this == rhs);
421 constexpr
friend bool operator!=(sentinel_type
const & lhs, basic_iterator
const & rhs)
422 noexcept(noexcept(rhs != lhs))
438 noexcept(noexcept(std::declval<base_base_t &>()[0]))
440 requires
std::random_access_iterator<base_base_t>
443 return base_t::operator[](n);
455 template <
bool exactly,
bool or_throw>
459 constexpr
auto operator()(
size_t const size)
const
461 return adaptor_from_functor{*
this,
size};
467 template <std::ranges::range urng_t>
468 constexpr
auto operator()(urng_t && urange,
size_t target_size)
const
470 static_assert(std::ranges::viewable_range<urng_t>,
471 "The views::take adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
474 if constexpr (std::ranges::sized_range<urng_t>)
476 if constexpr (or_throw)
481 "range that is strictly smaller."};
494 return urange.substr(0, target_size);
505 else if constexpr (std::ranges::borrowed_range<urng_t> &&
506 std::ranges::contiguous_range<urng_t> &&
507 std::ranges::sized_range<urng_t>)
511 return std::span{std::ranges::data(urange), target_size};
514 else if constexpr (std::ranges::borrowed_range<urng_t> &&
515 std::ranges::random_access_range<urng_t> &&
516 std::ranges::sized_range<urng_t>)
520 return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
530 return view_take<std::views::all_t<urng_t>, exactly, or_throw>
532 std::forward<urng_t>(urange),
541 #ifdef SEQAN3_DEPRECATED_310
Provides seqan3::detail::adaptor_from_functor.
Adaptations of algorithms from the Ranges TS.
Provides the seqan3::detail::inherited_iterator_base template.
Provides various transformation traits used by the range module.
Provides type traits for working with templates.
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
constexpr auto take
A view adaptor that returns the first size elements from the underlying range (or less if the underly...
Definition: take_view.hpp:609
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
Specifies requirements of an input range type for which the const version of that type satisfies the ...
Provides exceptions used in the I/O module.
Provides various transformation traits for use on iterators.
Provides C++20 additions to the <iterator> header.
The SeqAn namespace for views.
Definition: char_to.hpp:22
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.
Provides std::span from the C++20 standard library.
Provides C++20 additions to the type_traits header.
Additional non-standard concepts for ranges.