From Jason Turner

[range.take.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpe_zzqlzd/{from.md → to.md} +41 -21
tmp/tmpe_zzqlzd/{from.md → to.md} RENAMED
@@ -5,62 +5,80 @@ namespace std::ranges {
5
  template<view V>
6
  class take_view : public view_interface<take_view<V>> {
7
  private:
8
  V base_ = V(); // exposition only
9
  range_difference_t<V> count_ = 0; // exposition only
 
10
  // [range.take.sentinel], class template take_view::sentinel
11
- template<bool> struct sentinel; // exposition only
 
12
  public:
13
- take_view() = default;
14
- constexpr take_view(V base, range_difference_t<V> count);
15
 
16
  constexpr V base() const & requires copy_constructible<V> { return base_; }
17
  constexpr V base() && { return std::move(base_); }
18
 
19
  constexpr auto begin() requires (!simple-view<V>) {
20
  if constexpr (sized_range<V>) {
21
- if constexpr (random_access_range<V>)
22
  return ranges::begin(base_);
23
- else {
24
- auto sz = size();
25
- return counted_iterator{ranges::begin(base_), sz};
 
 
 
 
 
 
 
26
  }
27
- } else
28
- return counted_iterator{ranges::begin(base_), count_};
29
  }
30
 
31
  constexpr auto begin() const requires range<const V> {
32
  if constexpr (sized_range<const V>) {
33
- if constexpr (random_access_range<const V>)
34
  return ranges::begin(base_);
35
- else {
36
- auto sz = size();
37
- return counted_iterator{ranges::begin(base_), sz};
 
 
 
 
 
 
 
38
  }
39
- } else
40
- return counted_iterator{ranges::begin(base_), count_};
41
  }
42
 
43
  constexpr auto end() requires (!simple-view<V>) {
44
  if constexpr (sized_range<V>) {
45
  if constexpr (random_access_range<V>)
46
- return ranges::begin(base_) + size();
47
  else
48
  return default_sentinel;
49
- } else
 
 
50
  return sentinel<false>{ranges::end(base_)};
51
  }
 
52
 
53
  constexpr auto end() const requires range<const V> {
54
  if constexpr (sized_range<const V>) {
55
  if constexpr (random_access_range<const V>)
56
- return ranges::begin(base_) + size();
57
  else
58
  return default_sentinel;
59
- } else
 
 
60
  return sentinel<true>{ranges::end(base_)};
61
  }
 
62
 
63
  constexpr auto size() requires sized_range<V> {
64
  auto n = ranges::size(base_);
65
  return ranges::min(n, static_cast<decltype(n)>(count_));
66
  }
@@ -69,18 +87,20 @@ namespace std::ranges {
69
  auto n = ranges::size(base_);
70
  return ranges::min(n, static_cast<decltype(n)>(count_));
71
  }
72
  };
73
 
74
- template<range R>
75
  take_view(R&&, range_difference_t<R>)
76
  -> take_view<views::all_t<R>>;
77
  }
78
  ```
79
 
80
  ``` cpp
81
- constexpr take_view(V base, range_difference_t<V> count);
82
  ```
83
 
 
 
84
  *Effects:* Initializes *base\_* with `std::move(base)` and *count\_*
85
  with `count`.
86
 
 
5
  template<view V>
6
  class take_view : public view_interface<take_view<V>> {
7
  private:
8
  V base_ = V(); // exposition only
9
  range_difference_t<V> count_ = 0; // exposition only
10
+
11
  // [range.take.sentinel], class template take_view::sentinel
12
+ template<bool> class sentinel; // exposition only
13
+
14
  public:
15
+ take_view() requires default_initializable<V> = default;
16
+ constexpr explicit take_view(V base, range_difference_t<V> count);
17
 
18
  constexpr V base() const & requires copy_constructible<V> { return base_; }
19
  constexpr V base() && { return std::move(base_); }
20
 
21
  constexpr auto begin() requires (!simple-view<V>) {
22
  if constexpr (sized_range<V>) {
23
+ if constexpr (random_access_range<V>) {
24
  return ranges::begin(base_);
25
+ } else {
26
+ auto sz = range_difference_t<V>(size());
27
+ return counted_iterator(ranges::begin(base_), sz);
28
+ }
29
+ } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
30
+ auto it = ranges::begin(base_);
31
+ auto sz = std::min(count_, ranges::end(base_) - it);
32
+ return counted_iterator(std::move(it), sz);
33
+ } else {
34
+ return counted_iterator(ranges::begin(base_), count_);
35
  }
 
 
36
  }
37
 
38
  constexpr auto begin() const requires range<const V> {
39
  if constexpr (sized_range<const V>) {
40
+ if constexpr (random_access_range<const V>) {
41
  return ranges::begin(base_);
42
+ } else {
43
+ auto sz = range_difference_t<const V>(size());
44
+ return counted_iterator(ranges::begin(base_), sz);
45
+ }
46
+ } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
47
+ auto it = ranges::begin(base_);
48
+ auto sz = std::min(count_, ranges::end(base_) - it);
49
+ return counted_iterator(std::move(it), sz);
50
+ } else {
51
+ return counted_iterator(ranges::begin(base_), count_);
52
  }
 
 
53
  }
54
 
55
  constexpr auto end() requires (!simple-view<V>) {
56
  if constexpr (sized_range<V>) {
57
  if constexpr (random_access_range<V>)
58
+ return ranges::begin(base_) + range_difference_t<V>(size());
59
  else
60
  return default_sentinel;
61
+ } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) {
62
+ return default_sentinel;
63
+ } else {
64
  return sentinel<false>{ranges::end(base_)};
65
  }
66
+ }
67
 
68
  constexpr auto end() const requires range<const V> {
69
  if constexpr (sized_range<const V>) {
70
  if constexpr (random_access_range<const V>)
71
+ return ranges::begin(base_) + range_difference_t<const V>(size());
72
  else
73
  return default_sentinel;
74
+ } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) {
75
+ return default_sentinel;
76
+ } else {
77
  return sentinel<true>{ranges::end(base_)};
78
  }
79
+ }
80
 
81
  constexpr auto size() requires sized_range<V> {
82
  auto n = ranges::size(base_);
83
  return ranges::min(n, static_cast<decltype(n)>(count_));
84
  }
 
87
  auto n = ranges::size(base_);
88
  return ranges::min(n, static_cast<decltype(n)>(count_));
89
  }
90
  };
91
 
92
+ template<class R>
93
  take_view(R&&, range_difference_t<R>)
94
  -> take_view<views::all_t<R>>;
95
  }
96
  ```
97
 
98
  ``` cpp
99
+ constexpr explicit take_view(V base, range_difference_t<V> count);
100
  ```
101
 
102
+ *Preconditions:* `count >= 0` is `true`.
103
+
104
  *Effects:* Initializes *base\_* with `std::move(base)` and *count\_*
105
  with `count`.
106