Init
This commit is contained in:
263
cppdraft/range/join/iterator.md
Normal file
263
cppdraft/range/join/iterator.md
Normal file
@@ -0,0 +1,263 @@
|
||||
[range.join.iterator]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.iterator)
|
||||
|
||||
### 25.7.14 Join view [[range.join]](range.join#iterator)
|
||||
|
||||
#### 25.7.14.3 Class template join_view::*iterator* [range.join.iterator]
|
||||
|
||||
[ð](#lib:join_view::iterator)
|
||||
|
||||
namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V>requires [view](range.view#concept:view "25.4.5 Views [range.view]")<V> && [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<V>>template<bool Const>struct join_view<V>::*iterator* {private:using *Parent* = *maybe-const*<Const, join_view>; // *exposition only*using *Base* = *maybe-const*<Const, V>; // *exposition only*using *OuterIter* = iterator_t<*Base*>; // *exposition only*using *InnerIter* = iterator_t<range_reference_t<*Base*>>; // *exposition only*static constexpr bool *ref-is-glvalue* = // *exposition only* is_reference_v<range_reference_t<*Base*>>; *OuterIter* *outer_* = *OuterIter*(); // *exposition only*, present only// if *Base* models [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") optional<*InnerIter*> *inner_*; // *exposition only**Parent** *parent_* = nullptr; // *exposition only*constexpr void *satisfy*(); // *exposition only*constexpr *OuterIter*& *outer*(); // *exposition only*constexpr const *OuterIter*& *outer*() const; // *exposition only*constexpr *iterator*(*Parent*& parent, *OuterIter* outer)requires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<*Base*>; // *exposition only*constexpr explicit *iterator*(*Parent*& parent)requires (<*Base*>); // *exposition only*public:using iterator_concept = *see below*; using iterator_category = *see below*; // not always presentusing value_type = range_value_t<range_reference_t<*Base*>>; using difference_type = *see below*; *iterator*() = default; constexpr *iterator*(*iterator*<!Const> i)requires Const &&[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<iterator_t<V>, *OuterIter*> &&[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<iterator_t<*InnerRng*>, *InnerIter*>; constexpr decltype(auto) operator*() const { return ***inner_*; }constexpr *InnerIter* operator->() constrequires [*has-arrow*](range.utility.helpers#concept:has-arrow "25.5.2 Helper concepts [range.utility.helpers]")<*InnerIter*> && [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")<*InnerIter*>; constexpr *iterator*& operator++(); constexpr void operator++(int); constexpr *iterator* operator++(int)requires *ref-is-glvalue* && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<*Base*> &&[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<*Base*>>; constexpr *iterator*& operator--()requires *ref-is-glvalue* && [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<*Base*> &&[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<*Base*>> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<*Base*>>; constexpr *iterator* operator--(int)requires *ref-is-glvalue* && [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<*Base*> &&[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<*Base*>> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<*Base*>>; friend constexpr bool operator==(const *iterator*& x, const *iterator*& y)requires *ref-is-glvalue* && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<*Base*> &&[equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4 Concept equality_comparable [concept.equalitycomparable]")<iterator_t<range_reference_t<*Base*>>>; friend constexpr decltype(auto) iter_move(const *iterator*& i)noexcept(noexcept(ranges::iter_move(*i.*inner_*))) {return ranges::iter_move(*i.*inner_*); }friend constexpr void iter_swap(const *iterator*& x, const *iterator*& y)noexcept(noexcept(ranges::iter_swap(*x.*inner_*, *y.*inner_*)))requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<*InnerIter*>; };}
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6843)
|
||||
|
||||
*iterator*::iterator_concept is defined as follows:
|
||||
|
||||
- [(1.1)](#1.1)
|
||||
|
||||
If *ref-is-glvalue* is true, *Base* models [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]"), and range_reference_t<*Base*> models
|
||||
both [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]") and [common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]"),
|
||||
then iterator_concept denotes bidirectional_iterator_tag[.](#1.1.sentence-1)
|
||||
|
||||
- [(1.2)](#1.2)
|
||||
|
||||
Otherwise, if *ref-is-glvalue* is true and *Base* and range_reference_t<*Base*> each model [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]"), then iterator_concept denotes forward_iterator_tag[.](#1.2.sentence-1)
|
||||
|
||||
- [(1.3)](#1.3)
|
||||
|
||||
Otherwise, iterator_concept denotes input_iterator_tag[.](#1.3.sentence-1)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6858)
|
||||
|
||||
The member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4 The typedef specifier [dcl.typedef]") iterator_category is defined
|
||||
if and only if *ref-is-glvalue* is true,*Base* models [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]"), andrange_reference_t<*Base*> models [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")[.](#2.sentence-1)
|
||||
|
||||
In that case,*iterator*::iterator_category is defined as follows:
|
||||
|
||||
- [(2.1)](#2.1)
|
||||
|
||||
Let *OUTERC* denote iterator_traits<iterator_t<*Base*>>::iterator_category, and
|
||||
let *INNERC* denote iterator_traits<iterator_t<range_reference_t<*Base*>>>::iterator_category[.](#2.1.sentence-1)
|
||||
|
||||
- [(2.2)](#2.2)
|
||||
|
||||
If *OUTERC* and *INNERC* each model [derived_from](concept.derived#concept:derived_from "18.4.3 Concept derived_from [concept.derived]")<bidirectional_iterator_tag> and range_reference_t<*Base*> models [common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]"), iterator_category denotes bidirectional_iterator_tag[.](#2.2.sentence-1)
|
||||
|
||||
- [(2.3)](#2.3)
|
||||
|
||||
Otherwise, if *OUTERC* and *INNERC* each model [derived_from](concept.derived#concept:derived_from "18.4.3 Concept derived_from [concept.derived]")<forward_iterator_tag>, iterator_category denotes forward_iterator_tag[.](#2.3.sentence-1)
|
||||
|
||||
- [(2.4)](#2.4)
|
||||
|
||||
Otherwise, iterator_category denotes input_iterator_tag[.](#2.4.sentence-1)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6883)
|
||||
|
||||
*iterator*::difference_type denotes the type:common_type_t< range_difference_t<*Base*>,
|
||||
range_difference_t<range_reference_t<*Base*>>>
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6891)
|
||||
|
||||
join_view iterators use the *satisfy* function to skip over
|
||||
empty inner ranges[.](#4.sentence-1)
|
||||
|
||||
[ð](#lib:outer,join_view::iterator)
|
||||
|
||||
`constexpr OuterIter& outer();
|
||||
constexpr const OuterIter& outer() const;
|
||||
`
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6902)
|
||||
|
||||
*Returns*: *outer_* if *Base* models [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]");
|
||||
otherwise, **parent_*->*outer_*[.](#5.sentence-1)
|
||||
|
||||
[ð](#lib:satisfy,join_view::iterator)
|
||||
|
||||
`constexpr void satisfy();
|
||||
`
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6914)
|
||||
|
||||
*Effects*: Equivalent to:auto update_inner = [this](const iterator_t<*Base*>& x) -> auto&& {if constexpr (*ref-is-glvalue*) // *x is a referencereturn *x; elsereturn *parent_*->*inner_*.*emplace-deref*(x);};
|
||||
|
||||
for (; *outer*() != ranges::end(*parent_*->*base_*); ++*outer*()) {auto&& inner = update_inner(*outer*()); *inner_* = ranges::begin(inner); if (**inner_* != ranges::end(inner))return;}if constexpr (*ref-is-glvalue*)*inner_*.reset();
|
||||
|
||||
[ð](#lib:join_view::iterator,constructor)
|
||||
|
||||
`constexpr iterator(Parent& parent, OuterIter outer)
|
||||
requires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<Base>;
|
||||
`
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6943)
|
||||
|
||||
*Effects*: Initializes *outer_* with std::move(outer) and*parent_* with addressof(parent); then calls *satisfy*()[.](#7.sentence-1)
|
||||
|
||||
[ð](#lib:join_view::iterator,constructor_)
|
||||
|
||||
`constexpr explicit iterator(Parent& parent)
|
||||
requires (<Base>);
|
||||
`
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6956)
|
||||
|
||||
*Effects*: Initializes *parent_* with addressof(parent);
|
||||
then calls *satisfy*()[.](#8.sentence-1)
|
||||
|
||||
[ð](#lib:join_view::iterator,constructor__)
|
||||
|
||||
`constexpr iterator(iterator<!Const> i)
|
||||
requires Const &&
|
||||
[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<iterator_t<V>, OuterIter> &&
|
||||
[convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<iterator_t<InnerRng>, InnerIter>;
|
||||
`
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6971)
|
||||
|
||||
*Effects*: Initializes *outer_* with std::move(i.*outer_*),*inner_* with std::move(i.*inner_*), and*parent_* with i.*parent_*[.](#9.sentence-1)
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6977)
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
Const can only be true when *Base* models [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")[.](#10.sentence-1)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[ð](#lib:operator-%3e,join_view::iterator)
|
||||
|
||||
`constexpr InnerIter operator->() const
|
||||
requires [has-arrow](range.utility.helpers#concept:has-arrow "25.5.2 Helper concepts [range.utility.helpers]")<InnerIter> && [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")<InnerIter>;
|
||||
`
|
||||
|
||||
[11](#11)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6991)
|
||||
|
||||
*Effects*: Equivalent to: return **inner_*;
|
||||
|
||||
[ð](#lib:operator++,join_view::iterator)
|
||||
|
||||
`constexpr iterator& operator++();
|
||||
`
|
||||
|
||||
[12](#12)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7002)
|
||||
|
||||
Let *inner-range* be:
|
||||
|
||||
- [(12.1)](#12.1)
|
||||
|
||||
If *ref-is-glvalue* is true, **outer*()[.](#12.1.sentence-1)
|
||||
|
||||
- [(12.2)](#12.2)
|
||||
|
||||
Otherwise, **parent_*->*inner_*[.](#12.2.sentence-1)
|
||||
|
||||
[13](#13)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7009)
|
||||
|
||||
*Effects*: Equivalent to:if (++**inner_* == ranges::end(*as-lvalue*(*inner-range*))) {++*outer*(); *satisfy*();}return *this;
|
||||
|
||||
[ð](#lib:operator++,join_view::iterator_)
|
||||
|
||||
`constexpr void operator++(int);
|
||||
`
|
||||
|
||||
[14](#14)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7027)
|
||||
|
||||
*Effects*: Equivalent to: ++*this[.](#14.sentence-1)
|
||||
|
||||
[ð](#lib:operator++,join_view::iterator__)
|
||||
|
||||
`constexpr iterator operator++(int)
|
||||
requires ref-is-glvalue && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<Base> &&
|
||||
[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<Base>>;
|
||||
`
|
||||
|
||||
[15](#15)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7040)
|
||||
|
||||
*Effects*: Equivalent to:auto tmp = *this;++*this;return tmp;
|
||||
|
||||
[ð](#lib:operator--,join_view::iterator)
|
||||
|
||||
`constexpr iterator& operator--()
|
||||
requires ref-is-glvalue && [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<Base> &&
|
||||
[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<Base>> &&
|
||||
[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<Base>>;
|
||||
`
|
||||
|
||||
[16](#16)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7059)
|
||||
|
||||
*Effects*: Equivalent to:if (*outer_* == ranges::end(*parent_*->*base_*))*inner_* = ranges::end(*as-lvalue*(*--*outer_*));while (**inner_* == ranges::begin(*as-lvalue*(**outer_*)))**inner_* = ranges::end(*as-lvalue*(*--*outer_*));--**inner_*;return *this;
|
||||
|
||||
[ð](#lib:operator--,join_view::iterator_)
|
||||
|
||||
`constexpr iterator operator--(int)
|
||||
requires ref-is-glvalue && [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<Base> &&
|
||||
[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<Base>> &&
|
||||
[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<Base>>;
|
||||
`
|
||||
|
||||
[17](#17)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7081)
|
||||
|
||||
*Effects*: Equivalent to:auto tmp = *this;--*this;return tmp;
|
||||
|
||||
[ð](#lib:operator==,join_view::iterator)
|
||||
|
||||
`friend constexpr bool operator==(const iterator& x, const iterator& y)
|
||||
requires ref-is-glvalue && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<Base> &&
|
||||
[equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4 Concept equality_comparable [concept.equalitycomparable]")<iterator_t<range_reference_t<Base>>>;
|
||||
`
|
||||
|
||||
[18](#18)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7099)
|
||||
|
||||
*Effects*: Equivalent to:return x.*outer_* == y.*outer_* && x.*inner_* == y.*inner_*;
|
||||
|
||||
[ð](#lib:iter_swap,join_view::iterator)
|
||||
|
||||
`friend constexpr void iter_swap(const iterator& x, const iterator& y)
|
||||
noexcept(noexcept(ranges::iter_swap(*x.inner_, *y.inner_)))
|
||||
requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<InnerIter>;
|
||||
`
|
||||
|
||||
[19](#19)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7113)
|
||||
|
||||
*Effects*: Equivalent to: ranges::iter_swap(*x.*inner_*, *y.*inner_*);
|
||||
30
cppdraft/range/join/overview.md
Normal file
30
cppdraft/range/join/overview.md
Normal file
@@ -0,0 +1,30 @@
|
||||
[range.join.overview]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.overview)
|
||||
|
||||
### 25.7.14 Join view [[range.join]](range.join#overview)
|
||||
|
||||
#### 25.7.14.1 Overview [range.join.overview]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6650)
|
||||
|
||||
join_view flattens a view of ranges into a view[.](#1.sentence-1)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6653)
|
||||
|
||||
The name views::join denotes a
|
||||
range adaptor object ([[range.adaptor.object]](range.adaptor.object "25.7.2 Range adaptor objects"))[.](#2.sentence-1)
|
||||
|
||||
Given a subexpression E, the expressionviews::join(E) is expression-equivalent tojoin_view<views::all_t<decltype((E))>>{E}[.](#2.sentence-2)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6661)
|
||||
|
||||
[*Example [1](#example-1)*: vector<string> ss{"hello", " ", "world", "!"};for (char ch : ss | views::join) cout << ch; // prints hello world! â *end example*]
|
||||
49
cppdraft/range/join/sentinel.md
Normal file
49
cppdraft/range/join/sentinel.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[range.join.sentinel]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.sentinel)
|
||||
|
||||
### 25.7.14 Join view [[range.join]](range.join#sentinel)
|
||||
|
||||
#### 25.7.14.4 Class template join_view::*sentinel* [range.join.sentinel]
|
||||
|
||||
[ð](#lib:join_view::sentinel)
|
||||
|
||||
namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V>requires [view](range.view#concept:view "25.4.5 Views [range.view]")<V> && [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<V>>template<bool Const>struct join_view<V>::*sentinel* {private:using *Parent* = *maybe-const*<Const, join_view>; // *exposition only*using *Base* = *maybe-const*<Const, V>; // *exposition only* sentinel_t<*Base*> *end_* = sentinel_t<*Base*>(); // *exposition only*public:*sentinel*() = default; constexpr explicit *sentinel*(*Parent*& parent); constexpr *sentinel*(*sentinel*<!Const> s)requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<sentinel_t<V>, sentinel_t<*Base*>>; template<bool OtherConst>requires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<sentinel_t<*Base*>, iterator_t<*maybe-const*<OtherConst, V>>>friend constexpr bool operator==(const *iterator*<OtherConst>& x, const *sentinel*& y); };}
|
||||
|
||||
[ð](#lib:join_view::sentinel,constructor)
|
||||
|
||||
`constexpr explicit sentinel(Parent& parent);
|
||||
`
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7152)
|
||||
|
||||
*Effects*: Initializes *end_* with ranges::end(parent.*base_*)[.](#1.sentence-1)
|
||||
|
||||
[ð](#lib:join_view::sentinel,constructor_)
|
||||
|
||||
`constexpr sentinel(sentinel<!Const> s)
|
||||
requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<sentinel_t<V>, sentinel_t<Base>>;
|
||||
`
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7164)
|
||||
|
||||
*Effects*: Initializes *end_* with std::move(s.*end_*)[.](#2.sentence-1)
|
||||
|
||||
[ð](#lib:operator==,join_view::sentinel)
|
||||
|
||||
`template<bool OtherConst>
|
||||
requires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<sentinel_t<Base>, iterator_t<maybe-const<OtherConst, V>>>
|
||||
friend constexpr bool operator==(const iterator<OtherConst>& x, const sentinel& y);
|
||||
`
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7177)
|
||||
|
||||
*Effects*: Equivalent to: return x.*outer*() == y.*end_*;
|
||||
24
cppdraft/range/join/view.md
Normal file
24
cppdraft/range/join/view.md
Normal file
@@ -0,0 +1,24 @@
|
||||
[range.join.view]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.view)
|
||||
|
||||
### 25.7.14 Join view [[range.join]](range.join#view)
|
||||
|
||||
#### 25.7.14.2 Class template join_view [range.join.view]
|
||||
|
||||
[ð](#lib:join_view)
|
||||
|
||||
namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V>requires [view](range.view#concept:view "25.4.5 Views [range.view]")<V> && [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<V>>class join_view : public view_interface<join_view<V>> {private:using *InnerRng* = range_reference_t<V>; // *exposition only*// [[range.join.iterator]](range.join.iterator "25.7.14.3 Class template join_view::iterator"), class template join_view::*iterator*template<bool Const>struct *iterator*; // *exposition only*// [[range.join.sentinel]](range.join.sentinel "25.7.14.4 Class template join_view::sentinel"), class template join_view::*sentinel*template<bool Const>struct *sentinel*; // *exposition only* V *base_* = V(); // *exposition only**non-propagating-cache*<iterator_t<V>> *outer_*; // *exposition only*, present only// when <V>*non-propagating-cache*<remove_cv_t<*InnerRng*>> *inner_*; // *exposition only*, present only// if is_reference_v<*InnerRng*> is falsepublic: join_view() requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12 Concept default_initializable [concept.default.init]")<V> = default; constexpr explicit join_view(V base); constexpr V base() const & requires [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]")<V> { return *base_*; }constexpr V base() && { return std::move(*base_*); }constexpr auto begin() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<V>) {constexpr bool use_const = [*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]")<V> && is_reference_v<*InnerRng*>; return *iterator*<use_const>{*this, ranges::begin(*base_*)}; } else {*outer_* = ranges::begin(*base_*); return *iterator*<false>{*this}; }}constexpr auto begin() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<const V> && is_reference_v<range_reference_t<const V>> &&[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<const V>>{ return *iterator*<true>{*this, ranges::begin(*base_*)}; }constexpr auto end() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<V> && is_reference_v<*InnerRng*> && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<*InnerRng*> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<V> && [common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<*InnerRng*>)return *iterator*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]")<V>>{*this, ranges::end(*base_*)}; elsereturn *sentinel*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]")<V>>{*this}; }constexpr auto end() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<const V> && is_reference_v<range_reference_t<const V>> &&[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<const V>> {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<const V>> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<const V> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<const V>>)return *iterator*<true>{*this, ranges::end(*base_*)}; elsereturn *sentinel*<true>{*this}; }}; template<class R>explicit join_view(R&&) -> join_view<views::all_t<R>>;}
|
||||
|
||||
[ð](#lib:join_view,constructor)
|
||||
|
||||
`constexpr explicit join_view(V base);
|
||||
`
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6756)
|
||||
|
||||
*Effects*: Initializes *base_* with std::move(base)[.](#1.sentence-1)
|
||||
365
cppdraft/range/join/with.md
Normal file
365
cppdraft/range/join/with.md
Normal file
File diff suppressed because one or more lines are too long
263
cppdraft/range/join/with/iterator.md
Normal file
263
cppdraft/range/join/with/iterator.md
Normal file
File diff suppressed because one or more lines are too long
36
cppdraft/range/join/with/overview.md
Normal file
36
cppdraft/range/join/with/overview.md
Normal file
@@ -0,0 +1,36 @@
|
||||
[range.join.with.overview]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.with.overview)
|
||||
|
||||
### 25.7.15 Join with view [[range.join.with]](range.join.with#overview)
|
||||
|
||||
#### 25.7.15.1 Overview [range.join.with.overview]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7186)
|
||||
|
||||
join_with_view takes a view and a delimiter, and
|
||||
flattens the view,
|
||||
inserting every element of the delimiter
|
||||
in between elements of the view[.](#1.sentence-1)
|
||||
|
||||
The delimiter can be a single element or a view of elements[.](#1.sentence-2)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7193)
|
||||
|
||||
The name views::join_with denotes
|
||||
a range adaptor object ([[range.adaptor.object]](range.adaptor.object "25.7.2 Range adaptor objects"))[.](#2.sentence-1)
|
||||
|
||||
Given subexpressions E and F,
|
||||
the expression views::join_with(E, F) is expression-equivalent tojoin_with_view(E, F)[.](#2.sentence-2)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7201)
|
||||
|
||||
[*Example [1](#example-1)*: vector<string> vs = {"the", "quick", "brown", "fox"};for (char c : vs | views::join_with('-')) { cout << c;}// The above prints the-quick-brown-fox â *end example*]
|
||||
49
cppdraft/range/join/with/sentinel.md
Normal file
49
cppdraft/range/join/with/sentinel.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[range.join.with.sentinel]
|
||||
|
||||
# 25 Ranges library [[ranges]](./#ranges)
|
||||
|
||||
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.with.sentinel)
|
||||
|
||||
### 25.7.15 Join with view [[range.join.with]](range.join.with#sentinel)
|
||||
|
||||
#### 25.7.15.4 Class template join_with_view::*sentinel* [range.join.with.sentinel]
|
||||
|
||||
[ð](#lib:join_with_view::sentinel)
|
||||
|
||||
namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V, [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") Pattern>requires [view](range.view#concept:view "25.4.5 Views [range.view]")<V> && [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")<range_reference_t<V>>&& [view](range.view#concept:view "25.4.5 Views [range.view]")<Pattern> && [*concatable*](range.concat.view#concept:concatable "25.7.18.2 Class template concat_view [range.concat.view]")<range_reference_t<V>, Pattern>template<bool Const>class join_with_view<V, Pattern>::*sentinel* {using *Parent* = *maybe-const*<Const, join_with_view>; // *exposition only*using *Base* = *maybe-const*<Const, V>; // *exposition only* sentinel_t<*Base*> *end_* = sentinel_t<*Base*>(); // *exposition only*constexpr explicit *sentinel*(*Parent*& parent); // *exposition only*public:*sentinel*() = default; constexpr *sentinel*(*sentinel*<!Const> s)requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<sentinel_t<V>, sentinel_t<*Base*>>; template<bool OtherConst>requires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<sentinel_t<*Base*>, iterator_t<*maybe-const*<OtherConst, V>>>friend constexpr bool operator==(const *iterator*<OtherConst>& x, const *sentinel*& y); };}
|
||||
|
||||
[ð](#lib:join_with_view::sentinel,constructor)
|
||||
|
||||
`constexpr explicit sentinel(Parent& parent);
|
||||
`
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7786)
|
||||
|
||||
*Effects*: Initializes *end_* with ranges::end(parent.*base_*)[.](#1.sentence-1)
|
||||
|
||||
[ð](#lib:join_with_view::sentinel,constructor_)
|
||||
|
||||
`constexpr sentinel(sentinel<!Const> s)
|
||||
requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_to [concept.convertible]")<sentinel_t<V>, sentinel_t<Base>>;
|
||||
`
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7798)
|
||||
|
||||
*Effects*: Initializes *end_* with std::move(s.*end_*)[.](#2.sentence-1)
|
||||
|
||||
[ð](#lib:operator==,join_with_view::sentinel)
|
||||
|
||||
`template<bool OtherConst>
|
||||
requires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<sentinel_t<Base>, iterator_t<maybe-const<OtherConst, V>>>
|
||||
friend constexpr bool operator==(const iterator<OtherConst>& x, const sentinel& y);
|
||||
`
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L7811)
|
||||
|
||||
*Effects*: Equivalent to: return x.*outer*() == y.*end_*;
|
||||
38
cppdraft/range/join/with/view.md
Normal file
38
cppdraft/range/join/with/view.md
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user