1 // Default predicates for internal use -*- C++ -*- 2 3 // Copyright (C) 2013-2021 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 operator_Iter_less_iter44 operator()(_Iterator1 __it1, _Iterator2 __it2) const 45 { return *__it1 < *__it2; } 46 }; 47 48 _GLIBCXX14_CONSTEXPR 49 inline _Iter_less_iter __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 _Iter_less_val_Iter_less_val63 _Iter_less_val(_Iter_less_iter) { } 64 65 template<typename _Iterator, typename _Value> 66 _GLIBCXX20_CONSTEXPR 67 bool operator_Iter_less_val68 operator()(_Iterator __it, _Value& __val) const 69 { return *__it < __val; } 70 }; 71 72 _GLIBCXX20_CONSTEXPR 73 inline _Iter_less_val __iter_less_val()74 __iter_less_val() 75 { return _Iter_less_val(); } 76 77 _GLIBCXX20_CONSTEXPR 78 inline _Iter_less_val __iter_comp_val(_Iter_less_iter)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 _Val_less_iter_Val_less_iter92 _Val_less_iter(_Iter_less_iter) { } 93 94 template<typename _Value, typename _Iterator> 95 _GLIBCXX20_CONSTEXPR 96 bool operator_Val_less_iter97 operator()(_Value& __val, _Iterator __it) const 98 { return __val < *__it; } 99 }; 100 101 _GLIBCXX20_CONSTEXPR 102 inline _Val_less_iter __val_less_iter()103 __val_less_iter() 104 { return _Val_less_iter(); } 105 106 _GLIBCXX20_CONSTEXPR 107 inline _Val_less_iter __val_comp_iter(_Iter_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 operator_Iter_equal_to_iter116 operator()(_Iterator1 __it1, _Iterator2 __it2) const 117 { return *__it1 == *__it2; } 118 }; 119 120 _GLIBCXX20_CONSTEXPR 121 inline _Iter_equal_to_iter __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 operator_Iter_equal_to_val130 operator()(_Iterator __it, _Value& __val) const 131 { return *__it == __val; } 132 }; 133 134 _GLIBCXX20_CONSTEXPR 135 inline _Iter_equal_to_val __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 __iter_comp_val(_Iter_equal_to_iter)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 _Iter_comp_iter_Iter_comp_iter150 _Iter_comp_iter(_Compare __comp) 151 : _M_comp(_GLIBCXX_MOVE(__comp)) 152 { } 153 154 template<typename _Iterator1, typename _Iterator2> 155 _GLIBCXX14_CONSTEXPR 156 bool operator_Iter_comp_iter157 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> __iter_comp_iter(_Compare __comp)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 _Iter_comp_val_Iter_comp_val174 _Iter_comp_val(_Compare __comp) 175 : _M_comp(_GLIBCXX_MOVE(__comp)) 176 { } 177 178 _GLIBCXX20_CONSTEXPR 179 explicit _Iter_comp_val_Iter_comp_val180 _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 _Iter_comp_val_Iter_comp_val187 _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 operator_Iter_comp_val195 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> __iter_comp_val(_Compare __comp)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> __iter_comp_val(_Iter_comp_iter<_Compare> __comp)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 _Val_comp_iter_Val_comp_iter218 _Val_comp_iter(_Compare __comp) 219 : _M_comp(_GLIBCXX_MOVE(__comp)) 220 { } 221 222 _GLIBCXX20_CONSTEXPR 223 explicit _Val_comp_iter_Val_comp_iter224 _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 _Val_comp_iter_Val_comp_iter231 _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 operator_Val_comp_iter239 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> __val_comp_iter(_Compare __comp)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> __val_comp_iter(_Iter_comp_iter<_Compare> __comp)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 _Iter_equals_val_Iter_equals_val262 _Iter_equals_val(_Value& __value) 263 : _M_value(__value) 264 { } 265 266 template<typename _Iterator> 267 _GLIBCXX20_CONSTEXPR 268 bool operator_Iter_equals_val269 operator()(_Iterator __it) 270 { return *__it == _M_value; } 271 }; 272 273 template<typename _Value> 274 _GLIBCXX20_CONSTEXPR 275 inline _Iter_equals_val<_Value> __iter_equals_val(_Value & __val)276 __iter_equals_val(_Value& __val) 277 { 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 _Iter_equals_iter_Iter_equals_iter286 _Iter_equals_iter(_Iterator1 __it1) 287 : _M_it1(__it1) 288 { } 289 290 template<typename _Iterator2> 291 _GLIBCXX20_CONSTEXPR 292 bool operator_Iter_equals_iter293 operator()(_Iterator2 __it2) 294 { return *__it2 == *_M_it1; } 295 }; 296 297 template<typename _Iterator> 298 _GLIBCXX20_CONSTEXPR 299 inline _Iter_equals_iter<_Iterator> __iter_comp_iter(_Iter_equal_to_iter,_Iterator __it)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 _Iter_pred_Iter_pred310 _Iter_pred(_Predicate __pred) 311 : _M_pred(_GLIBCXX_MOVE(__pred)) 312 { } 313 314 template<typename _Iterator> 315 _GLIBCXX20_CONSTEXPR 316 bool operator_Iter_pred317 operator()(_Iterator __it) 318 { return bool(_M_pred(*__it)); } 319 }; 320 321 template<typename _Predicate> 322 _GLIBCXX20_CONSTEXPR 323 inline _Iter_pred<_Predicate> __pred_iter(_Predicate __pred)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 _Iter_comp_to_val_Iter_comp_to_val334 _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 operator_Iter_comp_to_val341 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 __iter_comp_val(_Compare __comp,_Value & __val)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 _Iter_comp_to_iter_Iter_comp_to_iter360 _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 operator_Iter_comp_to_iter367 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> __iter_comp_iter(_Iter_comp_iter<_Compare> __comp,_Iterator __it)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 _Iter_negate_Iter_negate387 _Iter_negate(_Predicate __pred) 388 : _M_pred(_GLIBCXX_MOVE(__pred)) 389 { } 390 391 template<typename _Iterator> 392 _GLIBCXX20_CONSTEXPR 393 bool operator_Iter_negate394 operator()(_Iterator __it) 395 { return !bool(_M_pred(*__it)); } 396 }; 397 398 template<typename _Predicate> 399 _GLIBCXX20_CONSTEXPR 400 inline _Iter_negate<_Predicate> __negate(_Iter_pred<_Predicate> __pred)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 408