SeqAn3 3.2.0-rc.1
The Modern C++ library for sequence analysis.
chunk.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <seqan3/std/ranges>
16
24
25namespace seqan3::detail
26{
27// ---------------------------------------------------------------------------------------------------------------------
28// chunk_view class
29// ---------------------------------------------------------------------------------------------------------------------
30
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>>
42{
43private:
45 urng_t urange;
46
48 uint16_t chunk_size;
49
50 // The iterator type if `urng_t` is a pure input range. See class definition for details.
51 template <bool const_range>
53
54 // The iterator type if `urng_t` is at least a forward range. See class definition for details.
55 template <bool const_range>
56 class basic_iterator;
57
58public:
63 requires std::default_initializable<urng_t>
64 = default;
65 chunk_view(chunk_view const & rhs) = default;
66 chunk_view(chunk_view && rhs) = default;
67 chunk_view & operator=(chunk_view const & rhs) = default;
68 chunk_view & operator=(chunk_view && rhs) = default;
69 ~chunk_view() = default;
70
75 constexpr explicit chunk_view(urng_t underlying_range, uint16_t const size_of_chunk) :
76 urange{std::move(underlying_range)},
77 chunk_size{size_of_chunk}
78 {}
80
97 auto begin() noexcept
98 {
99 if constexpr (std::ranges::forward_range<urng_t>)
100 return basic_iterator<false>{std::ranges::begin(urange), std::ranges::end(urange), chunk_size};
101 else
102 return basic_input_iterator<false>{std::ranges::begin(urange), std::ranges::end(urange), chunk_size};
103 }
104
106 auto begin() const noexcept
107 requires const_iterable_range<urng_t>
108 {
109 if constexpr (std::ranges::forward_range<urng_t>)
110 return basic_iterator<true>{std::ranges::cbegin(urange), std::ranges::cend(urange), chunk_size};
111 else
112 return basic_input_iterator<true>{std::ranges::cbegin(urange), std::ranges::cend(urange), chunk_size};
113 }
114
130 auto end() noexcept
131 {
132 return std::ranges::end(urange);
133 }
134
136 auto end() const noexcept
137 requires const_iterable_range<urng_t>
138 {
139 return std::ranges::cend(urange);
140 }
142
146 auto size()
147 requires std::ranges::sized_range<urng_t>
148 {
149 using size_type = std::ranges::range_size_t<urng_t>;
150 return static_cast<size_type>((std::ranges::size(urange) + chunk_size - 1) / chunk_size); // round up
151 }
152
154 auto size() const
155 requires std::ranges::sized_range<urng_t const>
156 {
157 using size_type = std::ranges::range_size_t<urng_t const>;
158 return static_cast<size_type>((std::ranges::size(urange) + chunk_size - 1) / chunk_size); // round up
159 }
160};
161
163template <std::ranges::range rng_t>
165
166// ---------------------------------------------------------------------------------------------------------------------
167// chunk_view iterators (basic_input_iterator and basic_iterator)
168// ---------------------------------------------------------------------------------------------------------------------
169
187template <std::ranges::input_range urng_t>
188 requires std::ranges::view<urng_t>
189template <bool const_range>
191 public maybe_iterator_category<maybe_const_iterator_t<const_range, urng_t>>
192{
193private:
196
199
212 template <typename outer_it_type>
214 {
215 public:
219 constexpr input_helper_iterator() = default;
220 constexpr input_helper_iterator(input_helper_iterator const &) = default;
225
227 constexpr explicit input_helper_iterator(outer_it_type & outer_iterator, urng_it_t urng_it) :
228 urng_it_t(std::move(urng_it)),
229 outer_it(std::addressof(outer_iterator))
230 {}
231
233 constexpr explicit input_helper_iterator(urng_it_t urng_it) : urng_it_t(std::move(urng_it))
234 {}
236
239 {
240 --(outer_it->remaining);
241 urng_it_t::operator++();
242 return *this;
243 }
244
247 {
248 input_helper_iterator tmp{*this};
249 ++(*this);
250 return tmp;
251 }
252
254 bool operator==(sentinel_t const & /* rhs */) noexcept
255 {
256 return this->outer_it->remaining == 0u || this->outer_it->urng_begin == this->outer_it->urng_end;
257 }
258
260 outer_it_type * outer_it{nullptr};
261 };
262
265
266 // befriend the iterator on a const range
267 template <bool other_const_range>
268 friend class basic_input_iterator;
269
270 // befriend the inner iterator type
271 template <typename outer_it_type>
272 friend class input_helper_iterator;
273
274public:
281 using value_type = std::ranges::subrange<helper_it_t, sentinel_t>;
283 using pointer = void;
289
293 constexpr basic_input_iterator() = default;
294 constexpr basic_input_iterator(basic_input_iterator const &) = default;
296 constexpr basic_input_iterator & operator=(basic_input_iterator const &) = default;
299
302 requires const_range
303 :
304 chunk_size{std::move(it.chunk_size)},
305 remaining{std::move(it.remaining)},
306 urng_begin{std::move(it.urng_begin)},
307 urng_end{std::move(it.urng_end)},
308 current_chunk{std::move(it.current_chunk)}
309 {}
310
322 constexpr explicit basic_input_iterator(urng_it_t it_begin, sentinel_t it_end, uint16_t const size_of_chunk) :
323 chunk_size{size_of_chunk},
324 remaining{size_of_chunk},
325 urng_begin{std::move(it_begin)},
326 urng_end{std::move(it_end)}
327 {
328 current_chunk = std::ranges::subrange<helper_it_t, sentinel_t>{helper_it_t{*this, it_begin}, it_end};
329 }
331
335
337 friend constexpr bool operator==(basic_input_iterator const & lhs, sentinel_t const & rhs) noexcept
338 {
339 return lhs.urng_begin == rhs;
340 }
341
343 friend constexpr bool operator==(basic_input_iterator const & lhs, basic_input_iterator const & rhs) noexcept
344 {
345 return (lhs.urng_begin == rhs.urng_begin) && (lhs.remaining == rhs.remaining);
346 }
347
349 constexpr basic_input_iterator & operator++() noexcept
350 {
351 while (remaining > 0u && urng_begin != urng_end) // if chunk was not fully consumed and range is not at end
352 {
353 ++urng_begin;
354 --remaining;
355 }
356 current_chunk = std::ranges::subrange<helper_it_t, sentinel_t>{helper_it_t{*this, urng_begin}, urng_end};
357 remaining = chunk_size;
358 return *this;
359 }
360
362 constexpr basic_input_iterator operator++(int) noexcept
363 {
364 basic_input_iterator tmp{*this};
365 ++(*this);
366 return tmp;
367 }
368
370 constexpr value_type operator*() const noexcept
371 {
372 return current_chunk;
373 }
374
375private:
377 uint16_t chunk_size;
378
380 uint16_t remaining;
381
384
387
390};
391
408template <std::ranges::input_range urng_t>
409 requires std::ranges::view<urng_t>
410template <bool const_range>
411class chunk_view<urng_t>::basic_iterator : public maybe_iterator_category<maybe_const_iterator_t<const_range, urng_t>>
412{
413private:
418
419 // befriend the iterator on a const range
420 template <bool other_const_range>
421 friend class basic_iterator;
422
423public:
430 using value_type = std::ranges::subrange<it_t, it_t>;
432 using pointer = void;
440
444 constexpr basic_iterator() = default;
445 constexpr basic_iterator(basic_iterator const &) = default;
446 constexpr basic_iterator(basic_iterator &&) = default;
447 constexpr basic_iterator & operator=(basic_iterator const &) = default;
448 constexpr basic_iterator & operator=(basic_iterator &&) = default;
449 ~basic_iterator() = default;
450
452 constexpr basic_iterator(basic_iterator<!const_range> const & it) noexcept
453 requires const_range
454 :
455 chunk_size{std::move(it.chunk_size)},
456 urng_begin{std::move(it.urng_begin)},
457 urng_end{std::move(it.urng_end)},
458 current_chunk{std::move(it.current_chunk)}
459 {}
460
472 constexpr explicit basic_iterator(it_t it_start, sentinel_t it_end, uint16_t const size_of_chunk) :
473 chunk_size{size_of_chunk},
474 urng_begin{std::move(it_start)},
475 urng_end{std::move(it_end)}
476 {
477 current_chunk = value_type{it_start, get_next_end_of_chunk(it_start)};
478 }
480
484
486 friend constexpr bool operator==(basic_iterator const & lhs, sentinel_t const & rhs) noexcept
487 {
488 return lhs.current_chunk.begin() == rhs;
489 }
490
492 friend constexpr bool operator==(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
493 {
494 return (lhs.current_chunk.begin() == rhs.current_chunk.begin()) && (lhs.chunk_size == rhs.chunk_size);
495 }
496
498 friend constexpr bool operator!=(basic_iterator const & lhs, sentinel_t const & rhs) noexcept
499 {
500 return !(lhs == rhs);
501 }
502
504 friend constexpr bool operator!=(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
505 {
506 return !(lhs == rhs);
507 }
508
510 friend constexpr bool operator<(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
511 {
512 return lhs.current_chunk.begin() < rhs.current_chunk.begin();
513 }
514
516 friend constexpr bool operator>(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
517 {
518 return lhs.current_chunk.begin() > rhs.current_chunk.begin();
519 }
520
522 friend constexpr bool operator<=(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
523 {
524 return lhs.current_chunk.begin() <= rhs.current_chunk.begin();
525 }
526
528 friend constexpr bool operator>=(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
529 {
530 return lhs.current_chunk.begin() >= rhs.current_chunk.begin();
531 }
532
534
536 constexpr basic_iterator & operator++() noexcept
537 {
538 current_chunk = value_type{current_chunk.end(), get_next_end_of_chunk(current_chunk.end())};
539 return *this;
540 }
541
544 {
545 basic_iterator tmp{*this};
546 ++(*this);
547 return tmp;
548 }
549
553 constexpr basic_iterator & operator--() noexcept
554 requires std::bidirectional_iterator<it_t>
555 {
556 current_chunk = value_type{get_former_start_of_chunk(current_chunk.begin()), current_chunk.begin()};
557 return *this;
558 }
559
563 constexpr basic_iterator operator--(int) noexcept
564 requires std::bidirectional_iterator<it_t>
565 {
566 basic_iterator tmp{*this};
567 --(*this);
568 return tmp;
569 }
570
574 constexpr basic_iterator & operator+=(difference_type const skip) noexcept
575 requires std::random_access_iterator<it_t>
576 {
577 auto new_start_it = current_chunk.begin() + (chunk_size * skip);
578 current_chunk = value_type{new_start_it, get_next_end_of_chunk(new_start_it)};
579 return *this;
580 }
581
585 constexpr basic_iterator operator+(difference_type const skip) const noexcept
586 requires std::random_access_iterator<it_t>
587 {
588 basic_iterator tmp{*this};
589 return tmp += skip;
590 }
591
595 friend constexpr basic_iterator operator+(difference_type const skip, basic_iterator const & it) noexcept
596 requires std::random_access_iterator<it_t>
597 {
598 return it + skip;
599 }
600
604 constexpr basic_iterator & operator-=(difference_type const skip) noexcept
605 requires std::random_access_iterator<it_t>
606 {
607 auto new_start_it = current_chunk.begin() - (chunk_size * skip);
608 current_chunk = value_type{new_start_it, get_next_end_of_chunk(new_start_it)};
609 return *this;
610 }
611
616 constexpr basic_iterator operator-(difference_type const skip) const noexcept
617 requires std::random_access_iterator<it_t>
618 {
619 basic_iterator tmp{*this};
620 return tmp -= skip;
621 }
622
626 friend constexpr basic_iterator operator-(difference_type const skip, basic_iterator const & it) noexcept
627 requires std::random_access_iterator<it_t>
628 {
629 return it - skip;
630 }
631
636 friend constexpr difference_type operator-(basic_iterator const & lhs, basic_iterator const & rhs) noexcept
637 requires std::sized_sentinel_for<it_t, it_t>
638 {
639 return static_cast<difference_type>((lhs.current_chunk.begin() - rhs.current_chunk.begin()) / lhs.chunk_size);
640 }
641
645 friend constexpr difference_type operator-(sentinel_t const & /* lhs */, basic_iterator const & rhs) noexcept
646 requires std::sized_sentinel_for<sentinel_t, it_t>
647 {
648 return static_cast<difference_type>((rhs.urng_end - rhs.current_chunk.begin() + rhs.chunk_size - 1)
649 / rhs.chunk_size);
650 }
651
655 friend constexpr difference_type operator-(basic_iterator const & lhs, sentinel_t const & rhs) noexcept
656 requires std::sized_sentinel_for<sentinel_t, it_t>
657 {
658 return -(rhs - lhs);
659 }
660
664 constexpr reference operator[](difference_type const n) const
665 requires std::random_access_iterator<it_t>
666 {
667 return *(*this + n);
668 }
669
671 constexpr value_type operator*() const noexcept
672 {
673 return current_chunk;
674 }
675
676private:
678 uint16_t chunk_size;
679
682
685
688
690 constexpr it_t get_next_end_of_chunk(it_t start_of_chunk) const
691 {
692 // Very similar to `return std::ranges::next(start_of_chunk, chunk_size, urng_end);`.
693 // However, the STL checks that the direction of chunk_size and urng_end are the same for sized_sentinels when
694 // -D_GLIBCXX_ASSERTIONS is enabled.
695 // If start_of_chunk was moved past urng_end, we should constrain it.
696 // =========X===========Y============
697 // ^ ^
698 // urng_end new_start_it
699 // <----------- // direction from iterator to bound
700 // ---------> // direction from chunk_size
701 // See https://eel.is/c++draft/range.iter.op.advance (next just takes and returns a copy of the iterator)
702 // Note: n is chunk_size and always positive.
703 if constexpr (std::sized_sentinel_for<sentinel_t, it_t>) // We can check whether we can jump.
704 {
705 if (chunk_size >= std::abs(urng_end - start_of_chunk)) // Remaining range smaller than chunk_size
706 return std::ranges::next(start_of_chunk, urng_end); // Returns it_t which is equal to urng_end
707 else // We can jump chunk_size many times
708 return std::ranges::next(start_of_chunk, chunk_size);
709 }
710 else // We need to increment one by one to not cross urng_end.
711 {
712 for (uint16_t increments{}; increments != chunk_size && start_of_chunk != urng_end; ++increments)
713 ++start_of_chunk;
714
715 return start_of_chunk;
716 }
717 }
718
720 constexpr it_t get_former_start_of_chunk(it_t end_of_chunk) const
721 {
722 // Very similar to `return std::ranges::prev(end_of_chunk, chunk_size, urng_begin);`.
723 // However, the STL checks that the direction of chunk_size and urng_end are the same for sized_sentinels when
724 // -D_GLIBCXX_ASSERTIONS is enabled.
725 // If end_of_chunk was moved before urng_begin, we should constrain it.
726 // =========X===========Y============
727 // ^ ^
728 // end_of_chunk urng_begin
729 // <--------- // direction from chunk_size
730 // ---------> // direction from iterator to bound
731 // See https://eel.is/c++draft/range.iter.op.advance (prev(i, n, bound) is equal to advance(i, -n, bound))
732 // Note: n is chunk_size and always positive.
733 if constexpr (std::sized_sentinel_for<sentinel_t, it_t>) // We can check whether we can jump.
734 {
735 if (chunk_size >= std::abs(urng_begin - end_of_chunk)) // Remaining range smaller than chunk_size
736 return urng_begin;
737 else // We can jump chunk_size many times
738 return std::ranges::prev(end_of_chunk, chunk_size);
739 }
740 else // We need to decrement one by one to not cross urng_begin.
741 {
742 for (uint16_t decrements{}; decrements != chunk_size && end_of_chunk != urng_begin; ++decrements)
743 --end_of_chunk;
744
745 return end_of_chunk;
746 }
747 }
748};
749
750// ---------------------------------------------------------------------------------------------------------------------
751// chunk_fn (adaptor definition)
752// ---------------------------------------------------------------------------------------------------------------------
753
757{
759 constexpr auto operator()(uint16_t const chunk_size) const
760 {
761 return adaptor_from_functor{*this, chunk_size};
762 }
763
769 template <std::ranges::range underlying_range_t>
770 constexpr auto operator()(underlying_range_t && urange, uint16_t const chunk_size) const
771 {
772 static_assert(std::ranges::input_range<underlying_range_t>,
773 "The range parameter to views::chunk must model std::ranges::input_range.");
774
775 return chunk_view{std::forward<underlying_range_t>(urange), chunk_size};
776 }
777};
778
779} // namespace seqan3::detail
780
781namespace seqan3::views
782{
823inline constexpr auto chunk = detail::chunk_fn{};
824
825} // namespace seqan3::views
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
Helper iterator class to be used as iterator type in the subrange of this iterators value_type.
Definition: chunk.hpp:214
constexpr input_helper_iterator(outer_it_type &outer_iterator, urng_it_t urng_it)
Construct from the outer iterator and the underlying range iterator.
Definition: chunk.hpp:227
input_helper_iterator & operator++() noexcept
Pre-increment will decrease the member variable basic_input_iterator::remaining.
Definition: chunk.hpp:238
constexpr input_helper_iterator(input_helper_iterator const &)=default
Defaulted.
constexpr input_helper_iterator & operator=(input_helper_iterator &&)=default
Defaulted.
input_helper_iterator operator++(int) noexcept
Post-increment will decrease the member variable basic_input_iterator::remaining.
Definition: chunk.hpp:246
constexpr input_helper_iterator & operator=(input_helper_iterator const &)=default
Defaulted.
constexpr input_helper_iterator(urng_it_t urng_it)
Construct from the underlying range iterator.
Definition: chunk.hpp:233
constexpr input_helper_iterator(input_helper_iterator &&)=default
Defaulted.
bool operator==(sentinel_t const &) noexcept
Compare to the sentinel type (same as sentinel type of the underlying range).
Definition: chunk.hpp:254
Iterator for dividing an input range into chunks.
Definition: chunk.hpp:192
constexpr basic_input_iterator & operator=(basic_input_iterator &&)=default
Defaulted.
constexpr basic_input_iterator()=default
Defaulted.
urng_it_t urng_begin
Points to the start of the underlying range.
Definition: chunk.hpp:383
uint16_t chunk_size
The chunk size, e.g., the length of the subrange returned by this iterator.
Definition: chunk.hpp:377
constexpr basic_input_iterator & operator=(basic_input_iterator const &)=default
Defaulted.
friend constexpr bool operator==(basic_input_iterator const &lhs, basic_input_iterator const &rhs) noexcept
Compare to another basic_input_iterator.
Definition: chunk.hpp:343
value_type reference
Same as value_type.
Definition: chunk.hpp:285
maybe_const_sentinel_t< const_range, urng_t > sentinel_t
The sentinel type of the underlying range which is also the sentinel type of this iterator.
Definition: chunk.hpp:198
value_type current_chunk
The current chunk stored as a subrange.
Definition: chunk.hpp:389
constexpr basic_input_iterator & operator++() noexcept
Pre-increment.
Definition: chunk.hpp:349
maybe_const_iterator_t< const_range, urng_t > urng_it_t
The iterator type of the underlying range.
Definition: chunk.hpp:195
constexpr basic_input_iterator(urng_it_t it_begin, sentinel_t it_end, uint16_t const size_of_chunk)
Construct from the start and end of the underlying range and a chunk size. /param[in] it_begin Iterat...
Definition: chunk.hpp:322
constexpr basic_input_iterator(basic_input_iterator &&)=default
Defaulted.
uint16_t remaining
The remaining elements in the chunk.
Definition: chunk.hpp:380
constexpr basic_input_iterator operator++(int) noexcept
Post-increment.
Definition: chunk.hpp:362
friend constexpr bool operator==(basic_input_iterator const &lhs, sentinel_t const &rhs) noexcept
Compare to the sentinel type (same as sentinel type of the underlying range).
Definition: chunk.hpp:337
constexpr basic_input_iterator(basic_input_iterator const &)=default
Defaulted.
constexpr basic_input_iterator(basic_input_iterator<!const_range > it) noexcept
Allow iterator on a const range to be constructible from an iterator over a non-const range.
Definition: chunk.hpp:301
constexpr value_type operator*() const noexcept
Return the current chunk.
Definition: chunk.hpp:370
typename std::iter_difference_t< urng_it_t > difference_type
Type for distances between iterators.
Definition: chunk.hpp:279
std::ranges::subrange< helper_it_t, sentinel_t > value_type
Value type of this iterator.
Definition: chunk.hpp:281
void pointer
The pointer type.
Definition: chunk.hpp:283
sentinel_t urng_end
Points to the end of the underlying range.
Definition: chunk.hpp:386
Iterator for dividing an forward range into chunks.
Definition: chunk.hpp:412
constexpr basic_iterator operator+(difference_type const skip) const noexcept
Forward copy of this iterator.
Definition: chunk.hpp:585
friend constexpr bool operator==(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:492
std::ranges::subrange< it_t, it_t > value_type
Value type of this iterator.
Definition: chunk.hpp:430
uint16_t chunk_size
The chunk size, e.g. the length of the subrange returned by this iterator.
Definition: chunk.hpp:678
friend constexpr bool operator<=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:522
maybe_const_iterator_t< const_range, urng_t > it_t
The iterator type of the underlying range.
Definition: chunk.hpp:415
basic_iterator operator++(int) noexcept
Post-increment.
Definition: chunk.hpp:543
friend constexpr bool operator>=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:528
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:626
constexpr basic_iterator & operator--() noexcept
Pre-decrement.
Definition: chunk.hpp:553
friend constexpr bool operator==(basic_iterator const &lhs, sentinel_t const &rhs) noexcept
Compare to end of underlying range.
Definition: chunk.hpp:486
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:595
constexpr value_type operator*() const noexcept
Return the current chunk, e.g the current subrange.
Definition: chunk.hpp:671
maybe_const_sentinel_t< const_range, urng_t > sentinel_t
The sentinel type of the underlying range.
Definition: chunk.hpp:417
constexpr basic_iterator & operator++() noexcept
Pre-increment.
Definition: chunk.hpp:536
value_type reference
Same as value_type.
Definition: chunk.hpp:434
constexpr basic_iterator(it_t it_start, sentinel_t it_end, uint16_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:472
friend constexpr difference_type operator-(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Return offset between two iterator's positions.
Definition: chunk.hpp:636
sentinel_t urng_end
Points to the end of the underlying range.
Definition: chunk.hpp:684
friend constexpr bool operator<(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:510
constexpr reference operator[](difference_type const n) const
Move the iterator by a given offset and return the corresponding chunk (subrange).
Definition: chunk.hpp:664
typename std::iter_difference_t< it_t > difference_type
Type for distances between iterators.
Definition: chunk.hpp:428
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:720
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:645
void pointer
The pointer type.
Definition: chunk.hpp:432
constexpr basic_iterator()=default
Defaulted.
constexpr basic_iterator & operator+=(difference_type const skip) noexcept
Forward this iterator.
Definition: chunk.hpp:574
friend constexpr bool operator!=(basic_iterator const &lhs, basic_iterator const &rhs) noexcept
Compare to another basic_iterator.
Definition: chunk.hpp:504
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:516
it_t urng_begin
Points to the start of the underlying range.
Definition: chunk.hpp:681
constexpr basic_iterator & operator=(basic_iterator &&)=default
Defaulted.
value_type current_chunk
The current chunk stored as a subrange.
Definition: chunk.hpp:687
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:452
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:604
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:655
constexpr basic_iterator operator-(difference_type const skip) const noexcept
Return decremented copy of this iterator.
Definition: chunk.hpp:616
friend constexpr bool operator!=(basic_iterator const &lhs, sentinel_t const &rhs) noexcept
Compare to underlying range sentinel type.
Definition: chunk.hpp:498
constexpr basic_iterator operator--(int) noexcept
Post-decrement.
Definition: chunk.hpp:563
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:690
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
uint16_t chunk_size
The chunk size to use.
Definition: chunk.hpp:48
auto begin() const noexcept
Returns an iterator to the first element of the range.
Definition: chunk.hpp:106
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: 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: type_traits.hpp:44
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:146
constexpr auto chunk
Divide a range in chunks.
Definition: chunk.hpp:823
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
chunk_view(rng_t &&, uint16_t const &) -> chunk_view< seqan3::detail::all_t< rng_t > >
A deduction guide for the view class template.
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
SeqAn specific customisations in the standard namespace.
Provides platform and dependency checks.
The <ranges> header from C++20's standard library.
views::chunk's range adaptor object type (non-closure).
Definition: chunk.hpp:757
constexpr auto operator()(underlying_range_t &&urange, uint16_t const chunk_size) const
Call the view's constructor with the underlying range and a chunk_size as argument.
Definition: chunk.hpp:770
constexpr auto operator()(uint16_t const chunk_size) const
Store the chunk_size and return a range adaptor closure object.
Definition: chunk.hpp:759
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.