From Jason Turner

[range.elements.view]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpt1l22jj2/{from.md → to.md} +65 -0
tmp/tmpt1l22jj2/{from.md → to.md} RENAMED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `elements_view` <a id="range.elements.view">[[range.elements.view]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<class T, size_t N>
6
+ concept has-tuple-element = // exposition only
7
+ requires(T t) {
8
+ typename tuple_size<T>::type;
9
+ requires N < tuple_size_v<T>;
10
+ typename tuple_element_t<N, T>;
11
+ { get<N>(t) } -> convertible_to<const tuple_element_t<N, T>&>;
12
+ };
13
+
14
+
15
+ template<input_range V, size_t N>
16
+ requires view<V> && has-tuple-element<range_value_t<V>, N> &&
17
+ has-tuple-element<remove_reference_t<range_reference_t<V>>, N>
18
+ class elements_view : public view_interface<elements_view<V, N>> {
19
+ public:
20
+ elements_view() = default;
21
+ constexpr explicit elements_view(V base);
22
+
23
+ constexpr V base() const& requires copy_constructible<V> { return base_; }
24
+ constexpr V base() && { return std::move(base_); }
25
+
26
+ constexpr auto begin() requires (!simple-view<V>)
27
+ { return iterator<false>(ranges::begin(base_)); }
28
+
29
+ constexpr auto begin() const requires simple-view<V>
30
+ { return iterator<true>(ranges::begin(base_)); }
31
+
32
+ constexpr auto end()
33
+ { return sentinel<false>{ranges::end(base_)}; }
34
+
35
+ constexpr auto end() requires common_range<V>
36
+ { return iterator<false>{ranges::end(base_)}; }
37
+
38
+ constexpr auto end() const requires range<const V>
39
+ { return sentinel<true>{ranges::end(base_)}; }
40
+
41
+ constexpr auto end() const requires common_range<const V>
42
+ { return iterator<true>{ranges::end(base_)}; }
43
+
44
+ constexpr auto size() requires sized_range<V>
45
+ { return ranges::size(base_); }
46
+
47
+ constexpr auto size() const requires sized_range<const V>
48
+ { return ranges::size(base_); }
49
+
50
+ private:
51
+ // [range.elements.iterator], class template elements_view::iterator
52
+ template<bool> struct iterator; // exposition only
53
+ // [range.elements.sentinel], class template elements_view::sentinel
54
+ template<bool> struct sentinel; // exposition only
55
+ V base_ = V(); // exposition only
56
+ };
57
+ }
58
+ ```
59
+
60
+ ``` cpp
61
+ constexpr explicit elements_view(V base);
62
+ ```
63
+
64
+ *Effects:* Initializes *base\_* with `std::move(base)`.
65
+