52 template <std::ranges::view urng_t,
bool exactly,
bool or_throw>
53 class view_take :
public std::ranges::view_interface<view_take<urng_t, exactly, or_throw>>
63 template <
bool const_range>
96 constexpr
view_take(urng_t _urange,
size_t const _size)
99 if constexpr (std::ranges::sized_range<urng_t>)
103 if constexpr (exactly && or_throw)
107 "You are trying to construct a views::take_exactly_or_throw from a range that is strictly "
125 template <std::ranges::viewable_range rng_t>
127 requires std::constructible_from<rng_t, std::views::all_t<rng_t>>
129 constexpr
view_take(rng_t && _urange,
size_t const _size)
152 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
153 return std::ranges::begin(
urange);
159 constexpr
auto begin() const noexcept
162 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
163 return std::ranges::cbegin(
urange);
181 constexpr
auto end() noexcept
183 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
186 return std::ranges::end(
urange);
190 constexpr
auto end() const noexcept
193 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
196 return std::ranges::cend(
urange);
215 constexpr
auto size() const noexcept
216 requires exactly ||
std::ranges::sized_range<urng_t>
224 template <
typename urng_t,
225 bool exactly =
false,
226 bool or_throw =
false>
231 template <std::ranges::view urng_t,
bool exactly,
bool or_throw>
232 template <
bool const_range>
274 size_t const _max_pos,
276 base_t{
std::
move(it)}, pos{_pos}, max_pos(_max_pos)
309 base_t::operator++();
311 if constexpr (exactly && !std::forward_iterator<base_base_t>)
312 --host_ptr->target_size;
318 std::is_nothrow_copy_constructible_v<basic_iterator>)
331 base_t::operator--();
338 std::is_nothrow_copy_constructible_v<basic_iterator>)
340 requires std::bidirectional_iterator<base_base_t>
350 noexcept(noexcept(std::declval<base_t &>() += skip))
352 requires std::random_access_iterator<base_base_t>
355 base_t::operator+=(skip);
362 noexcept(noexcept(std::declval<base_t &>() -= skip))
364 requires std::random_access_iterator<base_base_t>
367 base_t::operator-=(skip);
380 noexcept(!or_throw && noexcept(std::declval<base_base_t &>() == std::declval<base_base_t &>()))
385 return this->base() == rhs.base();
390 noexcept(!or_throw && noexcept(std::declval<base_base_t const &>() == std::declval<sentinel_type const &>()))
395 if (this->base() == rhs)
397 if constexpr (or_throw)
410 noexcept(noexcept(rhs == lhs))
417 noexcept(noexcept(std::declval<basic_iterator &>() == rhs))
419 return !(*
this == rhs);
424 noexcept(noexcept(std::declval<basic_iterator &>() == rhs))
426 requires std::forward_iterator<base_base_t>
429 return !(*
this == rhs);
434 noexcept(noexcept(rhs != lhs))
450 noexcept(noexcept(std::declval<base_base_t &>()[0]))
455 return base_t::operator[](n);
467 template <
bool exactly,
bool or_throw>
479 template <std::ranges::range urng_t>
480 constexpr
auto operator()(urng_t && urange,
size_t target_size)
const
482 static_assert(std::ranges::viewable_range<urng_t>,
483 "The views::take adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
486 if constexpr (std::ranges::sized_range<urng_t>)
488 if constexpr (or_throw)
493 "range that is strictly smaller."};
505 return urange.substr(0, target_size);
514 else if constexpr (std::ranges::borrowed_range<urng_t> &&
515 std::ranges::contiguous_range<urng_t> &&
516 std::ranges::sized_range<urng_t>)
518 return std::span{std::ranges::data(urange), target_size};
521 else if constexpr (std::ranges::borrowed_range<urng_t> &&
522 std::ranges::random_access_range<urng_t> &&
523 std::ranges::sized_range<urng_t>)
525 return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
527 std::ranges::begin(urange),
528 std::ranges::begin(urange) + target_size,
537 std::forward<urng_t>(urange),
Adaptations of algorithms from the Ranges TS.
Template for range adaptor closure objects that store arguments and wrap a proto-adaptor.
Definition: detail.hpp:371
A CRTP base template for creating iterators that inherit from other iterators.
Definition: inherited_iterator_base.hpp:52
A generic random access iterator that delegates most operations to the range.
Definition: random_access_iterator.hpp:310
The forward declared iterator type.
Definition: take.hpp:235
basic_iterator(basic_iterator &&rhs)=default
Defaulted.
constexpr basic_iterator operator--(int) noexcept(noexcept(--std::declval< basic_iterator & >()) &&std::is_nothrow_copy_constructible_v< basic_iterator >)
Returns an iterator decremented by one.
Definition: take.hpp:337
constexpr basic_iterator & operator-=(difference_type const skip) noexcept(noexcept(std::declval< base_t & >() -=skip))
Advances the iterator by -skip positions.
Definition: take.hpp:361
detail::iterator_category_tag_t< base_base_t > iterator_category
The iterator category tag.
Definition: take.hpp:296
maybe_const_sentinel_t< const_range, urng_t > sentinel_type
The sentinel type is identical to that of the underlying range.
Definition: take.hpp:243
basic_iterator & operator=(basic_iterator &&rhs)=default
Defaulted.
constexpr basic_iterator(base_base_t const &it) noexcept(noexcept(base_t{it}))
Constructor that delegates to the CRTP layer.
Definition: take.hpp:267
constexpr bool operator!=(basic_iterator const &rhs) const noexcept(noexcept(std::declval< basic_iterator & >()==rhs))
Checks whether *this is not equal to rhs.
Definition: take.hpp:423
constexpr bool operator==(sentinel_type const &rhs) const noexcept(!or_throw &&noexcept(std::declval< base_base_t const & >()==std::declval< sentinel_type const & >()))
Checks whether *this is equal to rhs.
Definition: take.hpp:389
basic_iterator()=default
Defaulted.
constexpr friend bool operator!=(sentinel_type const &lhs, basic_iterator const &rhs) noexcept(noexcept(rhs !=lhs))
Checks whether lhs is not equal to rhs.
Definition: take.hpp:433
constexpr bool operator!=(sentinel_type const &rhs) const noexcept(noexcept(std::declval< basic_iterator & >()==rhs))
Checks whether *this is not equal to rhs.
Definition: take.hpp:416
constexpr bool operator==(basic_iterator const &rhs) const noexcept(!or_throw &&noexcept(std::declval< base_base_t & >()==std::declval< base_base_t & >()))
Checks whether *this is equal to rhs.
Definition: take.hpp:379
std::conditional_t< exactly &&!std::forward_iterator< base_base_t >, view_take *, detail::ignore_t > host_ptr
A pointer to host, s.t. the size of the view can shrink on pure input ranges.
Definition: take.hpp:252
constexpr basic_iterator(base_base_t it, size_t const _pos, size_t const _max_pos, view_take *host=nullptr) noexcept(noexcept(base_t{it}))
Constructor that delegates to the CRTP layer and initialises the members.
Definition: take.hpp:272
basic_iterator(basic_iterator const &rhs)=default
Defaulted.
constexpr friend bool operator==(sentinel_type const &lhs, basic_iterator const &rhs) noexcept(noexcept(rhs==lhs))
Checks whether lhs is equal to rhs.
Definition: take.hpp:409
constexpr basic_iterator & operator++() noexcept(noexcept(++std::declval< base_t & >()))
Increments the iterator by one.
Definition: take.hpp:307
constexpr basic_iterator & operator--() noexcept(noexcept(--std::declval< base_base_t & >()))
Decrements the iterator by one.
Definition: take.hpp:326
maybe_const_iterator_t< const_range, urng_t > base_base_t
The iterator type of the underlying range.
Definition: take.hpp:238
constexpr basic_iterator operator++(int) noexcept(noexcept(++std::declval< basic_iterator & >()) &&std::is_nothrow_copy_constructible_v< basic_iterator >)
Returns an iterator incremented by one.
Definition: take.hpp:317
constexpr basic_iterator & operator+=(difference_type const skip) noexcept(noexcept(std::declval< base_t & >()+=skip))
Advances the iterator by skip positions.
Definition: take.hpp:349
~basic_iterator()=default
Defaulted.
constexpr reference operator[](std::make_unsigned_t< difference_type > const n) const noexcept(noexcept(std::declval< base_base_t & >()[0]))
Accesses an element by index.
Definition: take.hpp:449
basic_iterator & operator=(basic_iterator const &rhs)=default
Defaulted.
detail::iter_pointer_t< base_base_t > pointer
The pointer type.
Definition: take.hpp:294
The type returned by seqan3::views::take and seqan3::views::take_or_throw.
Definition: take.hpp:54
view_take & operator=(view_take &&rhs)=default
Defaulted.
view_take(view_take const &rhs)=default
Defaulted.
view_take(view_take &&rhs)=default
Defaulted.
constexpr view_take(urng_t _urange, size_t const _size)
Construct from another View.
Definition: take.hpp:96
view_take()=default
Defaulted.
size_t target_size
The desired target_size.
Definition: take.hpp:60
~view_take()=default
Defaulted.
constexpr auto end() const noexcept requires const _iterable_range< urng_t >
Returns an iterator to the element following the last element of the range.
Definition: take.hpp:190
constexpr auto end() noexcept
Returns an iterator to the element following the last element of the range.
Definition: take.hpp:181
view_take & operator=(view_take const &rhs)=default
Defaulted.
constexpr auto begin() const noexcept requires const _iterable_range< urng_t >
Returns an iterator to the first element of the container.
Definition: take.hpp:159
view_take(urng_t &&, size_t) -> view_take< std::views::all_t< urng_t >, exactly, or_throw >
Template argument type deduction guide that strips references.
constexpr auto begin() noexcept
Returns an iterator to the first element of the container.
Definition: take.hpp:150
constexpr view_take(rng_t &&_urange, size_t const _size)
Construct from another viewable_range.
Definition: take.hpp:129
urng_t urange
The underlying range.
Definition: take.hpp:57
Provides various transformation traits used by the range module.
Provides type traits for working with templates.
std::ranges::sentinel_t< maybe_const_range_t< const_v, range_t > > maybe_const_sentinel_t
Returns the const sentinel of range_t if const_range is true; otherwise the non-const sentinel.
Definition: type_traits.hpp:50
std::ranges::iterator_t< maybe_const_range_t< const_range, range_t > > maybe_const_iterator_t
Returns the const iterator of range_t if const_range is true; otherwise the non-const iterator.
Definition: type_traits.hpp:45
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:150
constexpr auto take
A view adaptor that returns the first size elements from the underlying range (or less if the underly...
Definition: take.hpp:611
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:70
Provides the seqan3::detail::inherited_iterator_base template.
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 internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
typename iter_pointer< it_t >::type iter_pointer_t
Return the pointer type of the input type (transformation_trait shortcut).
Definition: iterator_traits.hpp:270
typename std::iterator_traits< it_t >::iterator_category iterator_category_tag_t
Exposes the iterator_category from the modelled concept.
Definition: iterator_traits.hpp:200
The SeqAn namespace for views.
SeqAn specific customisations in the standard namespace.
Additional non-standard concepts for ranges.
Adaptations of concepts from the standard library.
Auxiliary header for the views submodule .
Adaptations of concepts from the Ranges TS.
Provides std::span from the C++20 standard library.
View adaptor definition for views::take and views::take_or_throw.
Definition: take.hpp:469
constexpr auto operator()(size_t const size) const
Store the arguments and return a range adaptor closure object.
Definition: take.hpp:471
constexpr auto operator()(urng_t &&urange, size_t target_size) const
Type erase if possible and return view_take if not.
Definition: take.hpp:480
Provides C++20 additions to the type_traits header.