From Jason Turner

[range.adjacent.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpxnkzpixu/{from.md → to.md} +75 -0
tmp/tmpxnkzpixu/{from.md → to.md} RENAMED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `adjacent_view` <a id="range.adjacent.view">[[range.adjacent.view]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<forward_range V, size_t N>
6
+ requires view<V> && (N > 0)
7
+ class adjacent_view : public view_interface<adjacent_view<V, N>> {
8
+ V base_ = V(); // exposition only
9
+
10
+ // [range.adjacent.iterator], class template adjacent_view::iterator
11
+ template<bool> class iterator; // exposition only
12
+
13
+ // [range.adjacent.sentinel], class template adjacent_view::sentinel
14
+ template<bool> class sentinel; // exposition only
15
+
16
+ struct as-sentinel{}; // exposition only
17
+
18
+ public:
19
+ adjacent_view() requires default_initializable<V> = default;
20
+ constexpr explicit adjacent_view(V base);
21
+
22
+ constexpr V base() const & requires copy_constructible<V> { return base_; }
23
+ constexpr V base() && { return std::move(base_); }
24
+
25
+ constexpr auto begin() requires (!simple-view<V>) {
26
+ return iterator<false>(ranges::begin(base_), ranges::end(base_));
27
+ }
28
+
29
+ constexpr auto begin() const requires range<const V> {
30
+ return iterator<true>(ranges::begin(base_), ranges::end(base_));
31
+ }
32
+
33
+ constexpr auto end() requires (!simple-view<V>) {
34
+ if constexpr (common_range<V>) {
35
+ return iterator<false>(as-sentinel{}, ranges::begin(base_), ranges::end(base_));
36
+ } else {
37
+ return sentinel<false>(ranges::end(base_));
38
+ }
39
+ }
40
+
41
+ constexpr auto end() const requires range<const V> {
42
+ if constexpr (common_range<const V>) {
43
+ return iterator<true>(as-sentinel{}, ranges::begin(base_), ranges::end(base_));
44
+ } else {
45
+ return sentinel<true>(ranges::end(base_));
46
+ }
47
+ }
48
+
49
+ constexpr auto size() requires sized_range<V>;
50
+ constexpr auto size() const requires sized_range<const V>;
51
+ };
52
+ }
53
+ ```
54
+
55
+ ``` cpp
56
+ constexpr explicit adjacent_view(V base);
57
+ ```
58
+
59
+ *Effects:* Initializes *base\_* with `std::move(base)`.
60
+
61
+ ``` cpp
62
+ constexpr auto size() requires sized_range<V>;
63
+ constexpr auto size() const requires sized_range<const V>;
64
+ ```
65
+
66
+ *Effects:* Equivalent to:
67
+
68
+ ``` cpp
69
+ using ST = decltype(ranges::size(base_));
70
+ using CT = common_type_t<ST, size_t>;
71
+ auto sz = static_cast<CT>(ranges::size(base_));
72
+ sz -= std::min<CT>(sz, N - 1);
73
+ return static_cast<ST>(sz);
74
+ ```
75
+