From Jason Turner

[range.join.with.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpe_xd9xdw/{from.md → to.md} +113 -0
tmp/tmpe_xd9xdw/{from.md → to.md} RENAMED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `join_with_view` <a id="range.join.with.view">[[range.join.with.view]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<class R, class P>
6
+ concept compatible-joinable-ranges = // exposition only
7
+ common_with<range_value_t<R>, range_value_t<P>> &&
8
+ common_reference_with<range_reference_t<R>, range_reference_t<P>> &&
9
+ common_reference_with<range_rvalue_reference_t<R>, range_rvalue_reference_t<P>>;
10
+
11
+ template<class R>
12
+ concept bidirectional-common = bidirectional_range<R> && common_range<R>; // exposition only
13
+
14
+ template<input_range V, forward_range Pattern>
15
+ requires view<V> && input_range<range_reference_t<V>>
16
+ && view<Pattern>
17
+ && compatible-joinable-ranges<range_reference_t<V>, Pattern>
18
+ class join_with_view : public view_interface<join_with_view<V, Pattern>> {
19
+ using InnerRng = range_reference_t<V>; // exposition only
20
+
21
+ V base_ = V(); // exposition only
22
+ non-propagating-cache<iterator_t<V>> outer_it_; // exposition only, present only
23
+ // when !forward_range<V>
24
+ non-propagating-cache<remove_cv_t<InnerRng>> inner_; // exposition only, present only
25
+ // if is_reference_v<InnerRng> is false
26
+ Pattern pattern_ = Pattern(); // exposition only
27
+
28
+ // [range.join.with.iterator], class template join_with_view::iterator
29
+ template<bool Const> struct iterator; // exposition only
30
+
31
+ // [range.join.with.sentinel], class template join_with_view::sentinel
32
+ template<bool Const> struct sentinel; // exposition only
33
+
34
+ public:
35
+ join_with_view()
36
+ requires default_initializable<V> && default_initializable<Pattern> = default;
37
+
38
+ constexpr explicit join_with_view(V base, Pattern pattern);
39
+
40
+ template<input_range R>
41
+ requires constructible_from<V, views::all_t<R>> &&
42
+ constructible_from<Pattern, single_view<range_value_t<InnerRng>>>
43
+ constexpr explicit join_with_view(R&& r, range_value_t<InnerRng> e);
44
+
45
+ constexpr V base() const & requires copy_constructible<V> { return base_; }
46
+ constexpr V base() && { return std::move(base_); }
47
+
48
+ constexpr auto begin() {
49
+ if constexpr (forward_range<V>) {
50
+ constexpr bool use_const =
51
+ simple-view<V> && is_reference_v<InnerRng> && simple-view<Pattern>;
52
+ return iterator<use_const>{*this, ranges::begin(base_)};
53
+ }
54
+ else {
55
+ outer_it_ = ranges::begin(base_);
56
+ return iterator<false>{*this};
57
+ }
58
+ }
59
+ constexpr auto begin() const
60
+ requires forward_range<const V> &&
61
+ forward_range<const Pattern> &&
62
+ is_reference_v<range_reference_t<const V>> &&
63
+ input_range<range_reference_t<const V>> {
64
+ return iterator<true>{*this, ranges::begin(base_)};
65
+ }
66
+
67
+ constexpr auto end() {
68
+ if constexpr (forward_range<V> &&
69
+ is_reference_v<InnerRng> && forward_range<InnerRng> &&
70
+ common_range<V> && common_range<InnerRng>)
71
+ return iterator<simple-view<V> && simple-view<Pattern>>{*this, ranges::end(base_)};
72
+ else
73
+ return sentinel<simple-view<V> && simple-view<Pattern>>{*this};
74
+ }
75
+ constexpr auto end() const
76
+ requires forward_range<const V> && forward_range<const Pattern> &&
77
+ is_reference_v<range_reference_t<const V>> &&
78
+ input_range<range_reference_t<const V>> {
79
+ using InnerConstRng = range_reference_t<const V>;
80
+ if constexpr (forward_range<InnerConstRng> &&
81
+ common_range<const V> && common_range<InnerConstRng>)
82
+ return iterator<true>{*this, ranges::end(base_)};
83
+ else
84
+ return sentinel<true>{*this};
85
+ }
86
+ };
87
+
88
+ template<class R, class P>
89
+ join_with_view(R&&, P&&) -> join_with_view<views::all_t<R>, views::all_t<P>>;
90
+
91
+ template<input_range R>
92
+ join_with_view(R&&, range_value_t<range_reference_t<R>>)
93
+ -> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>;
94
+ }
95
+ ```
96
+
97
+ ``` cpp
98
+ constexpr explicit join_with_view(V base, Pattern pattern);
99
+ ```
100
+
101
+ *Effects:* Initializes *base\_* with `std::move(base)` and *pattern\_*
102
+ with `std::move(pattern)`.
103
+
104
+ ``` cpp
105
+ template<input_range R>
106
+ requires constructible_from<V, views::all_t<R>> &&
107
+ constructible_from<Pattern, single_view<range_value_t<InnerRng>>>
108
+ constexpr explicit join_with_view(R&& r, range_value_t<InnerRng> e);
109
+ ```
110
+
111
+ *Effects:* Initializes *base\_* with `views::all(std::forward<R>(r))`
112
+ and *pattern\_* with `views::single(std::move(e))`.
113
+