annotate libcxx/include/__algorithm/iterator_operations.h @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
1 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
2 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
6 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
8
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
9 #ifndef _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
10 #define _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
11
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
12 #include <__algorithm/iter_swap.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
13 #include <__algorithm/ranges_iterator_concept.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
14 #include <__config>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
15 #include <__iterator/advance.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
16 #include <__iterator/distance.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
17 #include <__iterator/incrementable_traits.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
18 #include <__iterator/iter_move.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
19 #include <__iterator/iter_swap.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
20 #include <__iterator/iterator_traits.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
21 #include <__iterator/next.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
22 #include <__iterator/prev.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
23 #include <__iterator/readable_traits.h>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
24 #include <__type_traits/enable_if.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
25 #include <__type_traits/is_reference.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
26 #include <__type_traits/is_same.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
27 #include <__type_traits/remove_cvref.h>
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
28 #include <__utility/declval.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
29 #include <__utility/forward.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
30 #include <__utility/move.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
31
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
32 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
33 # pragma GCC system_header
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
34 #endif
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
35
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
36 _LIBCPP_PUSH_MACROS
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
37 #include <__undef_macros>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
38
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
39 _LIBCPP_BEGIN_NAMESPACE_STD
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
40
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
41 template <class _AlgPolicy> struct _IterOps;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
43 #if _LIBCPP_STD_VER >= 20
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
44 struct _RangeAlgPolicy {};
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
45
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
46 template <>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
47 struct _IterOps<_RangeAlgPolicy> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
48
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
49 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
50 using __value_type = iter_value_t<_Iter>;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
51
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
52 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
53 using __iterator_category = ranges::__iterator_concept<_Iter>;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
54
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
55 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
56 using __difference_type = iter_difference_t<_Iter>;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
57
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
58 static constexpr auto advance = ranges::advance;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
59 static constexpr auto distance = ranges::distance;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
60 static constexpr auto __iter_move = ranges::iter_move;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
61 static constexpr auto iter_swap = ranges::iter_swap;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
62 static constexpr auto next = ranges::next;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
63 static constexpr auto prev = ranges::prev;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
64 static constexpr auto __advance_to = ranges::advance;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
65 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
66
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
67 #endif
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
68
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
69 struct _ClassicAlgPolicy {};
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
70
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
71 template <>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
72 struct _IterOps<_ClassicAlgPolicy> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
73
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
74 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
75 using __value_type = typename iterator_traits<_Iter>::value_type;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
76
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
77 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
78 using __iterator_category = typename iterator_traits<_Iter>::iterator_category;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
79
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
80 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
81 using __difference_type = typename iterator_traits<_Iter>::difference_type;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
82
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
83 // advance
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
84 template <class _Iter, class _Distance>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
85 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
86 static void advance(_Iter& __iter, _Distance __count) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
87 std::advance(__iter, __count);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
88 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
89
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
90 // distance
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
91 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
92 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
93 static typename iterator_traits<_Iter>::difference_type distance(_Iter __first, _Iter __last) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
94 return std::distance(__first, __last);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
95 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
96
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
97 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
98 using __deref_t = decltype(*std::declval<_Iter&>());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
99
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
100 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
101 using __move_t = decltype(std::move(*std::declval<_Iter&>()));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
102
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
103 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
104 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
105 static void __validate_iter_reference() {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
106 static_assert(is_same<__deref_t<_Iter>, typename iterator_traits<__remove_cvref_t<_Iter> >::reference>::value,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
107 "It looks like your iterator's `iterator_traits<It>::reference` does not match the return type of "
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
108 "dereferencing the iterator, i.e., calling `*it`. This is undefined behavior according to [input.iterators] "
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
109 "and can lead to dangling reference issues at runtime, so we are flagging this.");
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
110 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
111
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
112 // iter_move
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
113 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
114 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
115 // If the result of dereferencing `_Iter` is a reference type, deduce the result of calling `std::move` on it. Note
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
116 // that the C++03 mode doesn't support `decltype(auto)` as the return type.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
117 __enable_if_t<
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
118 is_reference<__deref_t<_Iter> >::value,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
119 __move_t<_Iter> >
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
120 __iter_move(_Iter&& __i) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
121 __validate_iter_reference<_Iter>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
122
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
123 return std::move(*std::forward<_Iter>(__i));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
124 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
125
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
126 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
127 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
128 // If the result of dereferencing `_Iter` is a value type, deduce the return value of this function to also be a
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
129 // value -- otherwise, after `operator*` returns a temporary, this function would return a dangling reference to that
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
130 // temporary. Note that the C++03 mode doesn't support `auto` as the return type.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
131 __enable_if_t<
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
132 !is_reference<__deref_t<_Iter> >::value,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
133 __deref_t<_Iter> >
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
134 __iter_move(_Iter&& __i) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
135 __validate_iter_reference<_Iter>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
136
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
137 return *std::forward<_Iter>(__i);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
138 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
139
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
140 // iter_swap
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
141 template <class _Iter1, class _Iter2>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
142 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
143 static void iter_swap(_Iter1&& __a, _Iter2&& __b) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
144 std::iter_swap(std::forward<_Iter1>(__a), std::forward<_Iter2>(__b));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
145 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
146
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
147 // next
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
148 template <class _Iterator>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
149 _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
150 _Iterator next(_Iterator, _Iterator __last) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
151 return __last;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
152 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
153
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
154 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
155 _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
156 __remove_cvref_t<_Iter> next(_Iter&& __it,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
157 typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
158 return std::next(std::forward<_Iter>(__it), __n);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
159 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
160
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
161 // prev
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
162 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
163 _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
164 __remove_cvref_t<_Iter> prev(_Iter&& __iter,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
165 typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
166 return std::prev(std::forward<_Iter>(__iter), __n);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
167 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
168
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
169 template <class _Iter>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
170 _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
171 void __advance_to(_Iter& __first, _Iter __last) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
172 __first = __last;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
173 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
174 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
175
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
176 _LIBCPP_END_NAMESPACE_STD
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
177
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
178 _LIBCPP_POP_MACROS
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
179
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
180 #endif // _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H