38template <std::ranges::view underlying_range_type>
39 requires std::ranges::forward_range<underlying_range_type> && std::ranges::common_range<underlying_range_type>
44 template <
typename range_type>
88 if (std::ranges::empty(
u_range))
94 if constexpr (std::ranges::bidirectional_range<underlying_range_type>)
101 if constexpr (std::ranges::sized_range<underlying_range_type>)
112 while (++tmp_it != std::ranges::end(
u_range));
137 template <
typename other_range_t>
139 && std::ranges::viewable_range<other_range_t>
141 std::constructible_from<underlying_range_type,
208 constexpr auto size() const noexcept
209 requires
std::ranges::sized_range<underlying_range_type>
228template <std::ranges::viewable_range other_range_t>
245template <std::ranges::view underlying_range_type>
246 requires std::ranges::forward_range<underlying_range_type> && std::ranges::common_range<underlying_range_type>
247template <
typename range_type>
253 template <
typename other_range_type>
306 second_it{std::ranges::next(iter, 1, end_it)},
319 template <
typename other_range_type>
320 requires std::convertible_to<other_range_type, range_type &>
323 basic_iterator{std::move(other.first_it), std::move(other.begin_it), std::move(other.end_it)}
340 noexcept(
noexcept(std::declval<basic_iterator &>().from_index(1)))
341 requires std::random_access_iterator<underlying_iterator_type>
343 return *(*
this + index);
354 if (++second_it == end_it)
357 second_it = first_it;
365 noexcept(
noexcept(std::declval<underlying_iterator_type &>()++))
377 if (--second_it == first_it)
388 noexcept(
noexcept(std::declval<underlying_iterator_type &>()--))
389 requires std::bidirectional_iterator<underlying_iterator_type>
399 noexcept(
noexcept(std::declval<basic_iterator &>().from_index(1)))
400 requires std::random_access_iterator<underlying_iterator_type>
402 from_index(to_index() +
offset);
409 noexcept(
noexcept(std::declval<basic_iterator &>() += 1))
410 requires std::random_access_iterator<underlying_iterator_type>
419 noexcept(
noexcept(std::declval<basic_iterator<range_type> &>().from_index(1)))
420 requires std::random_access_iterator<underlying_iterator_type>
429 noexcept(
noexcept(std::declval<basic_iterator &>().from_index(1)))
430 requires std::random_access_iterator<underlying_iterator_type>
432 from_index(to_index() -
offset);
439 noexcept(
noexcept(std::declval<basic_iterator &>() -= 1))
440 requires std::random_access_iterator<underlying_iterator_type>
448 template <
typename other_range_type>
449 requires std::random_access_iterator<underlying_iterator_type>
452 noexcept(
noexcept(std::declval<basic_iterator &>().to_index()))
468 template <
typename other_range_type>
469 requires std::equality_comparable_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
472 noexcept(
noexcept(std::declval<underlying_iterator_type &>() == std::declval<underlying_iterator_type &>()))
474 return std::tie(first_it, second_it) ==
std::tie(rhs.first_it, rhs.second_it);
478 template <
typename other_range_type>
479 requires std::equality_comparable_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
482 noexcept(
noexcept(std::declval<underlying_iterator_type &>() != std::declval<underlying_iterator_type &>()))
484 return !(*
this == rhs);
488 template <
typename other_range_type>
489 requires std::totally_ordered_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
492 noexcept(
noexcept(std::declval<underlying_iterator_type &>() < std::declval<underlying_iterator_type &>()))
494 return std::tie(first_it, second_it) <
std::tie(rhs.first_it, rhs.second_it);
498 template <
typename other_range_type>
499 requires std::totally_ordered_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
502 noexcept(
noexcept(std::declval<underlying_iterator_type &>() > std::declval<underlying_iterator_type &>()))
505 return std::tie(first_it, second_it) >
std::tie(rhs.first_it, rhs.second_it);
509 template <
typename other_range_type>
510 requires std::totally_ordered_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
513 noexcept(
noexcept(std::declval<underlying_iterator_type &>() <= std::declval<underlying_iterator_type &>()))
515 return std::tie(first_it, second_it) <=
std::tie(rhs.first_it, rhs.second_it);
519 template <
typename other_range_type>
520 requires std::totally_ordered_with<underlying_iterator_type, std::ranges::iterator_t<other_range_type>>
523 noexcept(
noexcept(std::declval<underlying_iterator_type &>() >= std::declval<underlying_iterator_type &>()))
525 return std::tie(first_it, second_it) >=
std::tie(rhs.first_it, rhs.second_it);
546 size_t src_size = end_it - begin_it;
547 size_t index_i = first_it - begin_it;
548 size_t index_j = second_it - begin_it;
549 return (src_size * (src_size - 1) / 2) - (src_size - index_i) * ((src_size - index_i) - 1) / 2 + index_j
558 noexcept(
noexcept(std::declval<underlying_iterator_type &>() - std::declval<underlying_iterator_type &>())
559 &&
noexcept(std::declval<underlying_iterator_type &>() + 1))
560 requires std::random_access_iterator<underlying_iterator_type>
562 size_t src_size = end_it - begin_it;
564 src_size - 2 -
std::floor(
std::sqrt(-8 * index + 4 * src_size * (src_size - 1) - 7) / 2.0 - 0.5);
566 index + index_i + 1 - src_size * (src_size - 1) / 2 + (src_size - index_i) * ((src_size - index_i) - 1) / 2;
567 first_it = begin_it + index_i;
568 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:46
The forward declared iterator type for pairwise_combine_view.
Definition pairwise_combine.hpp:250
constexpr basic_iterator operator++(int) noexcept(noexcept(std::declval< underlying_iterator_type & >()++))
Post-increment operator.
Definition pairwise_combine.hpp:364
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:557
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:428
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:398
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:339
constexpr reference operator*() const noexcept(noexcept(*std::declval< underlying_iterator_type >()))
Accesses the pointed-to element.
Definition pairwise_combine.hpp:331
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:481
basic_iterator(basic_iterator const &)=default
Defaulted.
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:542
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:451
basic_iterator()=default
Defaulted.
basic_iterator & operator=(basic_iterator const &)=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 equal to rhs.
Definition pairwise_combine.hpp:471
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:418
constexpr basic_iterator & operator++() noexcept(noexcept(++std::declval< underlying_iterator_type & >()))
Pre-increment operator.
Definition pairwise_combine.hpp:351
common_tuple< underlying_ref_t, underlying_ref_t > reference
The reference type.
Definition pairwise_combine.hpp:273
void pointer
The pointer type.
Definition pairwise_combine.hpp:275
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:512
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:302
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:408
constexpr basic_iterator(basic_iterator< other_range_type > other) noexcept
Constructs const iterator from non-const iterator.
Definition pairwise_combine.hpp:322
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:491
std::ranges::iterator_t< range_type > underlying_iterator_type
Alias type for the iterator over the passed range type.
Definition pairwise_combine.hpp:257
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:438
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:522
~basic_iterator()=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:387
basic_iterator(basic_iterator &&)=default
Defaulted.
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:373
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:501
Generates all pairwise combinations of the elements in the underlying range.
Definition pairwise_combine.hpp:41
underlying_range_type u_range
The underling range.
Definition pairwise_combine.hpp:218
pairwise_combine_view(pairwise_combine_view const &)=default
Defaulted.
constexpr pairwise_combine_view(other_range_t &&range)
Constructs from a view.
Definition pairwise_combine.hpp:146
pairwise_combine_view(pairwise_combine_view &&)=default
Defaulted.
constexpr pairwise_combine_view(underlying_range_type range)
Constructs from a view.
Definition pairwise_combine.hpp:85
constexpr iterator begin() noexcept
Returns an iterator to the first element of the range.
Definition pairwise_combine.hpp:166
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:208
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:55
pairwise_combine_view & operator=(pairwise_combine_view &&)=default
Defaulted.
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:220
~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:197
constexpr const_iterator begin() const noexcept
Returns an iterator to the first element of the range.
Definition pairwise_combine.hpp:172
pairwise_combine_view & operator=(pairwise_combine_view const &)=default
Defaulted.
constexpr iterator end() noexcept
Returns an iterator to the element following the last element of the range.
Definition pairwise_combine.hpp:191
A generic random access iterator that delegates most operations to the range.
Definition random_access_iterator.hpp:288
Provides seqan3::common_tuple.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
seqan::stl::tuple< t... > common_tuple
A std::tuple implementation that incorporates most changes from C++23's standard library.
Definition common_tuple.hpp:24
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:48
constexpr auto pairwise_combine
A view adaptor that generates all pairwise combinations of the elements of the underlying range.
Definition pairwise_combine.hpp:647
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:26
The SeqAn namespace for views.
Definition char_strictly_to.hpp:19
SeqAn specific customisations in the standard namespace.
Defines iterator_category member if underlying_iterator_t has a valid std::iterator_traits::iterator_...
Definition iterator_traits.hpp:39
Additional non-standard concepts for ranges.