39template <std::ranges::input_range urng_t>
40 requires std::ranges::view<urng_t>
41class chunk_view :
public std::ranges::view_interface<chunk_view<urng_t>>
51 template <
bool const_range>
55 template <
bool const_range>
63 requires std::default_initializable<urng_t>
75 constexpr explicit
chunk_view(urng_t urng,
std::ranges::range_difference_t<urng_t> const size_of_chunk) :
99 if constexpr (std::ranges::forward_range<urng_t>)
109 if constexpr (std::ranges::forward_range<urng_t>)
132 return std::ranges::end(
urange);
139 return std::ranges::cend(
urange);
147 requires std::ranges::sized_range<urng_t>
149 using size_type = std::ranges::range_size_t<urng_t>;
155 requires
std::ranges::sized_range<urng_t const>
157 using size_type = std::ranges::range_size_t<urng_t const>;
163template <std::ranges::range rng_t>
187template <std::ranges::input_range urng_t>
188 requires std::ranges::view<urng_t>
189template <
bool const_range>
212 template <
typename outer_it_type>
229 outer_it(
std::addressof(outer_iterator))
240 --(outer_it->remaining);
241 urng_it_t::operator++();
254#if SEQAN3_COMPILER_IS_GCC && (__GNUC__ > 12)
258 return lhs.
outer_it->remaining == 0u || lhs.outer_it->urng_begin == lhs.outer_it->urng_end;
264 return this->outer_it->remaining == 0u || this->outer_it->urng_begin == this->outer_it->urng_end;
269 outer_it_type * outer_it{
nullptr};
276 template <
bool other_const_range>
280 template <
typename outer_it_type>
290 using value_type = std::ranges::subrange<helper_it_t, sentinel_t>;
314 remaining{std::move(it.remaining)},
315 urng_begin{std::move(it.urng_begin)},
316 urng_end{std::move(it.urng_end)},
317 current_chunk{std::move(it.current_chunk)}
333 std::ranges::range_difference_t<urng_t>
const size_of_chunk) :
335 remaining{size_of_chunk},
336 urng_begin{
std::move(it_begin)},
337 urng_end{
std::move(it_end)}
339 current_chunk = std::ranges::subrange<helper_it_t, sentinel_t>{
helper_it_t{*
this, it_begin}, it_end};
350 return lhs.urng_begin == rhs;
356 return (lhs.urng_begin == rhs.urng_begin) && (lhs.remaining == rhs.remaining);
362 while (remaining > 0u && urng_begin != urng_end)
367 current_chunk = std::ranges::subrange<helper_it_t, sentinel_t>{
helper_it_t{*
this, urng_begin}, urng_end};
383 return current_chunk;
419template <std::ranges::input_range urng_t>
420 requires std::ranges::view<urng_t>
421template <
bool const_range>
431 template <
bool other_const_range>
467 urng_begin{std::move(it.urng_begin)},
468 urng_end{std::move(it.urng_end)},
469 current_chunk{std::move(it.current_chunk)}
485 std::ranges::range_difference_t<urng_t>
const size_of_chunk) :
487 urng_begin{
std::move(it_start)},
488 urng_end{
std::move(it_end)}
490 current_chunk =
value_type{it_start, get_next_end_of_chunk(it_start)};
501 return lhs.current_chunk.begin() == rhs;
507 return (lhs.current_chunk.begin() == rhs.current_chunk.begin()) && (lhs.chunk_size == rhs.chunk_size);
513 return !(lhs == rhs);
519 return !(lhs == rhs);
525 return lhs.current_chunk.begin() < rhs.current_chunk.begin();
531 return lhs.current_chunk.begin() > rhs.current_chunk.begin();
537 return lhs.current_chunk.begin() <= rhs.current_chunk.begin();
543 return lhs.current_chunk.begin() >= rhs.current_chunk.begin();
551 current_chunk =
value_type{current_chunk.end(), get_next_end_of_chunk(current_chunk.end())};
567 requires
std::bidirectional_iterator<
it_t>
569 current_chunk =
value_type{get_former_start_of_chunk(current_chunk.begin()), current_chunk.begin()};
577 requires std::bidirectional_iterator<it_t>
588 requires std::random_access_iterator<it_t>
590 auto new_start_it = current_chunk.begin() + (
chunk_size * skip);
591 current_chunk =
value_type{new_start_it, get_next_end_of_chunk(new_start_it)};
599 requires std::random_access_iterator<it_t>
609 requires std::random_access_iterator<it_t>
618 requires std::random_access_iterator<it_t>
620 auto new_start_it = current_chunk.begin() - (
chunk_size * skip);
621 current_chunk =
value_type{new_start_it, get_next_end_of_chunk(new_start_it)};
630 requires std::random_access_iterator<it_t>
640 requires std::random_access_iterator<it_t>
650 requires std::sized_sentinel_for<it_t, it_t>
652 return static_cast<difference_type>((lhs.current_chunk.begin() - rhs.current_chunk.begin()) / lhs.chunk_size);
659 requires std::sized_sentinel_for<sentinel_t, it_t>
661 return static_cast<difference_type>((rhs.urng_end - rhs.current_chunk.begin() + rhs.chunk_size - 1)
669 requires std::sized_sentinel_for<sentinel_t, it_t>
678 requires std::random_access_iterator<it_t>
686 return current_chunk;
716 if constexpr (std::sized_sentinel_for<sentinel_t, it_t>)
718 if (
chunk_size >= std::abs(urng_end - start_of_chunk))
719 return std::ranges::next(start_of_chunk, urng_end);
721 return std::ranges::next(start_of_chunk,
chunk_size);
725 for (std::ranges::range_difference_t<urng_t> increments{};
726 increments !=
chunk_size && start_of_chunk != urng_end;
732 return start_of_chunk;
750 if constexpr (std::sized_sentinel_for<sentinel_t, it_t>)
752 if (
chunk_size >= std::abs(urng_begin - end_of_chunk))
755 return std::ranges::prev(end_of_chunk,
chunk_size);
759 for (std::ranges::range_difference_t<urng_t> decrements{};
760 decrements !=
chunk_size && end_of_chunk != urng_begin;
790 template <std::ranges::range urng_t>
791 constexpr auto operator()(urng_t && urange, std::ranges::range_difference_t<urng_t>
const chunk_size)
const
793 static_assert(std::ranges::input_range<urng_t>,
794 "The range parameter to views::chunk must model std::ranges::input_range.");
796 return chunk_view{std::forward<urng_t>(urange), chunk_size};
Provides seqan3::detail::adaptor_from_functor.
Provides seqan3::detail::all.
Core alphabet concept and free function/type trait wrappers.
Template for range adaptor closure objects that store arguments and wrap a proto-adaptor.
Definition: adaptor_from_functor.hpp:57
Iterator for dividing an forward range into chunks.
Definition: chunk.hpp:423
constexpr basic_iterator operator+(difference_type const skip) const noexcept
Forward copy of this iterator.
Definition: chunk.hpp:598
friend constexpr bool operator==(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:505
std::ranges::subrange< it_t, it_t > value_type
Value type of this iterator.
Definition: chunk.hpp:441
friend constexpr bool operator<=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:535
maybe_const_iterator_t< const_range, urng_t > it_t
The iterator type of the underlying range.
Definition: chunk.hpp:426
basic_iterator operator++(int) noexcept
Post-increment.
Definition: chunk.hpp:556
friend constexpr bool operator>=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:541
friend constexpr basic_iterator operator-(difference_type const skip, basic_iterator const &it) noexcept
Non-member operator- delegates to non-friend operator-.
Definition: chunk.hpp:639
constexpr basic_iterator(it_t it_start, sentinel_t it_end, std::ranges::range_difference_t< urng_t > const size_of_chunk)
Construct from the start and end of the underlying range and a chunk size. /param[in] it_start Iterat...
Definition: chunk.hpp:483
constexpr basic_iterator & operator--() noexcept
Pre-decrement.
Definition: chunk.hpp:566
friend constexpr bool operator==(basic_iterator const &lhs, sentinel_t const &rhs) noexcept
Compare to end of underlying range.
Definition: chunk.hpp:499
friend constexpr basic_iterator operator+(difference_type const skip, basic_iterator const &it) noexcept
Non-member operator+ delegates to non-friend operator+.
Definition: chunk.hpp:608
constexpr value_type operator*() const noexcept
Return the current chunk, e.g the current subrange.
Definition: chunk.hpp:684
maybe_const_sentinel_t< const_range, urng_t > sentinel_t
The sentinel type of the underlying range.
Definition: chunk.hpp:428
std::ranges::range_difference_t< urng_t > chunk_size
The chunk size, e.g. the length of the subrange returned by this iterator.
Definition: chunk.hpp:691
constexpr basic_iterator & operator++() noexcept
Pre-increment.
Definition: chunk.hpp:549
value_type reference
Same as value_type.
Definition: chunk.hpp:445
friend constexpr difference_type operator-(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Return offset between two iterator's positions.
Definition: chunk.hpp:649
sentinel_t urng_end
Points to the end of the underlying range.
Definition: chunk.hpp:697
friend constexpr bool operator<(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:523
constexpr reference operator[](difference_type const n) const
Move the iterator by a given offset and return the corresponding chunk (subrange).
Definition: chunk.hpp:677
typename std::iter_difference_t< it_t > difference_type
Type for distances between iterators.
Definition: chunk.hpp:439
constexpr it_t get_former_start_of_chunk(it_t end_of_chunk) const
Move to the start of the former chunk.
Definition: chunk.hpp:737
friend constexpr difference_type operator-(sentinel_t const &, basic_iterator const &rhs) noexcept
Return offset between remote sentinel's position and this.
Definition: chunk.hpp:658
~basic_iterator()=default
Defaulted.
void pointer
The pointer type.
Definition: chunk.hpp:443
constexpr basic_iterator()=default
Defaulted.
constexpr basic_iterator & operator+=(difference_type const skip) noexcept
Forward this iterator.
Definition: chunk.hpp:587
friend constexpr bool operator!=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:517
constexpr basic_iterator(basic_iterator &&)=default
Defaulted.
friend constexpr bool operator>(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:529
it_t urng_begin
Points to the start of the underlying range.
Definition: chunk.hpp:694
constexpr basic_iterator & operator=(basic_iterator &&)=default
Defaulted.
value_type current_chunk
The current chunk stored as a subrange.
Definition: chunk.hpp:700
constexpr basic_iterator(basic_iterator<!const_range > const &it) noexcept
Allow iterator on a const range to be constructible from an iterator over a non-const range.
Definition: chunk.hpp:463
constexpr basic_iterator & operator=(basic_iterator const &)=default
Defaulted.
constexpr basic_iterator & operator-=(difference_type const skip) noexcept
Decrement iterator by skip.
Definition: chunk.hpp:617
constexpr basic_iterator(basic_iterator const &)=default
Defaulted.
friend constexpr difference_type operator-(basic_iterator const &lhs, sentinel_t const &rhs) noexcept
Return offset this and remote sentinel's position.
Definition: chunk.hpp:668
constexpr basic_iterator operator-(difference_type const skip) const noexcept
Return decremented copy of this iterator.
Definition: chunk.hpp:629
friend constexpr bool operator!=(basic_iterator const &lhs, sentinel_t const &rhs) noexcept
Compare to underlying range sentinel type.
Definition: chunk.hpp:511
constexpr basic_iterator operator--(int) noexcept
Post-decrement.
Definition: chunk.hpp:576
constexpr it_t get_next_end_of_chunk(it_t start_of_chunk) const
Move to the end of the next chunk.
Definition: chunk.hpp:703
The type returned by seqan3::views::chunk.
Definition: chunk.hpp:42
chunk_view()=default
Defaulted.
auto end() const noexcept
Returns an iterator to the element following the last element of the range.
Definition: chunk.hpp:136
auto size() const
Returns the size of the range, iff the underlying range is a std::ranges::sized_range.
Definition: chunk.hpp:154
auto begin() noexcept
Returns an iterator to the first element of the range.
Definition: chunk.hpp:97
urng_t urange
The underlying range.
Definition: chunk.hpp:45
auto end() noexcept
Returns an iterator to the element following the last element of the range.
Definition: chunk.hpp:130
auto begin() const noexcept
Returns an iterator to the first element of the range.
Definition: chunk.hpp:106
std::ranges::range_difference_t< urng_t > chunk_size
The chunk size to use.
Definition: chunk.hpp:48
auto size()
Returns the size of the range, iff the underlying range is a std::ranges::sized_range.
Definition: chunk.hpp:146
Provides various transformation traits used by the range module.
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: core/range/type_traits.hpp:49
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: core/range/type_traits.hpp:44
constexpr auto chunk
Divide a range in chunks.
Definition: chunk.hpp:844
Specifies requirements of an input range type for which the const version of that type satisfies the ...
Provides various transformation traits for use on iterators.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
SeqAn specific customisations in the standard namespace.
views::chunk's range adaptor object type (non-closure).
Definition: chunk.hpp:778
constexpr auto operator()(std::ptrdiff_t const chunk_size) const
Store the chunk_size and return a range adaptor closure object.
Definition: chunk.hpp:780
constexpr auto operator()(urng_t &&urange, std::ranges::range_difference_t< urng_t > const chunk_size) const
Call the view's constructor with the underlying range and a chunk_size as argument.
Definition: chunk.hpp:791
Defines iterator_category member if underlying_iterator_t has a valid std::iterator_traits::iterator_...
Definition: iterator_traits.hpp:42
Additional non-standard concepts for ranges.