From Jason Turner

[move.iterator]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpwwz8kz94/{from.md → to.md} +32 -42
tmp/tmpwwz8kz94/{from.md → to.md} RENAMED
@@ -4,72 +4,62 @@
4
  namespace std {
5
  template<class Iterator>
6
  class move_iterator {
7
  public:
8
  using iterator_type = Iterator;
9
- using iterator_category = typename iterator_traits<Iterator>::iterator_category;
10
- using value_type = typename iterator_traits<Iterator>::value_type;
11
- using difference_type = typename iterator_traits<Iterator>::difference_type;
 
12
  using pointer = Iterator;
13
- using reference = see below;
14
 
15
  constexpr move_iterator();
16
  constexpr explicit move_iterator(Iterator i);
17
  template<class U> constexpr move_iterator(const move_iterator<U>& u);
18
  template<class U> constexpr move_iterator& operator=(const move_iterator<U>& u);
19
 
20
- constexpr iterator_type base() const;
 
21
  constexpr reference operator*() const;
22
- constexpr pointer operator->() const;
23
 
24
  constexpr move_iterator& operator++();
25
- constexpr move_iterator operator++(int);
26
  constexpr move_iterator& operator--();
27
  constexpr move_iterator operator--(int);
28
 
29
  constexpr move_iterator operator+(difference_type n) const;
30
  constexpr move_iterator& operator+=(difference_type n);
31
  constexpr move_iterator operator-(difference_type n) const;
32
  constexpr move_iterator& operator-=(difference_type n);
33
- constexpr unspecified operator[](difference_type n) const;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  private:
36
  Iterator current; // exposition only
37
  };
38
-
39
- template <class Iterator1, class Iterator2>
40
- constexpr bool operator==(
41
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
42
- template <class Iterator1, class Iterator2>
43
- constexpr bool operator!=(
44
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
45
- template <class Iterator1, class Iterator2>
46
- constexpr bool operator<(
47
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
48
- template <class Iterator1, class Iterator2>
49
- constexpr bool operator<=(
50
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
51
- template <class Iterator1, class Iterator2>
52
- constexpr bool operator>(
53
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
54
- template <class Iterator1, class Iterator2>
55
- constexpr bool operator>=(
56
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
57
-
58
- template <class Iterator1, class Iterator2>
59
- constexpr auto operator-(
60
- const move_iterator<Iterator1>& x,
61
- const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
62
- template <class Iterator>
63
- constexpr move_iterator<Iterator> operator+(
64
- typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
65
- template <class Iterator>
66
- constexpr move_iterator<Iterator> make_move_iterator(Iterator i);
67
  }
68
  ```
69
 
70
- Let `R` denote `iterator_traits<Iterator>::reference`. If
71
- `is_reference_v<R>` is `true`, the template specialization
72
- `move_iterator<Iterator>` shall define the nested type named `reference`
73
- as a synonym for `remove_reference_t<R>&&`, otherwise as a synonym for
74
- `R`.
 
75
 
 
4
  namespace std {
5
  template<class Iterator>
6
  class move_iterator {
7
  public:
8
  using iterator_type = Iterator;
9
+ using iterator_concept = input_iterator_tag;
10
+ using iterator_category = see below;
11
+ using value_type = iter_value_t<Iterator>;
12
+ using difference_type = iter_difference_t<Iterator>;
13
  using pointer = Iterator;
14
+ using reference = iter_rvalue_reference_t<Iterator>;
15
 
16
  constexpr move_iterator();
17
  constexpr explicit move_iterator(Iterator i);
18
  template<class U> constexpr move_iterator(const move_iterator<U>& u);
19
  template<class U> constexpr move_iterator& operator=(const move_iterator<U>& u);
20
 
21
+ constexpr iterator_type base() const &;
22
+ constexpr iterator_type base() &&;
23
  constexpr reference operator*() const;
 
24
 
25
  constexpr move_iterator& operator++();
26
+ constexpr auto operator++(int);
27
  constexpr move_iterator& operator--();
28
  constexpr move_iterator operator--(int);
29
 
30
  constexpr move_iterator operator+(difference_type n) const;
31
  constexpr move_iterator& operator+=(difference_type n);
32
  constexpr move_iterator operator-(difference_type n) const;
33
  constexpr move_iterator& operator-=(difference_type n);
34
+ constexpr reference operator[](difference_type n) const;
35
+
36
+ template<sentinel_for<Iterator> S>
37
+ friend constexpr bool
38
+ operator==(const move_iterator& x, const move_sentinel<S>& y);
39
+ template<sized_sentinel_for<Iterator> S>
40
+ friend constexpr iter_difference_t<Iterator>
41
+ operator-(const move_sentinel<S>& x, const move_iterator& y);
42
+ template<sized_sentinel_for<Iterator> S>
43
+ friend constexpr iter_difference_t<Iterator>
44
+ operator-(const move_iterator& x, const move_sentinel<S>& y);
45
+ friend constexpr iter_rvalue_reference_t<Iterator>
46
+ iter_move(const move_iterator& i)
47
+ noexcept(noexcept(ranges::iter_move(i.current)));
48
+ template<indirectly_swappable<Iterator> Iterator2>
49
+ friend constexpr void
50
+ iter_swap(const move_iterator& x, const move_iterator<Iterator2>& y)
51
+ noexcept(noexcept(ranges::iter_swap(x.current, y.current)));
52
 
53
  private:
54
  Iterator current; // exposition only
55
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
  ```
58
 
59
+ The member *typedef-name* `iterator_category` denotes
60
+
61
+ - `random_access_iterator_tag` if the type
62
+ `iterator_traits<{}Iterator>::iterator_category` models
63
+ `derived_from<random_access_iterator_tag>`, and
64
+ - `iterator_traits<{}Iterator>::iterator_category` otherwise.
65