From Jason Turner

[range.join.with.view]

Diff to HTML by rtfpessoa

tmp/tmpmkal2f11/{from.md → to.md} RENAMED
@@ -1,22 +1,16 @@
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
@@ -58,11 +52,12 @@ namespace std::ranges {
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> &&
@@ -73,11 +68,12 @@ namespace std::ranges {
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
 
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>
6
  concept bidirectional-common = bidirectional_range<R> && common_range<R>; // exposition only
7
 
8
  template<input_range V, forward_range Pattern>
9
  requires view<V> && input_range<range_reference_t<V>>
10
  && view<Pattern>
11
+ && concatable<range_reference_t<V>, Pattern>
12
  class join_with_view : public view_interface<join_with_view<V, Pattern>> {
13
  using InnerRng = range_reference_t<V>; // exposition only
14
 
15
  V base_ = V(); // exposition only
16
  non-propagating-cache<iterator_t<V>> outer_it_; // exposition only, present only
 
52
  }
53
  constexpr auto begin() const
54
  requires forward_range<const V> &&
55
  forward_range<const Pattern> &&
56
  is_reference_v<range_reference_t<const V>> &&
57
+ input_range<range_reference_t<const V>> &&
58
+ concatable<range_reference_t<const V>, const Pattern> {
59
  return iterator<true>{*this, ranges::begin(base_)};
60
  }
61
 
62
  constexpr auto end() {
63
  if constexpr (forward_range<V> &&
 
68
  return sentinel<simple-view<V> && simple-view<Pattern>>{*this};
69
  }
70
  constexpr auto end() const
71
  requires forward_range<const V> && forward_range<const Pattern> &&
72
  is_reference_v<range_reference_t<const V>> &&
73
+ input_range<range_reference_t<const V>> &&
74
+ concatable<range_reference_t<const V>, const Pattern> {
75
  using InnerConstRng = range_reference_t<const V>;
76
  if constexpr (forward_range<InnerConstRng> &&
77
  common_range<const V> && common_range<InnerConstRng>)
78
  return iterator<true>{*this, ranges::end(base_)};
79
  else