41 template <std::ranges::view underlying_range_type>
43 requires std::ranges::forward_range<underlying_range_type> && std::ranges::common_range<underlying_range_type>
50 template <
typename range_type>
94 if (std::ranges::empty(
u_range))
100 if constexpr (std::ranges::bidirectional_range<underlying_range_type>)
107 if constexpr (std::ranges::sized_range<underlying_range_type>)
117 }
while (++tmp_it != std::ranges::end(
u_range));
142 template <
typename other_range_t>
145 std::ranges::viewable_range<other_range_t> &&
146 std::constructible_from<underlying_range_type,
147 std::ranges::ref_view<std::remove_reference_t<other_range_t>>>
218 #if SEQAN3_WORKAROUND_GCC_NON_TEMPLATE_REQUIRES
219 template <
typename = underlying_range_type>
221 constexpr
auto size() const noexcept
223 requires
std::ranges::sized_range<underlying_range_type>
244 template <std::ranges::viewable_range other_range_t>
262 template <std::ranges::view underlying_range_type>
264 requires std::ranges::forward_range<underlying_range_type> && std::ranges::common_range<underlying_range_type>
266 template <
typename range_type>
273 template <
typename other_range_type>
327 second_it{std::ranges::next(iter, 1, end_it)},
340 template <
typename other_range_type>
342 requires std::convertible_to<other_range_type, range_type &> &&
346 basic_iterator{std::move(other.first_it), std::move(other.begin_it), std::move(other.end_it)}
364 noexcept(noexcept(std::declval<basic_iterator &>().from_index(1)))
369 return *(*
this + index);
380 if (++second_it == end_it)
383 second_it = first_it;
391 noexcept(noexcept(std::declval<underlying_iterator_type &>()++))
405 if (--second_it == first_it)
416 noexcept(noexcept(std::declval<underlying_iterator_type &>()--))
429 noexcept(noexcept(std::declval<basic_iterator &>().from_index(1)))
434 from_index(to_index() +
offset);
441 noexcept(noexcept(std::declval<basic_iterator &>() += 1))
458 iter.from_index(iter.to_index() +
offset);
465 noexcept(noexcept(std::declval<basic_iterator &>().from_index(1)))
470 from_index(to_index() -
offset);
477 noexcept(noexcept(std::declval<basic_iterator &>() -= 1))
488 template <
typename other_range_type>
490 requires std::random_access_iterator<underlying_iterator_type> &&
494 noexcept(noexcept(std::declval<basic_iterator &>().to_index()))
510 template <
typename other_range_type>
512 requires std::equality_comparable_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>> &&
516 noexcept(noexcept(std::declval<underlying_iterator_type &>() == std::declval<underlying_iterator_type &>()))
518 return std::tie(first_it, second_it) ==
std::tie(rhs.first_it, rhs.second_it);
522 template <
typename other_range_type>
524 requires std::equality_comparable_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>> &&
528 noexcept(noexcept(std::declval<underlying_iterator_type &>() != std::declval<underlying_iterator_type &>()))
530 return !(*
this == rhs);
534 template <
typename other_range_type>
536 requires std::totally_ordered_with<underlying_iterator_type,
537 std::ranges::iterator_t<other_range_type>> &&
541 noexcept(noexcept(std::declval<underlying_iterator_type &>() < std::declval<underlying_iterator_type &>()))
543 return std::tie(first_it, second_it) <
std::tie(rhs.first_it, rhs.second_it);
547 template <
typename other_range_type>
549 requires std::totally_ordered_with<underlying_iterator_type,
550 std::ranges::iterator_t<other_range_type>> &&
554 noexcept(noexcept(std::declval<underlying_iterator_type &>() > std::declval<underlying_iterator_type &>()))
557 return std::tie(first_it, second_it) >
std::tie(rhs.first_it, rhs.second_it);
561 template <
typename other_range_type>
563 requires std::totally_ordered_with<underlying_iterator_type,
564 std::ranges::iterator_t<other_range_type>> &&
568 noexcept(noexcept(std::declval<underlying_iterator_type &>() <= std::declval<underlying_iterator_type &>()))
570 return std::tie(first_it, second_it) <=
std::tie(rhs.first_it, rhs.second_it);
574 template <
typename other_range_type>
576 requires std::totally_ordered_with<underlying_iterator_type,
577 std::ranges::iterator_t<other_range_type>> &&
581 noexcept(noexcept(std::declval<underlying_iterator_type &>() >= std::declval<underlying_iterator_type &>()))
583 return std::tie(first_it, second_it) >=
std::tie(rhs.first_it, rhs.second_it);
607 size_t src_size = end_it - begin_it;
608 size_t index_i = first_it - begin_it;
609 size_t index_j = second_it - begin_it;
610 return (src_size * (src_size - 1)/2) - (src_size - index_i) * ((src_size - index_i) - 1)/2 +
611 index_j - index_i - 1;
619 noexcept(noexcept(std::declval<underlying_iterator_type &>() - std::declval<underlying_iterator_type &>()) &&
620 noexcept(std::declval<underlying_iterator_type &>() + 1))
625 size_t src_size = end_it - begin_it;
626 size_t index_i = src_size - 2 -
628 size_t index_j = index + index_i + 1 - src_size * (src_size - 1)/2 + (src_size - index_i) *
629 ((src_size - index_i) - 1)/2;
630 first_it = begin_it + index_i;
631 second_it = begin_it + index_j;
Provides seqan3::detail::adaptor_for_view_without_args.
Template for range adaptor closure objects that store no arguments and always delegate to the view co...
Definition: adaptor_for_view_without_args.hpp:49
The forward declared iterator type for pairwise_combine_view.
Definition: pairwise_combine.hpp:269
constexpr basic_iterator operator++(int) noexcept(noexcept(std::declval< underlying_iterator_type & >()++))
Post-increment operator.
Definition: pairwise_combine.hpp:390
constexpr basic_iterator & operator-=(difference_type const offset) noexcept(noexcept(std::declval< basic_iterator & >().from_index(1)))
Decrements the iterator by the given offset; underlying_iterator_type must model \ std::random_access...
Definition: pairwise_combine.hpp:464
constexpr reference operator*() const noexcept(noexcept(*std::declval< underlying_iterator_type >()))
Accesses the pointed-to element.
Definition: pairwise_combine.hpp:354
constexpr friend basic_iterator operator+(difference_type const offset, basic_iterator iter) noexcept(noexcept(std::declval< basic_iterator< range_type > & >().from_index(1)))
Advances the iterator by the given offset; underlying_iterator_type must model \ std::random_access_i...
Definition: pairwise_combine.hpp:452
basic_iterator(basic_iterator const &)=default
Defaulted.
constexpr basic_iterator(basic_iterator< other_range_type > other) noexcept
Constructs const iterator from non-const iterator.
Definition: pairwise_combine.hpp:345
basic_iterator & operator=(basic_iterator const &)=default
Defaulted.
basic_iterator & operator=(basic_iterator &&)=default
Defaulted.
constexpr basic_iterator operator--(int) noexcept(noexcept(std::declval< underlying_iterator_type & >() --))
Post-decrement operator; underlying_iterator_type must model std::bidirectional_iterator.
Definition: pairwise_combine.hpp:415
constexpr basic_iterator & operator++() noexcept(noexcept(++std::declval< underlying_iterator_type & >()))
Pre-increment operator.
Definition: pairwise_combine.hpp:377
basic_iterator()=default
Defaulted.
constexpr bool operator>(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >() > std::declval< underlying_iterator_type & >()))
Checks whether *this is greater than rhs.
Definition: pairwise_combine.hpp:553
constexpr bool operator>=(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >() >=std::declval< underlying_iterator_type & >()))
Checks whether *this is greater than or equal to rhs.
Definition: pairwise_combine.hpp:580
constexpr void from_index(size_t const index) noexcept(noexcept(std::declval< underlying_iterator_type & >() - std::declval< underlying_iterator_type & >()) &&noexcept(std::declval< underlying_iterator_type & >()+1))
Sets the iterator to the given index.
Definition: pairwise_combine.hpp:618
constexpr difference_type operator-(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< basic_iterator & >().to_index()))
Computes the distance between two iterators; underlying_iterator_type must model \ std::random_access...
Definition: pairwise_combine.hpp:493
constexpr bool operator!=(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >() !=std::declval< underlying_iterator_type & >()))
Checks whether *this is not equal to rhs.
Definition: pairwise_combine.hpp:527
constexpr bool operator==(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >()==std::declval< underlying_iterator_type & >()))
Checks whether *this is equal to rhs.
Definition: pairwise_combine.hpp:515
constexpr size_t to_index() const noexcept(noexcept(std::declval< underlying_iterator_type & >() - std::declval< underlying_iterator_type & >()))
Returns the index for the current iterator position.
Definition: pairwise_combine.hpp:601
common_tuple< underlying_ref_t, underlying_ref_t > reference
The reference type.
Definition: pairwise_combine.hpp:294
void pointer
The pointer type.
Definition: pairwise_combine.hpp:296
constexpr bool operator<=(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >()<=std::declval< underlying_iterator_type & >()))
Checks whether *this is less than or equal to rhs.
Definition: pairwise_combine.hpp:567
constexpr basic_iterator(underlying_iterator_type iter, underlying_iterator_type begin_it, underlying_iterator_type end_it) noexcept
Constructs the iterator from the current underlying iterator and the end iterator of the underlying r...
Definition: pairwise_combine.hpp:323
constexpr basic_iterator operator-(difference_type const offset) const noexcept(noexcept(std::declval< basic_iterator & >() -=1))
Decrements the iterator by the given offset; underlying_iterator_type must model \ std::random_access...
Definition: pairwise_combine.hpp:476
constexpr basic_iterator & operator--() noexcept(noexcept(--std::declval< underlying_iterator_type & >()))
Pre-decrement operator; underlying_iterator_type must model std::bidirectional_iterator.
Definition: pairwise_combine.hpp:399
std::ranges::iterator_t< range_type > underlying_iterator_type
Alias type for the iterator over the passed range type.
Definition: pairwise_combine.hpp:278
~basic_iterator()=default
Defaulted.
basic_iterator(basic_iterator &&)=default
Defaulted.
constexpr basic_iterator & operator+=(difference_type const offset) noexcept(noexcept(std::declval< basic_iterator & >().from_index(1)))
Advances the iterator by the given offset; underlying_iterator_type must model \ std::random_access_i...
Definition: pairwise_combine.hpp:428
constexpr reference operator[](size_t const index) const noexcept(noexcept(std::declval< basic_iterator & >().from_index(1)))
Access the element at the given index.
Definition: pairwise_combine.hpp:363
constexpr bool operator<(basic_iterator< other_range_type > const &rhs) const noexcept(noexcept(std::declval< underlying_iterator_type & >()< std::declval< underlying_iterator_type & >()))
Checks whether *this is less than rhs.
Definition: pairwise_combine.hpp:540
constexpr basic_iterator operator+(difference_type const offset) const noexcept(noexcept(std::declval< basic_iterator & >()+=1))
Advances the iterator by the given offset; underlying_iterator_type must model \ std::random_access_i...
Definition: pairwise_combine.hpp:440
Generates all pairwise combinations of the elements in the underlying range.
Definition: pairwise_combine.hpp:46
underlying_range_type u_range
The underling range.
Definition: pairwise_combine.hpp:234
pairwise_combine_view(pairwise_combine_view const &)=default
Defaulted.
constexpr const_iterator begin() const noexcept
Returns an iterator to the first element of the range.
Definition: pairwise_combine.hpp:178
pairwise_combine_view(pairwise_combine_view &&)=default
Defaulted.
constexpr pairwise_combine_view(underlying_range_type range)
Constructs from a view.
Definition: pairwise_combine.hpp:91
constexpr iterator begin() noexcept
Returns an iterator to the first element of the range.
Definition: pairwise_combine.hpp:172
constexpr pairwise_combine_view(other_range_t &&range)
Constructs from a view.
Definition: pairwise_combine.hpp:152
pairwise_combine_view()=default
Defaulted.
pairwise_combine_view & operator=(pairwise_combine_view &&)=default
Defaulted.
constexpr const_iterator end() const noexcept
Returns an iterator to the element following the last element of the range.
Definition: pairwise_combine.hpp:205
transformation_trait_or_t< std::type_identity< basic_iterator< underlying_range_type const > >, void > const_iterator
The const iterator type. Evaluates to void if the underlying range is not const iterable.
Definition: pairwise_combine.hpp:61
std::ranges::iterator_t< underlying_range_type > back_iterator
The cached iterator pointing to the last element of the underlying range.
Definition: pairwise_combine.hpp:236
~pairwise_combine_view()=default
Defaulted.
constexpr auto size() const noexcept
Computes the size based on the size of the underlying range.
Definition: pairwise_combine.hpp:221
constexpr iterator end() noexcept
Returns an iterator to the element following the last element of the range.
Definition: pairwise_combine.hpp:199
pairwise_combine_view & operator=(pairwise_combine_view const &)=default
Defaulted.
A generic random access iterator that delegates most operations to the range.
Definition: random_access_iterator.hpp:310
Provides seqan3::common_tuple and seqan3::common_pair.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
::ranges::common_tuple common_tuple
A common tuple type that behaves like a regular std::tuple, but can be used as a reference type proxy...
Definition: common_tuple.hpp:30
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
typename transformation_trait_or< type_t, default_t >::type transformation_trait_or_t
Helper type of seqan3::detail::transformation_trait_or (transformation_trait shortcut).
Definition: transformation_trait_or.hpp:51
constexpr auto pairwise_combine
A view adaptor that generates all pairwise combinations of the elements of the underlying range.
Definition: pairwise_combine.hpp:710
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
pairwise_combine_view(other_range_t &&range) -> pairwise_combine_view< std::views::all_t< other_range_t >>
Deduces the correct template type from a non-view lvalue range by wrapping the range in std::views::a...
The SeqAn namespace for views.
Definition: char_to.hpp:22
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.
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.