From Jason Turner

[range.join.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp7bko13z8/{from.md → to.md} +24 -17
tmp/tmp7bko13z8/{from.md → to.md} RENAMED
@@ -1,45 +1,53 @@
1
  #### Class template `join_view` <a id="range.join.view">[[range.join.view]]</a>
2
 
3
  ``` cpp
4
  namespace std::ranges {
5
  template<input_range V>
6
- requires view<V> && input_range<range_reference_t<V>> &&
7
- (is_reference_v<range_reference_t<V>> ||
8
- view<range_value_t<V>>)
9
  class join_view : public view_interface<join_view<V>> {
10
  private:
11
- using InnerRng = // exposition only
12
- range_reference_t<V>;
13
  // [range.join.iterator], class template join_view::iterator
14
  template<bool Const>
15
  struct iterator; // exposition only
 
16
  // [range.join.sentinel], class template join_view::sentinel
17
  template<bool Const>
18
  struct sentinel; // exposition only
19
 
20
  V base_ = V(); // exposition only
21
- views::all_t<InnerRng> inner_ = // exposition only, present only when !is_reference_v<InnerRng>
22
- views::all_t<InnerRng>();
 
 
 
 
23
  public:
24
- join_view() = default;
25
  constexpr explicit join_view(V base);
26
 
27
  constexpr V base() const & requires copy_constructible<V> { return base_; }
28
  constexpr V base() && { return std::move(base_); }
29
 
30
  constexpr auto begin() {
 
31
  constexpr bool use_const = simple-view<V> &&
32
- is_reference_v<range_reference_t<V>>;
33
  return iterator<use_const>{*this, ranges::begin(base_)};
 
 
 
 
34
  }
35
 
36
  constexpr auto begin() const
37
- requires input_range<const V> &&
38
- is_reference_v<range_reference_t<const V>> {
39
- return iterator<true>{*this, ranges::begin(base_)};
40
- }
41
 
42
  constexpr auto end() {
43
  if constexpr (forward_range<V> &&
44
  is_reference_v<InnerRng> && forward_range<InnerRng> &&
45
  common_range<V> && common_range<InnerRng>)
@@ -47,15 +55,14 @@ namespace std::ranges {
47
  else
48
  return sentinel<simple-view<V>>{*this};
49
  }
50
 
51
  constexpr auto end() const
52
- requires input_range<const V> &&
53
- is_reference_v<range_reference_t<const V>> {
54
- if constexpr (forward_range<const V> &&
55
  is_reference_v<range_reference_t<const V>> &&
56
- forward_range<range_reference_t<const V>> &&
 
57
  common_range<const V> &&
58
  common_range<range_reference_t<const V>>)
59
  return iterator<true>{*this, ranges::end(base_)};
60
  else
61
  return sentinel<true>{*this};
 
1
  #### Class template `join_view` <a id="range.join.view">[[range.join.view]]</a>
2
 
3
  ``` cpp
4
  namespace std::ranges {
5
  template<input_range V>
6
+ requires view<V> && input_range<range_reference_t<V>>
 
 
7
  class join_view : public view_interface<join_view<V>> {
8
  private:
9
+ using InnerRng = range_reference_t<V>; // exposition only
10
+
11
  // [range.join.iterator], class template join_view::iterator
12
  template<bool Const>
13
  struct iterator; // exposition only
14
+
15
  // [range.join.sentinel], class template join_view::sentinel
16
  template<bool Const>
17
  struct sentinel; // exposition only
18
 
19
  V base_ = V(); // exposition only
20
+
21
+ non-propagating-cache<iterator_t<V>> outer_; // exposition only, present only
22
+ // when !forward_range<V>
23
+ non-propagating-cache<remove_cv_t<InnerRng>> inner_; // exposition only, present only
24
+ // if is_reference_v<InnerRng> is false
25
+
26
  public:
27
+ join_view() requires default_initializable<V> = default;
28
  constexpr explicit join_view(V base);
29
 
30
  constexpr V base() const & requires copy_constructible<V> { return base_; }
31
  constexpr V base() && { return std::move(base_); }
32
 
33
  constexpr auto begin() {
34
+ if constexpr (forward_range<V>) {
35
  constexpr bool use_const = simple-view<V> &&
36
+ is_reference_v<InnerRng>;
37
  return iterator<use_const>{*this, ranges::begin(base_)};
38
+ } else {
39
+ outer_ = ranges::begin(base_);
40
+ return iterator<false>{*this};
41
+ }
42
  }
43
 
44
  constexpr auto begin() const
45
+ requires forward_range<const V> &&
46
+ is_reference_v<range_reference_t<const V>> &&
47
+ input_range<range_reference_t<const V>>
48
+ { return iterator<true>{*this, ranges::begin(base_)}; }
49
 
50
  constexpr auto end() {
51
  if constexpr (forward_range<V> &&
52
  is_reference_v<InnerRng> && forward_range<InnerRng> &&
53
  common_range<V> && common_range<InnerRng>)
 
55
  else
56
  return sentinel<simple-view<V>>{*this};
57
  }
58
 
59
  constexpr auto end() const
60
+ requires forward_range<const V> &&
 
 
61
  is_reference_v<range_reference_t<const V>> &&
62
+ input_range<range_reference_t<const V>> {
63
+ if constexpr (forward_range<range_reference_t<const V>> &&
64
  common_range<const V> &&
65
  common_range<range_reference_t<const V>>)
66
  return iterator<true>{*this, ranges::end(base_)};
67
  else
68
  return sentinel<true>{*this};