Line data Source code
1 : // Default predicates for internal use -*- C++ -*-
2 :
3 : // Copyright (C) 2013-2022 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /** @file predefined_ops.h
26 : * This is an internal header file, included by other library headers.
27 : * You should not attempt to use it directly. @headername{algorithm}
28 : */
29 :
30 : #ifndef _GLIBCXX_PREDEFINED_OPS_H
31 : #define _GLIBCXX_PREDEFINED_OPS_H 1
32 :
33 : #include <bits/move.h>
34 :
35 : namespace __gnu_cxx
36 : {
37 : namespace __ops
38 : {
39 : struct _Iter_less_iter
40 : {
41 : template<typename _Iterator1, typename _Iterator2>
42 : _GLIBCXX14_CONSTEXPR
43 : bool
44 : operator()(_Iterator1 __it1, _Iterator2 __it2) const
45 : { return *__it1 < *__it2; }
46 : };
47 :
48 : _GLIBCXX14_CONSTEXPR
49 : inline _Iter_less_iter
50 : __iter_less_iter()
51 : { return _Iter_less_iter(); }
52 :
53 : struct _Iter_less_val
54 : {
55 : #if __cplusplus >= 201103L
56 : constexpr _Iter_less_val() = default;
57 : #else
58 : _Iter_less_val() { }
59 : #endif
60 :
61 : _GLIBCXX20_CONSTEXPR
62 : explicit
63 : _Iter_less_val(_Iter_less_iter) { }
64 :
65 : template<typename _Iterator, typename _Value>
66 : _GLIBCXX20_CONSTEXPR
67 : bool
68 : operator()(_Iterator __it, _Value& __val) const
69 : { return *__it < __val; }
70 : };
71 :
72 : _GLIBCXX20_CONSTEXPR
73 : inline _Iter_less_val
74 : __iter_less_val()
75 : { return _Iter_less_val(); }
76 :
77 : _GLIBCXX20_CONSTEXPR
78 : inline _Iter_less_val
79 : __iter_comp_val(_Iter_less_iter)
80 : { return _Iter_less_val(); }
81 :
82 : struct _Val_less_iter
83 : {
84 : #if __cplusplus >= 201103L
85 : constexpr _Val_less_iter() = default;
86 : #else
87 : _Val_less_iter() { }
88 : #endif
89 :
90 : _GLIBCXX20_CONSTEXPR
91 : explicit
92 : _Val_less_iter(_Iter_less_iter) { }
93 :
94 : template<typename _Value, typename _Iterator>
95 : _GLIBCXX20_CONSTEXPR
96 : bool
97 : operator()(_Value& __val, _Iterator __it) const
98 : { return __val < *__it; }
99 : };
100 :
101 : _GLIBCXX20_CONSTEXPR
102 : inline _Val_less_iter
103 : __val_less_iter()
104 : { return _Val_less_iter(); }
105 :
106 : _GLIBCXX20_CONSTEXPR
107 : inline _Val_less_iter
108 : __val_comp_iter(_Iter_less_iter)
109 : { return _Val_less_iter(); }
110 :
111 : struct _Iter_equal_to_iter
112 : {
113 : template<typename _Iterator1, typename _Iterator2>
114 : _GLIBCXX20_CONSTEXPR
115 : bool
116 : operator()(_Iterator1 __it1, _Iterator2 __it2) const
117 : { return *__it1 == *__it2; }
118 : };
119 :
120 : _GLIBCXX20_CONSTEXPR
121 : inline _Iter_equal_to_iter
122 : __iter_equal_to_iter()
123 : { return _Iter_equal_to_iter(); }
124 :
125 : struct _Iter_equal_to_val
126 : {
127 : template<typename _Iterator, typename _Value>
128 : _GLIBCXX20_CONSTEXPR
129 : bool
130 : operator()(_Iterator __it, _Value& __val) const
131 : { return *__it == __val; }
132 : };
133 :
134 : _GLIBCXX20_CONSTEXPR
135 : inline _Iter_equal_to_val
136 : __iter_equal_to_val()
137 : { return _Iter_equal_to_val(); }
138 :
139 : _GLIBCXX20_CONSTEXPR
140 : inline _Iter_equal_to_val
141 : __iter_comp_val(_Iter_equal_to_iter)
142 : { return _Iter_equal_to_val(); }
143 :
144 : template<typename _Compare>
145 : struct _Iter_comp_iter
146 : {
147 : _Compare _M_comp;
148 :
149 : explicit _GLIBCXX14_CONSTEXPR
150 : _Iter_comp_iter(_Compare __comp)
151 : : _M_comp(_GLIBCXX_MOVE(__comp))
152 : { }
153 :
154 : template<typename _Iterator1, typename _Iterator2>
155 : _GLIBCXX14_CONSTEXPR
156 : bool
157 : operator()(_Iterator1 __it1, _Iterator2 __it2)
158 : { return bool(_M_comp(*__it1, *__it2)); }
159 : };
160 :
161 : template<typename _Compare>
162 : _GLIBCXX14_CONSTEXPR
163 : inline _Iter_comp_iter<_Compare>
164 : __iter_comp_iter(_Compare __comp)
165 : { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
166 :
167 : template<typename _Compare>
168 : struct _Iter_comp_val
169 : {
170 : _Compare _M_comp;
171 :
172 : _GLIBCXX20_CONSTEXPR
173 : explicit
174 : _Iter_comp_val(_Compare __comp)
175 : : _M_comp(_GLIBCXX_MOVE(__comp))
176 : { }
177 :
178 : _GLIBCXX20_CONSTEXPR
179 : explicit
180 : _Iter_comp_val(const _Iter_comp_iter<_Compare>& __comp)
181 : : _M_comp(__comp._M_comp)
182 : { }
183 :
184 : #if __cplusplus >= 201103L
185 : _GLIBCXX20_CONSTEXPR
186 : explicit
187 : _Iter_comp_val(_Iter_comp_iter<_Compare>&& __comp)
188 : : _M_comp(std::move(__comp._M_comp))
189 : { }
190 : #endif
191 :
192 : template<typename _Iterator, typename _Value>
193 : _GLIBCXX20_CONSTEXPR
194 : bool
195 : operator()(_Iterator __it, _Value& __val)
196 : { return bool(_M_comp(*__it, __val)); }
197 : };
198 :
199 : template<typename _Compare>
200 : _GLIBCXX20_CONSTEXPR
201 : inline _Iter_comp_val<_Compare>
202 : __iter_comp_val(_Compare __comp)
203 : { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
204 :
205 : template<typename _Compare>
206 : _GLIBCXX20_CONSTEXPR
207 : inline _Iter_comp_val<_Compare>
208 : __iter_comp_val(_Iter_comp_iter<_Compare> __comp)
209 : { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
210 :
211 : template<typename _Compare>
212 : struct _Val_comp_iter
213 : {
214 : _Compare _M_comp;
215 :
216 : _GLIBCXX20_CONSTEXPR
217 : explicit
218 : _Val_comp_iter(_Compare __comp)
219 : : _M_comp(_GLIBCXX_MOVE(__comp))
220 : { }
221 :
222 : _GLIBCXX20_CONSTEXPR
223 : explicit
224 : _Val_comp_iter(const _Iter_comp_iter<_Compare>& __comp)
225 : : _M_comp(__comp._M_comp)
226 : { }
227 :
228 : #if __cplusplus >= 201103L
229 : _GLIBCXX20_CONSTEXPR
230 : explicit
231 : _Val_comp_iter(_Iter_comp_iter<_Compare>&& __comp)
232 : : _M_comp(std::move(__comp._M_comp))
233 : { }
234 : #endif
235 :
236 : template<typename _Value, typename _Iterator>
237 : _GLIBCXX20_CONSTEXPR
238 : bool
239 : operator()(_Value& __val, _Iterator __it)
240 : { return bool(_M_comp(__val, *__it)); }
241 : };
242 :
243 : template<typename _Compare>
244 : _GLIBCXX20_CONSTEXPR
245 : inline _Val_comp_iter<_Compare>
246 : __val_comp_iter(_Compare __comp)
247 : { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
248 :
249 : template<typename _Compare>
250 : _GLIBCXX20_CONSTEXPR
251 : inline _Val_comp_iter<_Compare>
252 : __val_comp_iter(_Iter_comp_iter<_Compare> __comp)
253 : { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
254 :
255 : template<typename _Value>
256 : struct _Iter_equals_val
257 : {
258 : _Value& _M_value;
259 :
260 : _GLIBCXX20_CONSTEXPR
261 : explicit
262 42 : _Iter_equals_val(_Value& __value)
263 : : _M_value(__value)
264 : { }
265 :
266 : template<typename _Iterator>
267 : _GLIBCXX20_CONSTEXPR
268 : bool
269 732 : operator()(_Iterator __it)
270 207 : { return *__it == _M_value; }
271 : };
272 :
273 : template<typename _Value>
274 : _GLIBCXX20_CONSTEXPR
275 : inline _Iter_equals_val<_Value>
276 42 : __iter_equals_val(_Value& __val)
277 42 : { return _Iter_equals_val<_Value>(__val); }
278 :
279 : template<typename _Iterator1>
280 : struct _Iter_equals_iter
281 : {
282 : _Iterator1 _M_it1;
283 :
284 : _GLIBCXX20_CONSTEXPR
285 : explicit
286 : _Iter_equals_iter(_Iterator1 __it1)
287 : : _M_it1(__it1)
288 : { }
289 :
290 : template<typename _Iterator2>
291 : _GLIBCXX20_CONSTEXPR
292 : bool
293 : operator()(_Iterator2 __it2)
294 : { return *__it2 == *_M_it1; }
295 : };
296 :
297 : template<typename _Iterator>
298 : _GLIBCXX20_CONSTEXPR
299 : inline _Iter_equals_iter<_Iterator>
300 : __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
301 : { return _Iter_equals_iter<_Iterator>(__it); }
302 :
303 : template<typename _Predicate>
304 : struct _Iter_pred
305 : {
306 : _Predicate _M_pred;
307 :
308 : _GLIBCXX20_CONSTEXPR
309 : explicit
310 : _Iter_pred(_Predicate __pred)
311 : : _M_pred(_GLIBCXX_MOVE(__pred))
312 : { }
313 :
314 : template<typename _Iterator>
315 : _GLIBCXX20_CONSTEXPR
316 : bool
317 : operator()(_Iterator __it)
318 : { return bool(_M_pred(*__it)); }
319 : };
320 :
321 : template<typename _Predicate>
322 : _GLIBCXX20_CONSTEXPR
323 : inline _Iter_pred<_Predicate>
324 : __pred_iter(_Predicate __pred)
325 : { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); }
326 :
327 : template<typename _Compare, typename _Value>
328 : struct _Iter_comp_to_val
329 : {
330 : _Compare _M_comp;
331 : _Value& _M_value;
332 :
333 : _GLIBCXX20_CONSTEXPR
334 : _Iter_comp_to_val(_Compare __comp, _Value& __value)
335 : : _M_comp(_GLIBCXX_MOVE(__comp)), _M_value(__value)
336 : { }
337 :
338 : template<typename _Iterator>
339 : _GLIBCXX20_CONSTEXPR
340 : bool
341 : operator()(_Iterator __it)
342 : { return bool(_M_comp(*__it, _M_value)); }
343 : };
344 :
345 : template<typename _Compare, typename _Value>
346 : _Iter_comp_to_val<_Compare, _Value>
347 : _GLIBCXX20_CONSTEXPR
348 : __iter_comp_val(_Compare __comp, _Value &__val)
349 : {
350 : return _Iter_comp_to_val<_Compare, _Value>(_GLIBCXX_MOVE(__comp), __val);
351 : }
352 :
353 : template<typename _Compare, typename _Iterator1>
354 : struct _Iter_comp_to_iter
355 : {
356 : _Compare _M_comp;
357 : _Iterator1 _M_it1;
358 :
359 : _GLIBCXX20_CONSTEXPR
360 : _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
361 : : _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1)
362 : { }
363 :
364 : template<typename _Iterator2>
365 : _GLIBCXX20_CONSTEXPR
366 : bool
367 : operator()(_Iterator2 __it2)
368 : { return bool(_M_comp(*__it2, *_M_it1)); }
369 : };
370 :
371 : template<typename _Compare, typename _Iterator>
372 : _GLIBCXX20_CONSTEXPR
373 : inline _Iter_comp_to_iter<_Compare, _Iterator>
374 : __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
375 : {
376 : return _Iter_comp_to_iter<_Compare, _Iterator>(
377 : _GLIBCXX_MOVE(__comp._M_comp), __it);
378 : }
379 :
380 : template<typename _Predicate>
381 : struct _Iter_negate
382 : {
383 : _Predicate _M_pred;
384 :
385 : _GLIBCXX20_CONSTEXPR
386 : explicit
387 : _Iter_negate(_Predicate __pred)
388 : : _M_pred(_GLIBCXX_MOVE(__pred))
389 : { }
390 :
391 : template<typename _Iterator>
392 : _GLIBCXX20_CONSTEXPR
393 : bool
394 : operator()(_Iterator __it)
395 : { return !bool(_M_pred(*__it)); }
396 : };
397 :
398 : template<typename _Predicate>
399 : _GLIBCXX20_CONSTEXPR
400 : inline _Iter_negate<_Predicate>
401 : __negate(_Iter_pred<_Predicate> __pred)
402 : { return _Iter_negate<_Predicate>(_GLIBCXX_MOVE(__pred._M_pred)); }
403 :
404 : } // namespace __ops
405 : } // namespace __gnu_cxx
406 :
407 : #endif
|