From Jason Turner

[range.chunk.view.fwd]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp4h7cfbh9/{from.md → to.md} +75 -0
tmp/tmp4h7cfbh9/{from.md → to.md} RENAMED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `chunk_view` for forward ranges <a id="range.chunk.view.fwd">[[range.chunk.view.fwd]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<view V>
6
+ requires forward_range<V>
7
+ class chunk_view<V> : public view_interface<chunk_view<V>> {
8
+ V base_; // exposition only
9
+ range_difference_t<V> n_; // exposition only
10
+
11
+ // [range.chunk.fwd.iter], class template chunk_view::iterator
12
+ template<bool> class iterator; // exposition only
13
+
14
+ public:
15
+ constexpr explicit chunk_view(V base, range_difference_t<V> n);
16
+
17
+ constexpr V base() const & requires copy_constructible<V> { return base_; }
18
+ constexpr V base() && { return std::move(base_); }
19
+
20
+ constexpr auto begin() requires (!simple-view<V>) {
21
+ return iterator<false>(this, ranges::begin(base_));
22
+ }
23
+
24
+ constexpr auto begin() const requires forward_range<const V> {
25
+ return iterator<true>(this, ranges::begin(base_));
26
+ }
27
+
28
+ constexpr auto end() requires (!simple-view<V>) {
29
+ if constexpr (common_range<V> && sized_range<V>) {
30
+ auto missing = (n_ - ranges::distance(base_) % n_) % n_;
31
+ return iterator<false>(this, ranges::end(base_), missing);
32
+ } else if constexpr (common_range<V> && !bidirectional_range<V>) {
33
+ return iterator<false>(this, ranges::end(base_));
34
+ } else {
35
+ return default_sentinel;
36
+ }
37
+ }
38
+
39
+ constexpr auto end() const requires forward_range<const V> {
40
+ if constexpr (common_range<const V> && sized_range<const V>) {
41
+ auto missing = (n_ - ranges::distance(base_) % n_) % n_;
42
+ return iterator<true>(this, ranges::end(base_), missing);
43
+ } else if constexpr (common_range<const V> && !bidirectional_range<const V>) {
44
+ return iterator<true>(this, ranges::end(base_));
45
+ } else {
46
+ return default_sentinel;
47
+ }
48
+ }
49
+
50
+ constexpr auto size() requires sized_range<V>;
51
+ constexpr auto size() const requires sized_range<const V>;
52
+ };
53
+ }
54
+ ```
55
+
56
+ ``` cpp
57
+ constexpr explicit chunk_view(V base, range_difference_t<V> n);
58
+ ```
59
+
60
+ *Preconditions:* `n > 0` is `true`.
61
+
62
+ *Effects:* Initializes *base\_* with `std::move(base)` and *n\_* with
63
+ `n`.
64
+
65
+ ``` cpp
66
+ constexpr auto size() requires sized_range<V>;
67
+ constexpr auto size() const requires sized_range<const V>;
68
+ ```
69
+
70
+ *Effects:* Equivalent to:
71
+
72
+ ``` cpp
73
+ return to-unsigned-like(div-ceil(ranges::distance(base_), n_));
74
+ ```
75
+