Namespaces
Variants

std::ranges::join_with_view<V,Pattern>:: iterator <Const>:: operator++,--

From cppreference.net
Ranges library
Range adaptors
constexpr /*iterator*/ & operator ++ ( ) ;
(1) (начиная с C++23)
constexpr void operator ++ ( int ) ;
(2) (начиная с C++23)
constexpr /*iterator*/ operator ++ ( int )

requires std:: is_reference_v < /*InnerBase*/ > &&
ranges:: forward_range < /*Base*/ > &&

ranges:: forward_range < /*InnerBase*/ > ;
(3) (начиная с C++23)
constexpr /*iterator*/ & operator -- ( )

requires std:: is_reference_v < /*InnerBase*/ > &&
ranges:: bidirectional_range < /*Base*/ > &&
ranges:: bidirectional_range < /*InnerBase*/ > &&
ranges:: common_range < /*InnerBase*/ > &&
ranges:: bidirectional_range < /*PatternBase*/ > &&

ranges:: common_range < /*PatternBase*/ > ;
(4) (начиная с C++23)
constexpr /*iterator*/ operator -- ( int )

requires std:: is_reference_v < /*InnerBase*/ > &&
ranges:: bidirectional_range < /*Base*/ > &&
ranges:: bidirectional_range < /*InnerBase*/ > &&
ranges:: common_range < /*InnerBase*/ > &&
ranges:: bidirectional_range < /*PatternBase*/ > &&

ranges:: common_range < /*PatternBase*/ > ;
(5) (начиная с C++23)

Увеличивает или уменьшает итератор.

1) Инкрементирует внутренний итератор как если бы с помощью std:: visit ( [ ] ( auto & it ) { ++ it ; } , inner_it_  ) ; .
После этого корректирует внутренний и внешний итераторы следующим образом:
  • Если увеличенный внутренний итератор является конечным итератором диапазона шаблона, он устанавливается в итератор начала следующего внутреннего диапазона.
  • Если увеличенный внутренний итератор является конечным итератором внутреннего диапазона, внешний итератор увеличивается. Затем:
  • Если увеличенный внешний итератор не является конечным итератором внешнего диапазона, внутренний итератор устанавливается в итератор начала диапазона шаблона.
  • В противном случае, если std:: is_reference_v < InnerBase   > равно true , внутренний итератор устанавливается в итератор шаблона, содержащий сингулярное значение .
  • Повторяет вышеуказанные операции до тех пор, пока внутренний итератор не перестанет быть конечным итератором или внешний итератор не станет конечным итератором.
2) Эквивалентно ++* this ; .
3) Эквивалентно auto tmp = * this ;
++* this ;
return tmp ;
.
4) Если внешний итератор является итератором за пределами внешнего диапазона, уменьшает его и устанавливает внутренний итератор в итератор за пределами последнего внутреннего диапазона, в противном случае ничего не делает.
После этого корректирует внутренний и внешний итераторы следующим образом:
  • Если внутренний итератор указывает на начало внутреннего диапазона, он устанавливается в итератор за концом диапазона шаблона.
  • Если внутренний итератор указывает на начало диапазона шаблона, внешний итератор декрементируется, а внутренний итератор устанавливается в итератор за концом предыдущего внутреннего диапазона.
  • Повторяет вышеуказанные операции до тех пор, пока внутренний итератор не перестанет указывать на начало какого-либо диапазона.
Наконец, уменьшает внутренний итератор, как если бы с помощью std:: visit ( [ ] ( auto & it ) { -- it ; } , inner_it_  ) ; .
5) Эквивалентно auto tmp = * this ;
--* this ;
return tmp ;
.

Возвращаемое значение

1,4) * this
3,5) Копия * this , созданная до изменения.