From Jason Turner

[range.adjacent.transform.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpamaoneqz/{from.md → to.md} +77 -0
tmp/tmpamaoneqz/{from.md → to.md} RENAMED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `adjacent_transform_view` <a id="range.adjacent.transform.view">[[range.adjacent.transform.view]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<forward_range V, move_constructible F, size_t N>
6
+ requires view<V> && (N > 0) && is_object_v<F> &&
7
+ regular_invocable<F&, REPEAT(range_reference_t<V>, N)...> &&
8
+ can-reference<invoke_result_t<F&, REPEAT(range_reference_t<V>, N)...>>
9
+ class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>> {
10
+ movable-box<F> fun_; // exposition only
11
+ adjacent_view<V, N> inner_; // exposition only
12
+
13
+ using InnerView = adjacent_view<V, N>; // exposition only
14
+ template<bool Const>
15
+ using inner-iterator = iterator_t<maybe-const<Const, InnerView>>; // exposition only
16
+ template<bool Const>
17
+ using inner-sentinel = sentinel_t<maybe-const<Const, InnerView>>; // exposition only
18
+
19
+ // [range.adjacent.transform.iterator], class template adjacent_transform_view::iterator
20
+ template<bool> class iterator; // exposition only
21
+
22
+ // [range.adjacent.transform.sentinel], class template adjacent_transform_view::sentinel
23
+ template<bool> class sentinel; // exposition only
24
+
25
+ public:
26
+ adjacent_transform_view() = default;
27
+ constexpr explicit adjacent_transform_view(V base, F fun);
28
+
29
+ constexpr V base() const & requires copy_constructible<InnerView> { return inner_.base(); }
30
+ constexpr V base() && { return std::move(inner_).base(); }
31
+
32
+ constexpr auto begin() {
33
+ return iterator<false>(*this, inner_.begin());
34
+ }
35
+
36
+ constexpr auto begin() const
37
+ requires range<const InnerView> &&
38
+ regular_invocable<const F&, REPEAT(range_reference_t<const V>, N)...> {
39
+ return iterator<true>(*this, inner_.begin());
40
+ }
41
+
42
+ constexpr auto end() {
43
+ if constexpr (common_range<InnerView>) {
44
+ return iterator<false>(*this, inner_.end());
45
+ } else {
46
+ return sentinel<false>(inner_.end());
47
+ }
48
+ }
49
+
50
+ constexpr auto end() const
51
+ requires range<const InnerView> &&
52
+ regular_invocable<const F&, REPEAT(range_reference_t<const V>, N)...> {
53
+ if constexpr (common_range<const InnerView>) {
54
+ return iterator<true>(*this, inner_.end());
55
+ } else {
56
+ return sentinel<true>(inner_.end());
57
+ }
58
+ }
59
+
60
+ constexpr auto size() requires sized_range<InnerView> {
61
+ return inner_.size();
62
+ }
63
+
64
+ constexpr auto size() const requires sized_range<const InnerView> {
65
+ return inner_.size();
66
+ }
67
+ };
68
+ }
69
+ ```
70
+
71
+ ``` cpp
72
+ constexpr explicit adjacent_transform_view(V base, F fun);
73
+ ```
74
+
75
+ *Effects:* Initializes *fun\_* with `std::move(fun)` and *inner\_* with
76
+ `std::move(base)`.
77
+