From Jason Turner

[range.lazy.split.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpx5y_34_4/{from.md → to.md} +96 -0
tmp/tmpx5y_34_4/{from.md → to.md} RENAMED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `lazy_split_view` <a id="range.lazy.split.view">[[range.lazy.split.view]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<auto> struct require-constant; // exposition only
6
+
7
+ template<class R>
8
+ concept tiny-range = // exposition only
9
+ sized_range<R> &&
10
+ requires { typename require-constant<remove_reference_t<R>::size()>; } &&
11
+ (remove_reference_t<R>::size() <= 1);
12
+
13
+ template<input_range V, forward_range Pattern>
14
+ requires view<V> && view<Pattern> &&
15
+ indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
16
+ (forward_range<V> || tiny-range<Pattern>)
17
+ class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>> {
18
+ private:
19
+ V base_ = V(); // exposition only
20
+ Pattern pattern_ = Pattern(); // exposition only
21
+
22
+ non-propagating-cache<iterator_t<V>> current_; // exposition only, present only
23
+ // if forward_range<V> is false
24
+
25
+ // [range.lazy.split.outer], class template lazy_split_view::outer-iterator
26
+ template<bool> struct outer-iterator; // exposition only
27
+
28
+ // [range.lazy.split.inner], class template lazy_split_view::inner-iterator
29
+ template<bool> struct inner-iterator; // exposition only
30
+
31
+ public:
32
+ lazy_split_view()
33
+ requires default_initializable<V> && default_initializable<Pattern> = default;
34
+ constexpr explicit lazy_split_view(V base, Pattern pattern);
35
+
36
+ template<input_range R>
37
+ requires constructible_from<V, views::all_t<R>> &&
38
+ constructible_from<Pattern, single_view<range_value_t<R>>>
39
+ constexpr explicit lazy_split_view(R&& r, range_value_t<R> e);
40
+
41
+ constexpr V base() const & requires copy_constructible<V> { return base_; }
42
+ constexpr V base() && { return std::move(base_); }
43
+
44
+ constexpr auto begin() {
45
+ if constexpr (forward_range<V>) {
46
+ return outer-iterator<simple-view<V> && simple-view<Pattern>>
47
+ {*this, ranges::begin(base_)};
48
+ } else {
49
+ current_ = ranges::begin(base_);
50
+ return outer-iterator<false>{*this};
51
+ }
52
+ }
53
+
54
+ constexpr auto begin() const requires forward_range<V> && forward_range<const V> {
55
+ return outer-iterator<true>{*this, ranges::begin(base_)};
56
+ }
57
+
58
+ constexpr auto end() requires forward_range<V> && common_range<V> {
59
+ return outer-iterator<simple-view<V> && simple-view<Pattern>>
60
+ {*this, ranges::end(base_)};
61
+ }
62
+
63
+ constexpr auto end() const {
64
+ if constexpr (forward_range<V> && forward_range<const V> && common_range<const V>)
65
+ return outer-iterator<true>{*this, ranges::end(base_)};
66
+ else
67
+ return default_sentinel;
68
+ }
69
+ };
70
+
71
+ template<class R, class P>
72
+ lazy_split_view(R&&, P&&) -> lazy_split_view<views::all_t<R>, views::all_t<P>>;
73
+
74
+ template<input_range R>
75
+ lazy_split_view(R&&, range_value_t<R>)
76
+ -> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>;
77
+ }
78
+ ```
79
+
80
+ ``` cpp
81
+ constexpr explicit lazy_split_view(V base, Pattern pattern);
82
+ ```
83
+
84
+ *Effects:* Initializes *base\_* with `std::move(base)`, and *pattern\_*
85
+ with `std::move(pattern)`.
86
+
87
+ ``` cpp
88
+ template<input_range R>
89
+ requires constructible_from<V, views::all_t<R>> &&
90
+ constructible_from<Pattern, single_view<range_value_t<R>>>
91
+ constexpr explicit lazy_split_view(R&& r, range_value_t<R> e);
92
+ ```
93
+
94
+ *Effects:* Initializes *base\_* with `views::all(std::forward<R>(r))`,
95
+ and *pattern\_* with `views::single(std::move(e))`.
96
+