OLD | NEW |
(Empty) | |
| 1 // -*- C++ -*- |
| 2 //===-------------------------- algorithm ---------------------------------===// |
| 3 // |
| 4 // The LLVM Compiler Infrastructure |
| 5 // |
| 6 // This file is dual licensed under the MIT and the University of Illinois Open |
| 7 // Source Licenses. See LICENSE.TXT for details. |
| 8 // |
| 9 //===----------------------------------------------------------------------===// |
| 10 |
| 11 #ifndef _LIBCPP_ALGORITHM |
| 12 #define _LIBCPP_ALGORITHM |
| 13 |
| 14 /* |
| 15 algorithm synopsis |
| 16 |
| 17 #include <initializer_list> |
| 18 |
| 19 namespace std |
| 20 { |
| 21 |
| 22 template <class InputIterator, class Predicate> |
| 23 bool |
| 24 all_of(InputIterator first, InputIterator last, Predicate pred); |
| 25 |
| 26 template <class InputIterator, class Predicate> |
| 27 bool |
| 28 any_of(InputIterator first, InputIterator last, Predicate pred); |
| 29 |
| 30 template <class InputIterator, class Predicate> |
| 31 bool |
| 32 none_of(InputIterator first, InputIterator last, Predicate pred); |
| 33 |
| 34 template <class InputIterator, class Function> |
| 35 Function |
| 36 for_each(InputIterator first, InputIterator last, Function f); |
| 37 |
| 38 template <class InputIterator, class T> |
| 39 InputIterator |
| 40 find(InputIterator first, InputIterator last, const T& value); |
| 41 |
| 42 template <class InputIterator, class Predicate> |
| 43 InputIterator |
| 44 find_if(InputIterator first, InputIterator last, Predicate pred); |
| 45 |
| 46 template<class InputIterator, class Predicate> |
| 47 InputIterator |
| 48 find_if_not(InputIterator first, InputIterator last, Predicate pred); |
| 49 |
| 50 template <class ForwardIterator1, class ForwardIterator2> |
| 51 ForwardIterator1 |
| 52 find_end(ForwardIterator1 first1, ForwardIterator1 last1, |
| 53 ForwardIterator2 first2, ForwardIterator2 last2); |
| 54 |
| 55 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> |
| 56 ForwardIterator1 |
| 57 find_end(ForwardIterator1 first1, ForwardIterator1 last1, |
| 58 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pr
ed); |
| 59 |
| 60 template <class ForwardIterator1, class ForwardIterator2> |
| 61 ForwardIterator1 |
| 62 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, |
| 63 ForwardIterator2 first2, ForwardIterator2 last2); |
| 64 |
| 65 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> |
| 66 ForwardIterator1 |
| 67 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, |
| 68 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredica
te pred); |
| 69 |
| 70 template <class ForwardIterator> |
| 71 ForwardIterator |
| 72 adjacent_find(ForwardIterator first, ForwardIterator last); |
| 73 |
| 74 template <class ForwardIterator, class BinaryPredicate> |
| 75 ForwardIterator |
| 76 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate p
red); |
| 77 |
| 78 template <class InputIterator, class T> |
| 79 typename iterator_traits<InputIterator>::difference_type |
| 80 count(InputIterator first, InputIterator last, const T& value); |
| 81 |
| 82 template <class InputIterator, class Predicate> |
| 83 typename iterator_traits<InputIterator>::difference_type |
| 84 count_if(InputIterator first, InputIterator last, Predicate pred); |
| 85 |
| 86 template <class InputIterator1, class InputIterator2> |
| 87 pair<InputIterator1, InputIterator2> |
| 88 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
; |
| 89 |
| 90 template <class InputIterator1, class InputIterator2> |
| 91 pair<InputIterator1, InputIterator2> |
| 92 mismatch(InputIterator1 first1, InputIterator1 last1, |
| 93 InputIterator2 first2, InputIterator2 last2); // **C++14** |
| 94 |
| 95 template <class InputIterator1, class InputIterator2, class BinaryPredicate> |
| 96 pair<InputIterator1, InputIterator2> |
| 97 mismatch(InputIterator1 first1, InputIterator1 last1, |
| 98 InputIterator2 first2, BinaryPredicate pred); |
| 99 |
| 100 template <class InputIterator1, class InputIterator2, class BinaryPredicate> |
| 101 pair<InputIterator1, InputIterator2> |
| 102 mismatch(InputIterator1 first1, InputIterator1 last1, |
| 103 InputIterator2 first2, InputIterator2 last2, |
| 104 BinaryPredicate pred); // **C++14** |
| 105 |
| 106 template <class InputIterator1, class InputIterator2> |
| 107 bool |
| 108 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); |
| 109 |
| 110 template <class InputIterator1, class InputIterator2> |
| 111 bool |
| 112 equal(InputIterator1 first1, InputIterator1 last1, |
| 113 InputIterator2 first2, InputIterator2 last2); // **C++14** |
| 114 |
| 115 template <class InputIterator1, class InputIterator2, class BinaryPredicate> |
| 116 bool |
| 117 equal(InputIterator1 first1, InputIterator1 last1, |
| 118 InputIterator2 first2, BinaryPredicate pred); |
| 119 |
| 120 template <class InputIterator1, class InputIterator2, class BinaryPredicate> |
| 121 bool |
| 122 equal(InputIterator1 first1, InputIterator1 last1, |
| 123 InputIterator2 first2, InputIterator2 last2, |
| 124 BinaryPredicate pred); // **C++14** |
| 125 |
| 126 template<class ForwardIterator1, class ForwardIterator2> |
| 127 bool |
| 128 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, |
| 129 ForwardIterator2 first2); |
| 130 |
| 131 template<class ForwardIterator1, class ForwardIterator2> |
| 132 bool |
| 133 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, |
| 134 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14*
* |
| 135 |
| 136 template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> |
| 137 bool |
| 138 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, |
| 139 ForwardIterator2 first2, BinaryPredicate pred); |
| 140 |
| 141 template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> |
| 142 bool |
| 143 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, |
| 144 ForwardIterator2 first2, ForwardIterator2 last2, |
| 145 BinaryPredicate pred); // **C++14** |
| 146 |
| 147 template <class ForwardIterator1, class ForwardIterator2> |
| 148 ForwardIterator1 |
| 149 search(ForwardIterator1 first1, ForwardIterator1 last1, |
| 150 ForwardIterator2 first2, ForwardIterator2 last2); |
| 151 |
| 152 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> |
| 153 ForwardIterator1 |
| 154 search(ForwardIterator1 first1, ForwardIterator1 last1, |
| 155 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred
); |
| 156 |
| 157 template <class ForwardIterator, class Size, class T> |
| 158 ForwardIterator |
| 159 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& v
alue); |
| 160 |
| 161 template <class ForwardIterator, class Size, class T, class BinaryPredicate> |
| 162 ForwardIterator |
| 163 search_n(ForwardIterator first, ForwardIterator last, |
| 164 Size count, const T& value, BinaryPredicate pred); |
| 165 |
| 166 template <class InputIterator, class OutputIterator> |
| 167 OutputIterator |
| 168 copy(InputIterator first, InputIterator last, OutputIterator result); |
| 169 |
| 170 template<class InputIterator, class OutputIterator, class Predicate> |
| 171 OutputIterator |
| 172 copy_if(InputIterator first, InputIterator last, |
| 173 OutputIterator result, Predicate pred); |
| 174 |
| 175 template<class InputIterator, class Size, class OutputIterator> |
| 176 OutputIterator |
| 177 copy_n(InputIterator first, Size n, OutputIterator result); |
| 178 |
| 179 template <class BidirectionalIterator1, class BidirectionalIterator2> |
| 180 BidirectionalIterator2 |
| 181 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, |
| 182 BidirectionalIterator2 result); |
| 183 |
| 184 template <class ForwardIterator1, class ForwardIterator2> |
| 185 ForwardIterator2 |
| 186 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator
2 first2); |
| 187 |
| 188 template <class ForwardIterator1, class ForwardIterator2> |
| 189 void |
| 190 iter_swap(ForwardIterator1 a, ForwardIterator2 b); |
| 191 |
| 192 template <class InputIterator, class OutputIterator, class UnaryOperation> |
| 193 OutputIterator |
| 194 transform(InputIterator first, InputIterator last, OutputIterator result, Un
aryOperation op); |
| 195 |
| 196 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s BinaryOperation> |
| 197 OutputIterator |
| 198 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2
, |
| 199 OutputIterator result, BinaryOperation binary_op); |
| 200 |
| 201 template <class ForwardIterator, class T> |
| 202 void |
| 203 replace(ForwardIterator first, ForwardIterator last, const T& old_value, con
st T& new_value); |
| 204 |
| 205 template <class ForwardIterator, class Predicate, class T> |
| 206 void |
| 207 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, cons
t T& new_value); |
| 208 |
| 209 template <class InputIterator, class OutputIterator, class T> |
| 210 OutputIterator |
| 211 replace_copy(InputIterator first, InputIterator last, OutputIterator result, |
| 212 const T& old_value, const T& new_value); |
| 213 |
| 214 template <class InputIterator, class OutputIterator, class Predicate, class T> |
| 215 OutputIterator |
| 216 replace_copy_if(InputIterator first, InputIterator last, OutputIterator resu
lt, Predicate pred, const T& new_value); |
| 217 |
| 218 template <class ForwardIterator, class T> |
| 219 void |
| 220 fill(ForwardIterator first, ForwardIterator last, const T& value); |
| 221 |
| 222 template <class OutputIterator, class Size, class T> |
| 223 OutputIterator |
| 224 fill_n(OutputIterator first, Size n, const T& value); |
| 225 |
| 226 template <class ForwardIterator, class Generator> |
| 227 void |
| 228 generate(ForwardIterator first, ForwardIterator last, Generator gen); |
| 229 |
| 230 template <class OutputIterator, class Size, class Generator> |
| 231 OutputIterator |
| 232 generate_n(OutputIterator first, Size n, Generator gen); |
| 233 |
| 234 template <class ForwardIterator, class T> |
| 235 ForwardIterator |
| 236 remove(ForwardIterator first, ForwardIterator last, const T& value); |
| 237 |
| 238 template <class ForwardIterator, class Predicate> |
| 239 ForwardIterator |
| 240 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); |
| 241 |
| 242 template <class InputIterator, class OutputIterator, class T> |
| 243 OutputIterator |
| 244 remove_copy(InputIterator first, InputIterator last, OutputIterator result,
const T& value); |
| 245 |
| 246 template <class InputIterator, class OutputIterator, class Predicate> |
| 247 OutputIterator |
| 248 remove_copy_if(InputIterator first, InputIterator last, OutputIterator resul
t, Predicate pred); |
| 249 |
| 250 template <class ForwardIterator> |
| 251 ForwardIterator |
| 252 unique(ForwardIterator first, ForwardIterator last); |
| 253 |
| 254 template <class ForwardIterator, class BinaryPredicate> |
| 255 ForwardIterator |
| 256 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); |
| 257 |
| 258 template <class InputIterator, class OutputIterator> |
| 259 OutputIterator |
| 260 unique_copy(InputIterator first, InputIterator last, OutputIterator result); |
| 261 |
| 262 template <class InputIterator, class OutputIterator, class BinaryPredicate> |
| 263 OutputIterator |
| 264 unique_copy(InputIterator first, InputIterator last, OutputIterator result,
BinaryPredicate pred); |
| 265 |
| 266 template <class BidirectionalIterator> |
| 267 void |
| 268 reverse(BidirectionalIterator first, BidirectionalIterator last); |
| 269 |
| 270 template <class BidirectionalIterator, class OutputIterator> |
| 271 OutputIterator |
| 272 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, Output
Iterator result); |
| 273 |
| 274 template <class ForwardIterator> |
| 275 ForwardIterator |
| 276 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); |
| 277 |
| 278 template <class ForwardIterator, class OutputIterator> |
| 279 OutputIterator |
| 280 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator l
ast, OutputIterator result); |
| 281 |
| 282 template <class RandomAccessIterator> |
| 283 void |
| 284 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); |
| 285 |
| 286 template <class RandomAccessIterator, class RandomNumberGenerator> |
| 287 void |
| 288 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, Random
NumberGenerator& rand); |
| 289 |
| 290 template<class RandomAccessIterator, class UniformRandomNumberGenerator> |
| 291 void shuffle(RandomAccessIterator first, RandomAccessIterator last, |
| 292 UniformRandomNumberGenerator&& g); |
| 293 |
| 294 template <class InputIterator, class Predicate> |
| 295 bool |
| 296 is_partitioned(InputIterator first, InputIterator last, Predicate pred); |
| 297 |
| 298 template <class ForwardIterator, class Predicate> |
| 299 ForwardIterator |
| 300 partition(ForwardIterator first, ForwardIterator last, Predicate pred); |
| 301 |
| 302 template <class InputIterator, class OutputIterator1, |
| 303 class OutputIterator2, class Predicate> |
| 304 pair<OutputIterator1, OutputIterator2> |
| 305 partition_copy(InputIterator first, InputIterator last, |
| 306 OutputIterator1 out_true, OutputIterator2 out_false, |
| 307 Predicate pred); |
| 308 |
| 309 template <class ForwardIterator, class Predicate> |
| 310 ForwardIterator |
| 311 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred
); |
| 312 |
| 313 template<class ForwardIterator, class Predicate> |
| 314 ForwardIterator |
| 315 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred)
; |
| 316 |
| 317 template <class ForwardIterator> |
| 318 bool |
| 319 is_sorted(ForwardIterator first, ForwardIterator last); |
| 320 |
| 321 template <class ForwardIterator, class Compare> |
| 322 bool |
| 323 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); |
| 324 |
| 325 template<class ForwardIterator> |
| 326 ForwardIterator |
| 327 is_sorted_until(ForwardIterator first, ForwardIterator last); |
| 328 |
| 329 template <class ForwardIterator, class Compare> |
| 330 ForwardIterator |
| 331 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); |
| 332 |
| 333 template <class RandomAccessIterator> |
| 334 void |
| 335 sort(RandomAccessIterator first, RandomAccessIterator last); |
| 336 |
| 337 template <class RandomAccessIterator, class Compare> |
| 338 void |
| 339 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); |
| 340 |
| 341 template <class RandomAccessIterator> |
| 342 void |
| 343 stable_sort(RandomAccessIterator first, RandomAccessIterator last); |
| 344 |
| 345 template <class RandomAccessIterator, class Compare> |
| 346 void |
| 347 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare c
omp); |
| 348 |
| 349 template <class RandomAccessIterator> |
| 350 void |
| 351 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, Random
AccessIterator last); |
| 352 |
| 353 template <class RandomAccessIterator, class Compare> |
| 354 void |
| 355 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, Random
AccessIterator last, Compare comp); |
| 356 |
| 357 template <class InputIterator, class RandomAccessIterator> |
| 358 RandomAccessIterator |
| 359 partial_sort_copy(InputIterator first, InputIterator last, |
| 360 RandomAccessIterator result_first, RandomAccessIterator re
sult_last); |
| 361 |
| 362 template <class InputIterator, class RandomAccessIterator, class Compare> |
| 363 RandomAccessIterator |
| 364 partial_sort_copy(InputIterator first, InputIterator last, |
| 365 RandomAccessIterator result_first, RandomAccessIterator re
sult_last, Compare comp); |
| 366 |
| 367 template <class RandomAccessIterator> |
| 368 void |
| 369 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAcce
ssIterator last); |
| 370 |
| 371 template <class RandomAccessIterator, class Compare> |
| 372 void |
| 373 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAcce
ssIterator last, Compare comp); |
| 374 |
| 375 template <class ForwardIterator, class T> |
| 376 ForwardIterator |
| 377 lower_bound(ForwardIterator first, ForwardIterator last, const T& value); |
| 378 |
| 379 template <class ForwardIterator, class T, class Compare> |
| 380 ForwardIterator |
| 381 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Com
pare comp); |
| 382 |
| 383 template <class ForwardIterator, class T> |
| 384 ForwardIterator |
| 385 upper_bound(ForwardIterator first, ForwardIterator last, const T& value); |
| 386 |
| 387 template <class ForwardIterator, class T, class Compare> |
| 388 ForwardIterator |
| 389 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Com
pare comp); |
| 390 |
| 391 template <class ForwardIterator, class T> |
| 392 pair<ForwardIterator, ForwardIterator> |
| 393 equal_range(ForwardIterator first, ForwardIterator last, const T& value); |
| 394 |
| 395 template <class ForwardIterator, class T, class Compare> |
| 396 pair<ForwardIterator, ForwardIterator> |
| 397 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Com
pare comp); |
| 398 |
| 399 template <class ForwardIterator, class T> |
| 400 bool |
| 401 binary_search(ForwardIterator first, ForwardIterator last, const T& value); |
| 402 |
| 403 template <class ForwardIterator, class T, class Compare> |
| 404 bool |
| 405 binary_search(ForwardIterator first, ForwardIterator last, const T& value, C
ompare comp); |
| 406 |
| 407 template <class InputIterator1, class InputIterator2, class OutputIterator> |
| 408 OutputIterator |
| 409 merge(InputIterator1 first1, InputIterator1 last1, |
| 410 InputIterator2 first2, InputIterator2 last2, OutputIterator result); |
| 411 |
| 412 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s Compare> |
| 413 OutputIterator |
| 414 merge(InputIterator1 first1, InputIterator1 last1, |
| 415 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Co
mpare comp); |
| 416 |
| 417 template <class BidirectionalIterator> |
| 418 void |
| 419 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, Bid
irectionalIterator last); |
| 420 |
| 421 template <class BidirectionalIterator, class Compare> |
| 422 void |
| 423 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, Bid
irectionalIterator last, Compare comp); |
| 424 |
| 425 template <class InputIterator1, class InputIterator2> |
| 426 bool |
| 427 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
InputIterator2 last2); |
| 428 |
| 429 template <class InputIterator1, class InputIterator2, class Compare> |
| 430 bool |
| 431 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
InputIterator2 last2, Compare comp); |
| 432 |
| 433 template <class InputIterator1, class InputIterator2, class OutputIterator> |
| 434 OutputIterator |
| 435 set_union(InputIterator1 first1, InputIterator1 last1, |
| 436 InputIterator2 first2, InputIterator2 last2, OutputIterator result
); |
| 437 |
| 438 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s Compare> |
| 439 OutputIterator |
| 440 set_union(InputIterator1 first1, InputIterator1 last1, |
| 441 InputIterator2 first2, InputIterator2 last2, OutputIterator result
, Compare comp); |
| 442 |
| 443 template <class InputIterator1, class InputIterator2, class OutputIterator> |
| 444 OutputIterator |
| 445 set_intersection(InputIterator1 first1, InputIterator1 last1, |
| 446 InputIterator2 first2, InputIterator2 last2, OutputIterator
result); |
| 447 |
| 448 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s Compare> |
| 449 OutputIterator |
| 450 set_intersection(InputIterator1 first1, InputIterator1 last1, |
| 451 InputIterator2 first2, InputIterator2 last2, OutputIterator
result, Compare comp); |
| 452 |
| 453 template <class InputIterator1, class InputIterator2, class OutputIterator> |
| 454 OutputIterator |
| 455 set_difference(InputIterator1 first1, InputIterator1 last1, |
| 456 InputIterator2 first2, InputIterator2 last2, OutputIterator r
esult); |
| 457 |
| 458 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s Compare> |
| 459 OutputIterator |
| 460 set_difference(InputIterator1 first1, InputIterator1 last1, |
| 461 InputIterator2 first2, InputIterator2 last2, OutputIterator r
esult, Compare comp); |
| 462 |
| 463 template <class InputIterator1, class InputIterator2, class OutputIterator> |
| 464 OutputIterator |
| 465 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, |
| 466 InputIterator2 first2, InputIterator2 last2, Output
Iterator result); |
| 467 |
| 468 template <class InputIterator1, class InputIterator2, class OutputIterator, clas
s Compare> |
| 469 OutputIterator |
| 470 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, |
| 471 InputIterator2 first2, InputIterator2 last2, Output
Iterator result, Compare comp); |
| 472 |
| 473 template <class RandomAccessIterator> |
| 474 void |
| 475 push_heap(RandomAccessIterator first, RandomAccessIterator last); |
| 476 |
| 477 template <class RandomAccessIterator, class Compare> |
| 478 void |
| 479 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare com
p); |
| 480 |
| 481 template <class RandomAccessIterator> |
| 482 void |
| 483 pop_heap(RandomAccessIterator first, RandomAccessIterator last); |
| 484 |
| 485 template <class RandomAccessIterator, class Compare> |
| 486 void |
| 487 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp
); |
| 488 |
| 489 template <class RandomAccessIterator> |
| 490 void |
| 491 make_heap(RandomAccessIterator first, RandomAccessIterator last); |
| 492 |
| 493 template <class RandomAccessIterator, class Compare> |
| 494 void |
| 495 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare com
p); |
| 496 |
| 497 template <class RandomAccessIterator> |
| 498 void |
| 499 sort_heap(RandomAccessIterator first, RandomAccessIterator last); |
| 500 |
| 501 template <class RandomAccessIterator, class Compare> |
| 502 void |
| 503 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare com
p); |
| 504 |
| 505 template <class RandomAccessIterator> |
| 506 bool |
| 507 is_heap(RandomAccessIterator first, RandomAccessiterator last); |
| 508 |
| 509 template <class RandomAccessIterator, class Compare> |
| 510 bool |
| 511 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp)
; |
| 512 |
| 513 template <class RandomAccessIterator> |
| 514 RandomAccessIterator |
| 515 is_heap_until(RandomAccessIterator first, RandomAccessiterator last); |
| 516 |
| 517 template <class RandomAccessIterator, class Compare> |
| 518 RandomAccessIterator |
| 519 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare
comp); |
| 520 |
| 521 template <class ForwardIterator> |
| 522 ForwardIterator |
| 523 min_element(ForwardIterator first, ForwardIterator last); |
| 524 |
| 525 template <class ForwardIterator, class Compare> |
| 526 ForwardIterator |
| 527 min_element(ForwardIterator first, ForwardIterator last, Compare comp); |
| 528 |
| 529 template <class T> |
| 530 const T& |
| 531 min(const T& a, const T& b); |
| 532 |
| 533 template <class T, class Compare> |
| 534 const T& |
| 535 min(const T& a, const T& b, Compare comp); |
| 536 |
| 537 template<class T> |
| 538 T |
| 539 min(initializer_list<T> t); |
| 540 |
| 541 template<class T, class Compare> |
| 542 T |
| 543 min(initializer_list<T> t, Compare comp); |
| 544 |
| 545 template <class ForwardIterator> |
| 546 ForwardIterator |
| 547 max_element(ForwardIterator first, ForwardIterator last); |
| 548 |
| 549 template <class ForwardIterator, class Compare> |
| 550 ForwardIterator |
| 551 max_element(ForwardIterator first, ForwardIterator last, Compare comp); |
| 552 |
| 553 template <class T> |
| 554 const T& |
| 555 max(const T& a, const T& b); |
| 556 |
| 557 template <class T, class Compare> |
| 558 const T& |
| 559 max(const T& a, const T& b, Compare comp); |
| 560 |
| 561 template<class T> |
| 562 T |
| 563 max(initializer_list<T> t); |
| 564 |
| 565 template<class T, class Compare> |
| 566 T |
| 567 max(initializer_list<T> t, Compare comp); |
| 568 |
| 569 template<class ForwardIterator> |
| 570 pair<ForwardIterator, ForwardIterator> |
| 571 minmax_element(ForwardIterator first, ForwardIterator last); |
| 572 |
| 573 template<class ForwardIterator, class Compare> |
| 574 pair<ForwardIterator, ForwardIterator> |
| 575 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); |
| 576 |
| 577 template<class T> |
| 578 pair<const T&, const T&> |
| 579 minmax(const T& a, const T& b); |
| 580 |
| 581 template<class T, class Compare> |
| 582 pair<const T&, const T&> |
| 583 minmax(const T& a, const T& b, Compare comp); |
| 584 |
| 585 template<class T> |
| 586 pair<T, T> |
| 587 minmax(initializer_list<T> t); |
| 588 |
| 589 template<class T, class Compare> |
| 590 pair<T, T> |
| 591 minmax(initializer_list<T> t, Compare comp); |
| 592 |
| 593 template <class InputIterator1, class InputIterator2> |
| 594 bool |
| 595 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIt
erator2 first2, InputIterator2 last2); |
| 596 |
| 597 template <class InputIterator1, class InputIterator2, class Compare> |
| 598 bool |
| 599 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, |
| 600 InputIterator2 first2, InputIterator2 last2, Compare
comp); |
| 601 |
| 602 template <class BidirectionalIterator> |
| 603 bool |
| 604 next_permutation(BidirectionalIterator first, BidirectionalIterator last); |
| 605 |
| 606 template <class BidirectionalIterator, class Compare> |
| 607 bool |
| 608 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Co
mpare comp); |
| 609 |
| 610 template <class BidirectionalIterator> |
| 611 bool |
| 612 prev_permutation(BidirectionalIterator first, BidirectionalIterator last); |
| 613 |
| 614 template <class BidirectionalIterator, class Compare> |
| 615 bool |
| 616 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Co
mpare comp); |
| 617 |
| 618 } // std |
| 619 |
| 620 */ |
| 621 |
| 622 #include <__config> |
| 623 #include <initializer_list> |
| 624 #include <type_traits> |
| 625 #include <cstring> |
| 626 #include <utility> |
| 627 #include <memory> |
| 628 #include <iterator> |
| 629 #include <cstddef> |
| 630 |
| 631 #if defined(__IBMCPP__) |
| 632 #include "support/ibm/support.h" |
| 633 #endif |
| 634 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__) |
| 635 #include "support/win32/support.h" |
| 636 #endif |
| 637 |
| 638 #include <__undef_min_max> |
| 639 |
| 640 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| 641 #pragma GCC system_header |
| 642 #endif |
| 643 |
| 644 _LIBCPP_BEGIN_NAMESPACE_STD |
| 645 |
| 646 template <class _T1, class _T2 = _T1> |
| 647 struct __equal_to |
| 648 { |
| 649 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x == __y;} |
| 650 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) co
nst {return __x == __y;} |
| 651 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) co
nst {return __x == __y;} |
| 652 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) co
nst {return __x == __y;} |
| 653 }; |
| 654 |
| 655 template <class _T1> |
| 656 struct __equal_to<_T1, _T1> |
| 657 { |
| 658 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x == __y;} |
| 659 }; |
| 660 |
| 661 template <class _T1> |
| 662 struct __equal_to<const _T1, _T1> |
| 663 { |
| 664 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x == __y;} |
| 665 }; |
| 666 |
| 667 template <class _T1> |
| 668 struct __equal_to<_T1, const _T1> |
| 669 { |
| 670 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x == __y;} |
| 671 }; |
| 672 |
| 673 template <class _T1, class _T2 = _T1> |
| 674 struct __less |
| 675 { |
| 676 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x < __y;} |
| 677 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) co
nst {return __x < __y;} |
| 678 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) co
nst {return __x < __y;} |
| 679 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) co
nst {return __x < __y;} |
| 680 }; |
| 681 |
| 682 template <class _T1> |
| 683 struct __less<_T1, _T1> |
| 684 { |
| 685 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x < __y;} |
| 686 }; |
| 687 |
| 688 template <class _T1> |
| 689 struct __less<const _T1, _T1> |
| 690 { |
| 691 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x < __y;} |
| 692 }; |
| 693 |
| 694 template <class _T1> |
| 695 struct __less<_T1, const _T1> |
| 696 { |
| 697 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) co
nst {return __x < __y;} |
| 698 }; |
| 699 |
| 700 template <class _Predicate> |
| 701 class __negate |
| 702 { |
| 703 private: |
| 704 _Predicate __p_; |
| 705 public: |
| 706 _LIBCPP_INLINE_VISIBILITY __negate() {} |
| 707 |
| 708 _LIBCPP_INLINE_VISIBILITY |
| 709 explicit __negate(_Predicate __p) : __p_(__p) {} |
| 710 |
| 711 template <class _T1> |
| 712 _LIBCPP_INLINE_VISIBILITY |
| 713 bool operator()(const _T1& __x) {return !__p_(__x);} |
| 714 |
| 715 template <class _T1, class _T2> |
| 716 _LIBCPP_INLINE_VISIBILITY |
| 717 bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);} |
| 718 }; |
| 719 |
| 720 #ifdef _LIBCPP_DEBUG |
| 721 |
| 722 template <class _Compare> |
| 723 struct __debug_less |
| 724 { |
| 725 _Compare __comp_; |
| 726 __debug_less(_Compare& __c) : __comp_(__c) {} |
| 727 template <class _Tp, class _Up> |
| 728 bool operator()(const _Tp& __x, const _Up& __y) |
| 729 { |
| 730 bool __r = __comp_(__x, __y); |
| 731 if (__r) |
| 732 _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a str
ict weak ordering"); |
| 733 return __r; |
| 734 } |
| 735 }; |
| 736 |
| 737 #endif // _LIBCPP_DEBUG |
| 738 |
| 739 // Precondition: __x != 0 |
| 740 inline _LIBCPP_INLINE_VISIBILITY |
| 741 unsigned |
| 742 __ctz(unsigned __x) |
| 743 { |
| 744 return static_cast<unsigned>(__builtin_ctz(__x)); |
| 745 } |
| 746 |
| 747 inline _LIBCPP_INLINE_VISIBILITY |
| 748 unsigned long |
| 749 __ctz(unsigned long __x) |
| 750 { |
| 751 return static_cast<unsigned long>(__builtin_ctzl(__x)); |
| 752 } |
| 753 |
| 754 inline _LIBCPP_INLINE_VISIBILITY |
| 755 unsigned long long |
| 756 __ctz(unsigned long long __x) |
| 757 { |
| 758 return static_cast<unsigned long long>(__builtin_ctzll(__x)); |
| 759 } |
| 760 |
| 761 // Precondition: __x != 0 |
| 762 inline _LIBCPP_INLINE_VISIBILITY |
| 763 unsigned |
| 764 __clz(unsigned __x) |
| 765 { |
| 766 return static_cast<unsigned>(__builtin_clz(__x)); |
| 767 } |
| 768 |
| 769 inline _LIBCPP_INLINE_VISIBILITY |
| 770 unsigned long |
| 771 __clz(unsigned long __x) |
| 772 { |
| 773 return static_cast<unsigned long>(__builtin_clzl (__x)); |
| 774 } |
| 775 |
| 776 inline _LIBCPP_INLINE_VISIBILITY |
| 777 unsigned long long |
| 778 __clz(unsigned long long __x) |
| 779 { |
| 780 return static_cast<unsigned long long>(__builtin_clzll(__x)); |
| 781 } |
| 782 |
| 783 inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return
__builtin_popcount (__x);} |
| 784 inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return
__builtin_popcountl (__x);} |
| 785 inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return
__builtin_popcountll(__x);} |
| 786 |
| 787 // all_of |
| 788 |
| 789 template <class _InputIterator, class _Predicate> |
| 790 inline _LIBCPP_INLINE_VISIBILITY |
| 791 bool |
| 792 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 793 { |
| 794 for (; __first != __last; ++__first) |
| 795 if (!__pred(*__first)) |
| 796 return false; |
| 797 return true; |
| 798 } |
| 799 |
| 800 // any_of |
| 801 |
| 802 template <class _InputIterator, class _Predicate> |
| 803 inline _LIBCPP_INLINE_VISIBILITY |
| 804 bool |
| 805 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 806 { |
| 807 for (; __first != __last; ++__first) |
| 808 if (__pred(*__first)) |
| 809 return true; |
| 810 return false; |
| 811 } |
| 812 |
| 813 // none_of |
| 814 |
| 815 template <class _InputIterator, class _Predicate> |
| 816 inline _LIBCPP_INLINE_VISIBILITY |
| 817 bool |
| 818 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 819 { |
| 820 for (; __first != __last; ++__first) |
| 821 if (__pred(*__first)) |
| 822 return false; |
| 823 return true; |
| 824 } |
| 825 |
| 826 // for_each |
| 827 |
| 828 template <class _InputIterator, class _Function> |
| 829 inline _LIBCPP_INLINE_VISIBILITY |
| 830 _Function |
| 831 for_each(_InputIterator __first, _InputIterator __last, _Function __f) |
| 832 { |
| 833 for (; __first != __last; ++__first) |
| 834 __f(*__first); |
| 835 return _VSTD::move(__f); // explicitly moved for (emulated) C++03 |
| 836 } |
| 837 |
| 838 // find |
| 839 |
| 840 template <class _InputIterator, class _Tp> |
| 841 inline _LIBCPP_INLINE_VISIBILITY |
| 842 _InputIterator |
| 843 find(_InputIterator __first, _InputIterator __last, const _Tp& __value_) |
| 844 { |
| 845 for (; __first != __last; ++__first) |
| 846 if (*__first == __value_) |
| 847 break; |
| 848 return __first; |
| 849 } |
| 850 |
| 851 // find_if |
| 852 |
| 853 template <class _InputIterator, class _Predicate> |
| 854 inline _LIBCPP_INLINE_VISIBILITY |
| 855 _InputIterator |
| 856 find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 857 { |
| 858 for (; __first != __last; ++__first) |
| 859 if (__pred(*__first)) |
| 860 break; |
| 861 return __first; |
| 862 } |
| 863 |
| 864 // find_if_not |
| 865 |
| 866 template<class _InputIterator, class _Predicate> |
| 867 inline _LIBCPP_INLINE_VISIBILITY |
| 868 _InputIterator |
| 869 find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 870 { |
| 871 for (; __first != __last; ++__first) |
| 872 if (!__pred(*__first)) |
| 873 break; |
| 874 return __first; |
| 875 } |
| 876 |
| 877 // find_end |
| 878 |
| 879 template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterato
r2> |
| 880 _ForwardIterator1 |
| 881 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 882 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredica
te __pred, |
| 883 forward_iterator_tag, forward_iterator_tag) |
| 884 { |
| 885 // modeled after search algorithm |
| 886 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer |
| 887 if (__first2 == __last2) |
| 888 return __r; |
| 889 while (true) |
| 890 { |
| 891 while (true) |
| 892 { |
| 893 if (__first1 == __last1) // if source exhausted return last
correct answer |
| 894 return __r; // (or __last1 if never found) |
| 895 if (__pred(*__first1, *__first2)) |
| 896 break; |
| 897 ++__first1; |
| 898 } |
| 899 // *__first1 matches *__first2, now match elements after here |
| 900 _ForwardIterator1 __m1 = __first1; |
| 901 _ForwardIterator2 __m2 = __first2; |
| 902 while (true) |
| 903 { |
| 904 if (++__m2 == __last2) |
| 905 { // Pattern exhaused, record answer and sea
rch for another one |
| 906 __r = __first1; |
| 907 ++__first1; |
| 908 break; |
| 909 } |
| 910 if (++__m1 == __last1) // Source exhausted, return last answer |
| 911 return __r; |
| 912 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first |
| 913 { |
| 914 ++__first1; |
| 915 break; |
| 916 } // else there is a match, check next elements |
| 917 } |
| 918 } |
| 919 } |
| 920 |
| 921 template <class _BinaryPredicate, class _BidirectionalIterator1, class _Bidirect
ionalIterator2> |
| 922 _BidirectionalIterator1 |
| 923 __find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, |
| 924 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _B
inaryPredicate __pred, |
| 925 bidirectional_iterator_tag, bidirectional_iterator_tag) |
| 926 { |
| 927 // modeled after search algorithm (in reverse) |
| 928 if (__first2 == __last2) |
| 929 return __last1; // Everything matches an empty sequence |
| 930 _BidirectionalIterator1 __l1 = __last1; |
| 931 _BidirectionalIterator2 __l2 = __last2; |
| 932 --__l2; |
| 933 while (true) |
| 934 { |
| 935 // Find last element in sequence 1 that matchs *(__last2-1), with a mini
num of loop checks |
| 936 while (true) |
| 937 { |
| 938 if (__first1 == __l1) // return __last1 if no element matches *__fi
rst2 |
| 939 return __last1; |
| 940 if (__pred(*--__l1, *__l2)) |
| 941 break; |
| 942 } |
| 943 // *__l1 matches *__l2, now match elements before here |
| 944 _BidirectionalIterator1 __m1 = __l1; |
| 945 _BidirectionalIterator2 __m2 = __l2; |
| 946 while (true) |
| 947 { |
| 948 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (
works for 1 element pattern) |
| 949 return __m1; |
| 950 if (__m1 == __first1) // Otherwise if source exhaused, pattern not
found |
| 951 return __last1; |
| 952 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart w
ith a new __l1 |
| 953 { |
| 954 break; |
| 955 } // else there is a match, check next elements |
| 956 } |
| 957 } |
| 958 } |
| 959 |
| 960 template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAcc
essIterator2> |
| 961 _RandomAccessIterator1 |
| 962 __find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, |
| 963 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _Bin
aryPredicate __pred, |
| 964 random_access_iterator_tag, random_access_iterator_tag) |
| 965 { |
| 966 // Take advantage of knowing source and pattern lengths. Stop short when so
urce is smaller than pattern |
| 967 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = _
_last2 - __first2; |
| 968 if (__len2 == 0) |
| 969 return __last1; |
| 970 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = _
_last1 - __first1; |
| 971 if (__len1 < __len2) |
| 972 return __last1; |
| 973 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of patte
rn match can't go before here |
| 974 _RandomAccessIterator1 __l1 = __last1; |
| 975 _RandomAccessIterator2 __l2 = __last2; |
| 976 --__l2; |
| 977 while (true) |
| 978 { |
| 979 while (true) |
| 980 { |
| 981 if (__s == __l1) |
| 982 return __last1; |
| 983 if (__pred(*--__l1, *__l2)) |
| 984 break; |
| 985 } |
| 986 _RandomAccessIterator1 __m1 = __l1; |
| 987 _RandomAccessIterator2 __m2 = __l2; |
| 988 while (true) |
| 989 { |
| 990 if (__m2 == __first2) |
| 991 return __m1; |
| 992 // no need to check range on __m1 because __s g
uarantees we have enough source |
| 993 if (!__pred(*--__m1, *--__m2)) |
| 994 { |
| 995 break; |
| 996 } |
| 997 } |
| 998 } |
| 999 } |
| 1000 |
| 1001 template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredica
te> |
| 1002 inline _LIBCPP_INLINE_VISIBILITY |
| 1003 _ForwardIterator1 |
| 1004 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1005 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate
__pred) |
| 1006 { |
| 1007 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::ty
pe> |
| 1008 (__first1, __last1, __first2, __last2, __pred, |
| 1009 typename iterator_traits<_ForwardIterator1>::iterator_
category(), |
| 1010 typename iterator_traits<_ForwardIterator2>::iterator_
category()); |
| 1011 } |
| 1012 |
| 1013 template <class _ForwardIterator1, class _ForwardIterator2> |
| 1014 inline _LIBCPP_INLINE_VISIBILITY |
| 1015 _ForwardIterator1 |
| 1016 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1017 _ForwardIterator2 __first2, _ForwardIterator2 __last2) |
| 1018 { |
| 1019 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; |
| 1020 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; |
| 1021 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1
, __v2>()); |
| 1022 } |
| 1023 |
| 1024 // find_first_of |
| 1025 |
| 1026 template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredica
te> |
| 1027 _ForwardIterator1 |
| 1028 find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1029 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPred
icate __pred) |
| 1030 { |
| 1031 for (; __first1 != __last1; ++__first1) |
| 1032 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) |
| 1033 if (__pred(*__first1, *__j)) |
| 1034 return __first1; |
| 1035 return __last1; |
| 1036 } |
| 1037 |
| 1038 template <class _ForwardIterator1, class _ForwardIterator2> |
| 1039 inline _LIBCPP_INLINE_VISIBILITY |
| 1040 _ForwardIterator1 |
| 1041 find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1042 _ForwardIterator2 __first2, _ForwardIterator2 __last2) |
| 1043 { |
| 1044 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; |
| 1045 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; |
| 1046 return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to
<__v1, __v2>()); |
| 1047 } |
| 1048 |
| 1049 // adjacent_find |
| 1050 |
| 1051 template <class _ForwardIterator, class _BinaryPredicate> |
| 1052 inline _LIBCPP_INLINE_VISIBILITY |
| 1053 _ForwardIterator |
| 1054 adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicat
e __pred) |
| 1055 { |
| 1056 if (__first != __last) |
| 1057 { |
| 1058 _ForwardIterator __i = __first; |
| 1059 while (++__i != __last) |
| 1060 { |
| 1061 if (__pred(*__first, *__i)) |
| 1062 return __first; |
| 1063 __first = __i; |
| 1064 } |
| 1065 } |
| 1066 return __last; |
| 1067 } |
| 1068 |
| 1069 template <class _ForwardIterator> |
| 1070 inline _LIBCPP_INLINE_VISIBILITY |
| 1071 _ForwardIterator |
| 1072 adjacent_find(_ForwardIterator __first, _ForwardIterator __last) |
| 1073 { |
| 1074 typedef typename iterator_traits<_ForwardIterator>::value_type __v; |
| 1075 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>()); |
| 1076 } |
| 1077 |
| 1078 // count |
| 1079 |
| 1080 template <class _InputIterator, class _Tp> |
| 1081 inline _LIBCPP_INLINE_VISIBILITY |
| 1082 typename iterator_traits<_InputIterator>::difference_type |
| 1083 count(_InputIterator __first, _InputIterator __last, const _Tp& __value_) |
| 1084 { |
| 1085 typename iterator_traits<_InputIterator>::difference_type __r(0); |
| 1086 for (; __first != __last; ++__first) |
| 1087 if (*__first == __value_) |
| 1088 ++__r; |
| 1089 return __r; |
| 1090 } |
| 1091 |
| 1092 // count_if |
| 1093 |
| 1094 template <class _InputIterator, class _Predicate> |
| 1095 inline _LIBCPP_INLINE_VISIBILITY |
| 1096 typename iterator_traits<_InputIterator>::difference_type |
| 1097 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 1098 { |
| 1099 typename iterator_traits<_InputIterator>::difference_type __r(0); |
| 1100 for (; __first != __last; ++__first) |
| 1101 if (__pred(*__first)) |
| 1102 ++__r; |
| 1103 return __r; |
| 1104 } |
| 1105 |
| 1106 // mismatch |
| 1107 |
| 1108 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> |
| 1109 inline _LIBCPP_INLINE_VISIBILITY |
| 1110 pair<_InputIterator1, _InputIterator2> |
| 1111 mismatch(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1112 _InputIterator2 __first2, _BinaryPredicate __pred) |
| 1113 { |
| 1114 for (; __first1 != __last1; ++__first1, ++__first2) |
| 1115 if (!__pred(*__first1, *__first2)) |
| 1116 break; |
| 1117 return pair<_InputIterator1, _InputIterator2>(__first1, __first2); |
| 1118 } |
| 1119 |
| 1120 template <class _InputIterator1, class _InputIterator2> |
| 1121 inline _LIBCPP_INLINE_VISIBILITY |
| 1122 pair<_InputIterator1, _InputIterator2> |
| 1123 mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi
rst2) |
| 1124 { |
| 1125 typedef typename iterator_traits<_InputIterator1>::value_type __v1; |
| 1126 typedef typename iterator_traits<_InputIterator2>::value_type __v2; |
| 1127 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>()
); |
| 1128 } |
| 1129 |
| 1130 #if _LIBCPP_STD_VER > 11 |
| 1131 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> |
| 1132 inline _LIBCPP_INLINE_VISIBILITY |
| 1133 pair<_InputIterator1, _InputIterator2> |
| 1134 mismatch(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1135 _InputIterator2 __first2, _InputIterator2 __last2, |
| 1136 _BinaryPredicate __pred) |
| 1137 { |
| 1138 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) |
| 1139 if (!__pred(*__first1, *__first2)) |
| 1140 break; |
| 1141 return pair<_InputIterator1, _InputIterator2>(__first1, __first2); |
| 1142 } |
| 1143 |
| 1144 template <class _InputIterator1, class _InputIterator2> |
| 1145 inline _LIBCPP_INLINE_VISIBILITY |
| 1146 pair<_InputIterator1, _InputIterator2> |
| 1147 mismatch(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1148 _InputIterator2 __first2, _InputIterator2 __last2) |
| 1149 { |
| 1150 typedef typename iterator_traits<_InputIterator1>::value_type __v1; |
| 1151 typedef typename iterator_traits<_InputIterator2>::value_type __v2; |
| 1152 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1
, __v2>()); |
| 1153 } |
| 1154 #endif |
| 1155 |
| 1156 // equal |
| 1157 |
| 1158 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> |
| 1159 inline _LIBCPP_INLINE_VISIBILITY |
| 1160 bool |
| 1161 equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
2, _BinaryPredicate __pred) |
| 1162 { |
| 1163 for (; __first1 != __last1; ++__first1, ++__first2) |
| 1164 if (!__pred(*__first1, *__first2)) |
| 1165 return false; |
| 1166 return true; |
| 1167 } |
| 1168 |
| 1169 template <class _InputIterator1, class _InputIterator2> |
| 1170 inline _LIBCPP_INLINE_VISIBILITY |
| 1171 bool |
| 1172 equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
2) |
| 1173 { |
| 1174 typedef typename iterator_traits<_InputIterator1>::value_type __v1; |
| 1175 typedef typename iterator_traits<_InputIterator2>::value_type __v2; |
| 1176 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>()); |
| 1177 } |
| 1178 |
| 1179 #if _LIBCPP_STD_VER > 11 |
| 1180 template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2> |
| 1181 inline _LIBCPP_INLINE_VISIBILITY |
| 1182 bool |
| 1183 __equal(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1184 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pr
ed, |
| 1185 input_iterator_tag, input_iterator_tag ) |
| 1186 { |
| 1187 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) |
| 1188 if (!__pred(*__first1, *__first2)) |
| 1189 return false; |
| 1190 return __first1 == __last1 && __first2 == __last2; |
| 1191 } |
| 1192 |
| 1193 template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAcc
essIterator2> |
| 1194 inline _LIBCPP_INLINE_VISIBILITY |
| 1195 bool |
| 1196 __equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, |
| 1197 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _Binary
Predicate __pred, |
| 1198 random_access_iterator_tag, random_access_iterator_tag ) |
| 1199 { |
| 1200 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2
)) |
| 1201 return false; |
| 1202 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2, |
| 1203 typename add_lvalue_reference<_BinaryPredicate>::type> |
| 1204 (__first1, __last1, __first2, __pred ); |
| 1205 } |
| 1206 |
| 1207 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> |
| 1208 inline _LIBCPP_INLINE_VISIBILITY |
| 1209 bool |
| 1210 equal(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1211 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred
) |
| 1212 { |
| 1213 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type> |
| 1214 (__first1, __last1, __first2, __last2, __pred, |
| 1215 typename iterator_traits<_InputIterator1>::iterator_category(), |
| 1216 typename iterator_traits<_InputIterator2>::iterator_category()); |
| 1217 } |
| 1218 |
| 1219 template <class _InputIterator1, class _InputIterator2> |
| 1220 inline _LIBCPP_INLINE_VISIBILITY |
| 1221 bool |
| 1222 equal(_InputIterator1 __first1, _InputIterator1 __last1, |
| 1223 _InputIterator2 __first2, _InputIterator2 __last2) |
| 1224 { |
| 1225 typedef typename iterator_traits<_InputIterator1>::value_type __v1; |
| 1226 typedef typename iterator_traits<_InputIterator2>::value_type __v2; |
| 1227 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1,
__v2>(), |
| 1228 typename iterator_traits<_InputIterator1>::iterator_category(), |
| 1229 typename iterator_traits<_InputIterator2>::iterator_category()); |
| 1230 } |
| 1231 #endif |
| 1232 |
| 1233 // is_permutation |
| 1234 |
| 1235 template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicat
e> |
| 1236 bool |
| 1237 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1238 _ForwardIterator2 __first2, _BinaryPredicate __pred) |
| 1239 { |
| 1240 // shorten sequences as much as possible by lopping of any equal parts |
| 1241 for (; __first1 != __last1; ++__first1, ++__first2) |
| 1242 if (!__pred(*__first1, *__first2)) |
| 1243 goto __not_done; |
| 1244 return true; |
| 1245 __not_done: |
| 1246 // __first1 != __last1 && *__first1 != *__first2 |
| 1247 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1; |
| 1248 _D1 __l1 = _VSTD::distance(__first1, __last1); |
| 1249 if (__l1 == _D1(1)) |
| 1250 return false; |
| 1251 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1); |
| 1252 // For each element in [f1, l1) see if there are the same number of |
| 1253 // equal elements in [f2, l2) |
| 1254 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i) |
| 1255 { |
| 1256 // Have we already counted the number of *__i in [f1, l1)? |
| 1257 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j) |
| 1258 if (__pred(*__j, *__i)) |
| 1259 goto __next_iter; |
| 1260 { |
| 1261 // Count number of *__i in [f2, l2) |
| 1262 _D1 __c2 = 0; |
| 1263 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) |
| 1264 if (__pred(*__i, *__j)) |
| 1265 ++__c2; |
| 1266 if (__c2 == 0) |
| 1267 return false; |
| 1268 // Count number of *__i in [__i, l1) (we can start with 1) |
| 1269 _D1 __c1 = 1; |
| 1270 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j
) |
| 1271 if (__pred(*__i, *__j)) |
| 1272 ++__c1; |
| 1273 if (__c1 != __c2) |
| 1274 return false; |
| 1275 } |
| 1276 __next_iter:; |
| 1277 } |
| 1278 return true; |
| 1279 } |
| 1280 |
| 1281 template<class _ForwardIterator1, class _ForwardIterator2> |
| 1282 inline _LIBCPP_INLINE_VISIBILITY |
| 1283 bool |
| 1284 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1285 _ForwardIterator2 __first2) |
| 1286 { |
| 1287 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; |
| 1288 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; |
| 1289 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, _
_v2>()); |
| 1290 } |
| 1291 |
| 1292 #if _LIBCPP_STD_VER > 11 |
| 1293 template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator
2> |
| 1294 bool |
| 1295 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1296 _ForwardIterator2 __first2, _ForwardIterator2 __last2, |
| 1297 _BinaryPredicate __pred, |
| 1298 forward_iterator_tag, forward_iterator_tag ) |
| 1299 { |
| 1300 // shorten sequences as much as possible by lopping of any equal parts |
| 1301 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) |
| 1302 if (!__pred(*__first1, *__first2)) |
| 1303 goto __not_done; |
| 1304 return __first1 == __last1 && __first2 == __last2; |
| 1305 __not_done: |
| 1306 // __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2 |
| 1307 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1; |
| 1308 _D1 __l1 = _VSTD::distance(__first1, __last1); |
| 1309 |
| 1310 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2; |
| 1311 _D2 __l2 = _VSTD::distance(__first2, __last2); |
| 1312 if (__l1 != __l2) |
| 1313 return false; |
| 1314 |
| 1315 // For each element in [f1, l1) see if there are the same number of |
| 1316 // equal elements in [f2, l2) |
| 1317 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i) |
| 1318 { |
| 1319 // Have we already counted the number of *__i in [f1, l1)? |
| 1320 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j) |
| 1321 if (__pred(*__j, *__i)) |
| 1322 goto __next_iter; |
| 1323 { |
| 1324 // Count number of *__i in [f2, l2) |
| 1325 _D1 __c2 = 0; |
| 1326 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) |
| 1327 if (__pred(*__i, *__j)) |
| 1328 ++__c2; |
| 1329 if (__c2 == 0) |
| 1330 return false; |
| 1331 // Count number of *__i in [__i, l1) (we can start with 1) |
| 1332 _D1 __c1 = 1; |
| 1333 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j
) |
| 1334 if (__pred(*__i, *__j)) |
| 1335 ++__c1; |
| 1336 if (__c1 != __c2) |
| 1337 return false; |
| 1338 } |
| 1339 __next_iter:; |
| 1340 } |
| 1341 return true; |
| 1342 } |
| 1343 |
| 1344 template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAcce
ssIterator2> |
| 1345 bool |
| 1346 __is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1
, |
| 1347 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2, |
| 1348 _BinaryPredicate __pred, |
| 1349 random_access_iterator_tag, random_access_iterator_tag ) |
| 1350 { |
| 1351 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2
)) |
| 1352 return false; |
| 1353 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2, |
| 1354 typename add_lvalue_reference<_BinaryPredicate>
::type> |
| 1355 (__first1, __last1, __first2, __pred ); |
| 1356 } |
| 1357 |
| 1358 template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicat
e> |
| 1359 inline _LIBCPP_INLINE_VISIBILITY |
| 1360 bool |
| 1361 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1362 _ForwardIterator2 __first2, _ForwardIterator2 __last2, |
| 1363 _BinaryPredicate __pred ) |
| 1364 { |
| 1365 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicat
e>::type> |
| 1366 (__first1, __last1, __first2, __last2, __pred, |
| 1367 typename iterator_traits<_ForwardIterator1>::iterator_category(), |
| 1368 typename iterator_traits<_ForwardIterator2>::iterator_category()); |
| 1369 } |
| 1370 |
| 1371 template<class _ForwardIterator1, class _ForwardIterator2> |
| 1372 inline _LIBCPP_INLINE_VISIBILITY |
| 1373 bool |
| 1374 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1375 _ForwardIterator2 __first2, _ForwardIterator2 __last2) |
| 1376 { |
| 1377 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; |
| 1378 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; |
| 1379 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2, |
| 1380 __equal_to<__v1, __v2>(), |
| 1381 typename iterator_traits<_ForwardIterator1>::iterator_category(), |
| 1382 typename iterator_traits<_ForwardIterator2>::iterator_category()); |
| 1383 } |
| 1384 #endif |
| 1385 |
| 1386 // search |
| 1387 |
| 1388 template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterato
r2> |
| 1389 _ForwardIterator1 |
| 1390 __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1391 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate
__pred, |
| 1392 forward_iterator_tag, forward_iterator_tag) |
| 1393 { |
| 1394 if (__first2 == __last2) |
| 1395 return __first1; // Everything matches an empty sequence |
| 1396 while (true) |
| 1397 { |
| 1398 // Find first element in sequence 1 that matchs *__first2, with a mininu
m of loop checks |
| 1399 while (true) |
| 1400 { |
| 1401 if (__first1 == __last1) // return __last1 if no element matches *_
_first2 |
| 1402 return __last1; |
| 1403 if (__pred(*__first1, *__first2)) |
| 1404 break; |
| 1405 ++__first1; |
| 1406 } |
| 1407 // *__first1 matches *__first2, now match elements after here |
| 1408 _ForwardIterator1 __m1 = __first1; |
| 1409 _ForwardIterator2 __m2 = __first2; |
| 1410 while (true) |
| 1411 { |
| 1412 if (++__m2 == __last2) // If pattern exhausted, __first1 is the ans
wer (works for 1 element pattern) |
| 1413 return __first1; |
| 1414 if (++__m1 == __last1) // Otherwise if source exhaused, pattern not
found |
| 1415 return __last1; |
| 1416 if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with
a new __first1 |
| 1417 { |
| 1418 ++__first1; |
| 1419 break; |
| 1420 } // else there is a match, check next elements |
| 1421 } |
| 1422 } |
| 1423 } |
| 1424 |
| 1425 template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAcc
essIterator2> |
| 1426 _RandomAccessIterator1 |
| 1427 __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, |
| 1428 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _Bin
aryPredicate __pred, |
| 1429 random_access_iterator_tag, random_access_iterator_tag) |
| 1430 { |
| 1431 typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_ty
pe _D1; |
| 1432 typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_ty
pe _D2; |
| 1433 // Take advantage of knowing source and pattern lengths. Stop short when so
urce is smaller than pattern |
| 1434 _D2 __len2 = __last2 - __first2; |
| 1435 if (__len2 == 0) |
| 1436 return __first1; |
| 1437 _D1 __len1 = __last1 - __first1; |
| 1438 if (__len1 < __len2) |
| 1439 return __last1; |
| 1440 const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of patt
ern match can't go beyond here |
| 1441 while (true) |
| 1442 { |
| 1443 #if !_LIBCPP_UNROLL_LOOPS |
| 1444 while (true) |
| 1445 { |
| 1446 if (__first1 == __s) |
| 1447 return __last1; |
| 1448 if (__pred(*__first1, *__first2)) |
| 1449 break; |
| 1450 ++__first1; |
| 1451 } |
| 1452 #else // !_LIBCPP_UNROLL_LOOPS |
| 1453 for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__lo
op_unroll) |
| 1454 { |
| 1455 if (__pred(*__first1, *__first2)) |
| 1456 goto __phase2; |
| 1457 if (__pred(*++__first1, *__first2)) |
| 1458 goto __phase2; |
| 1459 if (__pred(*++__first1, *__first2)) |
| 1460 goto __phase2; |
| 1461 if (__pred(*++__first1, *__first2)) |
| 1462 goto __phase2; |
| 1463 ++__first1; |
| 1464 } |
| 1465 switch (__s - __first1) |
| 1466 { |
| 1467 case 3: |
| 1468 if (__pred(*__first1, *__first2)) |
| 1469 break; |
| 1470 ++__first1; |
| 1471 case 2: |
| 1472 if (__pred(*__first1, *__first2)) |
| 1473 break; |
| 1474 ++__first1; |
| 1475 case 1: |
| 1476 if (__pred(*__first1, *__first2)) |
| 1477 break; |
| 1478 case 0: |
| 1479 return __last1; |
| 1480 } |
| 1481 __phase2: |
| 1482 #endif // !_LIBCPP_UNROLL_LOOPS |
| 1483 _RandomAccessIterator1 __m1 = __first1; |
| 1484 _RandomAccessIterator2 __m2 = __first2; |
| 1485 #if !_LIBCPP_UNROLL_LOOPS |
| 1486 while (true) |
| 1487 { |
| 1488 if (++__m2 == __last2) |
| 1489 return __first1; |
| 1490 ++__m1; // no need to check range on __m1 because __s guar
antees we have enough source |
| 1491 if (!__pred(*__m1, *__m2)) |
| 1492 { |
| 1493 ++__first1; |
| 1494 break; |
| 1495 } |
| 1496 } |
| 1497 #else // !_LIBCPP_UNROLL_LOOPS |
| 1498 ++__m2; |
| 1499 ++__m1; |
| 1500 for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__lo
op_unroll) |
| 1501 { |
| 1502 if (!__pred(*__m1, *__m2)) |
| 1503 goto __continue; |
| 1504 if (!__pred(*++__m1, *++__m2)) |
| 1505 goto __continue; |
| 1506 if (!__pred(*++__m1, *++__m2)) |
| 1507 goto __continue; |
| 1508 if (!__pred(*++__m1, *++__m2)) |
| 1509 goto __continue; |
| 1510 ++__m1; |
| 1511 ++__m2; |
| 1512 } |
| 1513 switch (__last2 - __m2) |
| 1514 { |
| 1515 case 3: |
| 1516 if (!__pred(*__m1, *__m2)) |
| 1517 break; |
| 1518 ++__m1; |
| 1519 ++__m2; |
| 1520 case 2: |
| 1521 if (!__pred(*__m1, *__m2)) |
| 1522 break; |
| 1523 ++__m1; |
| 1524 ++__m2; |
| 1525 case 1: |
| 1526 if (!__pred(*__m1, *__m2)) |
| 1527 break; |
| 1528 case 0: |
| 1529 return __first1; |
| 1530 } |
| 1531 __continue: |
| 1532 ++__first1; |
| 1533 #endif // !_LIBCPP_UNROLL_LOOPS |
| 1534 } |
| 1535 } |
| 1536 |
| 1537 template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredica
te> |
| 1538 inline _LIBCPP_INLINE_VISIBILITY |
| 1539 _ForwardIterator1 |
| 1540 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1541 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate _
_pred) |
| 1542 { |
| 1543 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type
> |
| 1544 (__first1, __last1, __first2, __last2, __pred, |
| 1545 typename std::iterator_traits<_ForwardIterator1>::iter
ator_category(), |
| 1546 typename std::iterator_traits<_ForwardIterator2>::iter
ator_category()); |
| 1547 } |
| 1548 |
| 1549 template <class _ForwardIterator1, class _ForwardIterator2> |
| 1550 inline _LIBCPP_INLINE_VISIBILITY |
| 1551 _ForwardIterator1 |
| 1552 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, |
| 1553 _ForwardIterator2 __first2, _ForwardIterator2 __last2) |
| 1554 { |
| 1555 typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1; |
| 1556 typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2; |
| 1557 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1,
__v2>()); |
| 1558 } |
| 1559 |
| 1560 // search_n |
| 1561 |
| 1562 template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp
> |
| 1563 _ForwardIterator |
| 1564 __search_n(_ForwardIterator __first, _ForwardIterator __last, |
| 1565 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_
iterator_tag) |
| 1566 { |
| 1567 if (__count <= 0) |
| 1568 return __first; |
| 1569 while (true) |
| 1570 { |
| 1571 // Find first element in sequence that matchs __value_, with a mininum o
f loop checks |
| 1572 while (true) |
| 1573 { |
| 1574 if (__first == __last) // return __last if no element matches __val
ue_ |
| 1575 return __last; |
| 1576 if (__pred(*__first, __value_)) |
| 1577 break; |
| 1578 ++__first; |
| 1579 } |
| 1580 // *__first matches __value_, now match elements after here |
| 1581 _ForwardIterator __m = __first; |
| 1582 _Size __c(0); |
| 1583 while (true) |
| 1584 { |
| 1585 if (++__c == __count) // If pattern exhausted, __first is the answe
r (works for 1 element pattern) |
| 1586 return __first; |
| 1587 if (++__m == __last) // Otherwise if source exhaused, pattern not f
ound |
| 1588 return __last; |
| 1589 if (!__pred(*__m, __value_)) // if there is a mismatch, restart wit
h a new __first |
| 1590 { |
| 1591 __first = __m; |
| 1592 ++__first; |
| 1593 break; |
| 1594 } // else there is a match, check next elements |
| 1595 } |
| 1596 } |
| 1597 } |
| 1598 |
| 1599 template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, clas
s _Tp> |
| 1600 _RandomAccessIterator |
| 1601 __search_n(_RandomAccessIterator __first, _RandomAccessIterator __last, |
| 1602 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_a
ccess_iterator_tag) |
| 1603 { |
| 1604 if (__count <= 0) |
| 1605 return __first; |
| 1606 _Size __len = static_cast<_Size>(__last - __first); |
| 1607 if (__len < __count) |
| 1608 return __last; |
| 1609 const _RandomAccessIterator __s = __last - (__count - 1); // Start of patte
rn match can't go beyond here |
| 1610 while (true) |
| 1611 { |
| 1612 // Find first element in sequence that matchs __value_, with a mininum o
f loop checks |
| 1613 while (true) |
| 1614 { |
| 1615 if (__first >= __s) // return __last if no element matches __value_ |
| 1616 return __last; |
| 1617 if (__pred(*__first, __value_)) |
| 1618 break; |
| 1619 ++__first; |
| 1620 } |
| 1621 // *__first matches __value_, now match elements after here |
| 1622 _RandomAccessIterator __m = __first; |
| 1623 _Size __c(0); |
| 1624 while (true) |
| 1625 { |
| 1626 if (++__c == __count) // If pattern exhausted, __first is the answe
r (works for 1 element pattern) |
| 1627 return __first; |
| 1628 ++__m; // no need to check range on __m because __s guaran
tees we have enough source |
| 1629 if (!__pred(*__m, __value_)) // if there is a mismatch, restart wit
h a new __first |
| 1630 { |
| 1631 __first = __m; |
| 1632 ++__first; |
| 1633 break; |
| 1634 } // else there is a match, check next elements |
| 1635 } |
| 1636 } |
| 1637 } |
| 1638 |
| 1639 template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate
> |
| 1640 inline _LIBCPP_INLINE_VISIBILITY |
| 1641 _ForwardIterator |
| 1642 search_n(_ForwardIterator __first, _ForwardIterator __last, |
| 1643 _Size __count, const _Tp& __value_, _BinaryPredicate __pred) |
| 1644 { |
| 1645 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::ty
pe> |
| 1646 (__first, __last, __count, __value_, __pred, typename iterator_traits
<_ForwardIterator>::iterator_category()); |
| 1647 } |
| 1648 |
| 1649 template <class _ForwardIterator, class _Size, class _Tp> |
| 1650 inline _LIBCPP_INLINE_VISIBILITY |
| 1651 _ForwardIterator |
| 1652 search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const
_Tp& __value_) |
| 1653 { |
| 1654 typedef typename iterator_traits<_ForwardIterator>::value_type __v; |
| 1655 return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _
Tp>()); |
| 1656 } |
| 1657 |
| 1658 // copy |
| 1659 |
| 1660 template <class _Iter> |
| 1661 struct __libcpp_is_trivial_iterator |
| 1662 { |
| 1663 static const bool value = is_pointer<_Iter>::value; |
| 1664 }; |
| 1665 |
| 1666 template <class _Iter> |
| 1667 struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > |
| 1668 { |
| 1669 static const bool value = is_pointer<_Iter>::value; |
| 1670 }; |
| 1671 |
| 1672 template <class _Iter> |
| 1673 struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > |
| 1674 { |
| 1675 static const bool value = is_pointer<_Iter>::value; |
| 1676 }; |
| 1677 |
| 1678 template <class _Iter> |
| 1679 inline _LIBCPP_INLINE_VISIBILITY |
| 1680 _Iter |
| 1681 __unwrap_iter(_Iter __i) |
| 1682 { |
| 1683 return __i; |
| 1684 } |
| 1685 |
| 1686 template <class _Tp> |
| 1687 inline _LIBCPP_INLINE_VISIBILITY |
| 1688 typename enable_if |
| 1689 < |
| 1690 is_trivially_copy_assignable<_Tp>::value, |
| 1691 _Tp* |
| 1692 >::type |
| 1693 __unwrap_iter(move_iterator<_Tp*> __i) |
| 1694 { |
| 1695 return __i.base(); |
| 1696 } |
| 1697 |
| 1698 #if _LIBCPP_DEBUG_LEVEL < 2 |
| 1699 |
| 1700 template <class _Tp> |
| 1701 inline _LIBCPP_INLINE_VISIBILITY |
| 1702 typename enable_if |
| 1703 < |
| 1704 is_trivially_copy_assignable<_Tp>::value, |
| 1705 _Tp* |
| 1706 >::type |
| 1707 __unwrap_iter(__wrap_iter<_Tp*> __i) |
| 1708 { |
| 1709 return __i.base(); |
| 1710 } |
| 1711 |
| 1712 #endif // _LIBCPP_DEBUG_LEVEL < 2 |
| 1713 |
| 1714 template <class _InputIterator, class _OutputIterator> |
| 1715 inline _LIBCPP_INLINE_VISIBILITY |
| 1716 _OutputIterator |
| 1717 __copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) |
| 1718 { |
| 1719 for (; __first != __last; ++__first, ++__result) |
| 1720 *__result = *__first; |
| 1721 return __result; |
| 1722 } |
| 1723 |
| 1724 template <class _Tp, class _Up> |
| 1725 inline _LIBCPP_INLINE_VISIBILITY |
| 1726 typename enable_if |
| 1727 < |
| 1728 is_same<typename remove_const<_Tp>::type, _Up>::value && |
| 1729 is_trivially_copy_assignable<_Up>::value, |
| 1730 _Up* |
| 1731 >::type |
| 1732 __copy(_Tp* __first, _Tp* __last, _Up* __result) |
| 1733 { |
| 1734 const size_t __n = static_cast<size_t>(__last - __first); |
| 1735 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); |
| 1736 return __result + __n; |
| 1737 } |
| 1738 |
| 1739 template <class _InputIterator, class _OutputIterator> |
| 1740 inline _LIBCPP_INLINE_VISIBILITY |
| 1741 _OutputIterator |
| 1742 copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) |
| 1743 { |
| 1744 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap
_iter(__result)); |
| 1745 } |
| 1746 |
| 1747 // copy_backward |
| 1748 |
| 1749 template <class _BidirectionalIterator, class _OutputIterator> |
| 1750 inline _LIBCPP_INLINE_VISIBILITY |
| 1751 _OutputIterator |
| 1752 __copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _
OutputIterator __result) |
| 1753 { |
| 1754 while (__first != __last) |
| 1755 *--__result = *--__last; |
| 1756 return __result; |
| 1757 } |
| 1758 |
| 1759 template <class _Tp, class _Up> |
| 1760 inline _LIBCPP_INLINE_VISIBILITY |
| 1761 typename enable_if |
| 1762 < |
| 1763 is_same<typename remove_const<_Tp>::type, _Up>::value && |
| 1764 is_trivially_copy_assignable<_Up>::value, |
| 1765 _Up* |
| 1766 >::type |
| 1767 __copy_backward(_Tp* __first, _Tp* __last, _Up* __result) |
| 1768 { |
| 1769 const size_t __n = static_cast<size_t>(__last - __first); |
| 1770 __result -= __n; |
| 1771 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); |
| 1772 return __result; |
| 1773 } |
| 1774 |
| 1775 template <class _BidirectionalIterator1, class _BidirectionalIterator2> |
| 1776 inline _LIBCPP_INLINE_VISIBILITY |
| 1777 _BidirectionalIterator2 |
| 1778 copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, |
| 1779 _BidirectionalIterator2 __result) |
| 1780 { |
| 1781 return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last),
__unwrap_iter(__result)); |
| 1782 } |
| 1783 |
| 1784 // copy_if |
| 1785 |
| 1786 template<class _InputIterator, class _OutputIterator, class _Predicate> |
| 1787 inline _LIBCPP_INLINE_VISIBILITY |
| 1788 _OutputIterator |
| 1789 copy_if(_InputIterator __first, _InputIterator __last, |
| 1790 _OutputIterator __result, _Predicate __pred) |
| 1791 { |
| 1792 for (; __first != __last; ++__first) |
| 1793 { |
| 1794 if (__pred(*__first)) |
| 1795 { |
| 1796 *__result = *__first; |
| 1797 ++__result; |
| 1798 } |
| 1799 } |
| 1800 return __result; |
| 1801 } |
| 1802 |
| 1803 // copy_n |
| 1804 |
| 1805 template<class _InputIterator, class _Size, class _OutputIterator> |
| 1806 inline _LIBCPP_INLINE_VISIBILITY |
| 1807 typename enable_if |
| 1808 < |
| 1809 __is_input_iterator<_InputIterator>::value && |
| 1810 !__is_random_access_iterator<_InputIterator>::value, |
| 1811 _OutputIterator |
| 1812 >::type |
| 1813 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) |
| 1814 { |
| 1815 if (__n > 0) |
| 1816 { |
| 1817 *__result = *__first; |
| 1818 ++__result; |
| 1819 for (--__n; __n > 0; --__n) |
| 1820 { |
| 1821 ++__first; |
| 1822 *__result = *__first; |
| 1823 ++__result; |
| 1824 } |
| 1825 } |
| 1826 return __result; |
| 1827 } |
| 1828 |
| 1829 template<class _InputIterator, class _Size, class _OutputIterator> |
| 1830 inline _LIBCPP_INLINE_VISIBILITY |
| 1831 typename enable_if |
| 1832 < |
| 1833 __is_random_access_iterator<_InputIterator>::value, |
| 1834 _OutputIterator |
| 1835 >::type |
| 1836 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) |
| 1837 { |
| 1838 return _VSTD::copy(__first, __first + __n, __result); |
| 1839 } |
| 1840 |
| 1841 // move |
| 1842 |
| 1843 template <class _InputIterator, class _OutputIterator> |
| 1844 inline _LIBCPP_INLINE_VISIBILITY |
| 1845 _OutputIterator |
| 1846 __move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) |
| 1847 { |
| 1848 for (; __first != __last; ++__first, ++__result) |
| 1849 *__result = _VSTD::move(*__first); |
| 1850 return __result; |
| 1851 } |
| 1852 |
| 1853 template <class _Tp, class _Up> |
| 1854 inline _LIBCPP_INLINE_VISIBILITY |
| 1855 typename enable_if |
| 1856 < |
| 1857 is_same<typename remove_const<_Tp>::type, _Up>::value && |
| 1858 is_trivially_copy_assignable<_Up>::value, |
| 1859 _Up* |
| 1860 >::type |
| 1861 __move(_Tp* __first, _Tp* __last, _Up* __result) |
| 1862 { |
| 1863 const size_t __n = static_cast<size_t>(__last - __first); |
| 1864 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); |
| 1865 return __result + __n; |
| 1866 } |
| 1867 |
| 1868 template <class _InputIterator, class _OutputIterator> |
| 1869 inline _LIBCPP_INLINE_VISIBILITY |
| 1870 _OutputIterator |
| 1871 move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) |
| 1872 { |
| 1873 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap
_iter(__result)); |
| 1874 } |
| 1875 |
| 1876 // move_backward |
| 1877 |
| 1878 template <class _InputIterator, class _OutputIterator> |
| 1879 inline _LIBCPP_INLINE_VISIBILITY |
| 1880 _OutputIterator |
| 1881 __move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator _
_result) |
| 1882 { |
| 1883 while (__first != __last) |
| 1884 *--__result = _VSTD::move(*--__last); |
| 1885 return __result; |
| 1886 } |
| 1887 |
| 1888 template <class _Tp, class _Up> |
| 1889 inline _LIBCPP_INLINE_VISIBILITY |
| 1890 typename enable_if |
| 1891 < |
| 1892 is_same<typename remove_const<_Tp>::type, _Up>::value && |
| 1893 is_trivially_copy_assignable<_Up>::value, |
| 1894 _Up* |
| 1895 >::type |
| 1896 __move_backward(_Tp* __first, _Tp* __last, _Up* __result) |
| 1897 { |
| 1898 const size_t __n = static_cast<size_t>(__last - __first); |
| 1899 __result -= __n; |
| 1900 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); |
| 1901 return __result; |
| 1902 } |
| 1903 |
| 1904 template <class _BidirectionalIterator1, class _BidirectionalIterator2> |
| 1905 inline _LIBCPP_INLINE_VISIBILITY |
| 1906 _BidirectionalIterator2 |
| 1907 move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, |
| 1908 _BidirectionalIterator2 __result) |
| 1909 { |
| 1910 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last),
__unwrap_iter(__result)); |
| 1911 } |
| 1912 |
| 1913 // iter_swap |
| 1914 |
| 1915 // moved to <type_traits> for better swap / noexcept support |
| 1916 |
| 1917 // transform |
| 1918 |
| 1919 template <class _InputIterator, class _OutputIterator, class _UnaryOperation> |
| 1920 inline _LIBCPP_INLINE_VISIBILITY |
| 1921 _OutputIterator |
| 1922 transform(_InputIterator __first, _InputIterator __last, _OutputIterator __resul
t, _UnaryOperation __op) |
| 1923 { |
| 1924 for (; __first != __last; ++__first, ++__result) |
| 1925 *__result = __op(*__first); |
| 1926 return __result; |
| 1927 } |
| 1928 |
| 1929 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _BinaryOperation> |
| 1930 inline _LIBCPP_INLINE_VISIBILITY |
| 1931 _OutputIterator |
| 1932 transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __f
irst2, |
| 1933 _OutputIterator __result, _BinaryOperation __binary_op) |
| 1934 { |
| 1935 for (; __first1 != __last1; ++__first1, ++__first2, ++__result) |
| 1936 *__result = __binary_op(*__first1, *__first2); |
| 1937 return __result; |
| 1938 } |
| 1939 |
| 1940 // replace |
| 1941 |
| 1942 template <class _ForwardIterator, class _Tp> |
| 1943 inline _LIBCPP_INLINE_VISIBILITY |
| 1944 void |
| 1945 replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_valu
e, const _Tp& __new_value) |
| 1946 { |
| 1947 for (; __first != __last; ++__first) |
| 1948 if (*__first == __old_value) |
| 1949 *__first = __new_value; |
| 1950 } |
| 1951 |
| 1952 // replace_if |
| 1953 |
| 1954 template <class _ForwardIterator, class _Predicate, class _Tp> |
| 1955 inline _LIBCPP_INLINE_VISIBILITY |
| 1956 void |
| 1957 replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
const _Tp& __new_value) |
| 1958 { |
| 1959 for (; __first != __last; ++__first) |
| 1960 if (__pred(*__first)) |
| 1961 *__first = __new_value; |
| 1962 } |
| 1963 |
| 1964 // replace_copy |
| 1965 |
| 1966 template <class _InputIterator, class _OutputIterator, class _Tp> |
| 1967 inline _LIBCPP_INLINE_VISIBILITY |
| 1968 _OutputIterator |
| 1969 replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __re
sult, |
| 1970 const _Tp& __old_value, const _Tp& __new_value) |
| 1971 { |
| 1972 for (; __first != __last; ++__first, ++__result) |
| 1973 if (*__first == __old_value) |
| 1974 *__result = __new_value; |
| 1975 else |
| 1976 *__result = *__first; |
| 1977 return __result; |
| 1978 } |
| 1979 |
| 1980 // replace_copy_if |
| 1981 |
| 1982 template <class _InputIterator, class _OutputIterator, class _Predicate, class _
Tp> |
| 1983 inline _LIBCPP_INLINE_VISIBILITY |
| 1984 _OutputIterator |
| 1985 replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator _
_result, |
| 1986 _Predicate __pred, const _Tp& __new_value) |
| 1987 { |
| 1988 for (; __first != __last; ++__first, ++__result) |
| 1989 if (__pred(*__first)) |
| 1990 *__result = __new_value; |
| 1991 else |
| 1992 *__result = *__first; |
| 1993 return __result; |
| 1994 } |
| 1995 |
| 1996 // fill_n |
| 1997 |
| 1998 template <class _OutputIterator, class _Size, class _Tp> |
| 1999 inline _LIBCPP_INLINE_VISIBILITY |
| 2000 _OutputIterator |
| 2001 __fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_) |
| 2002 { |
| 2003 for (; __n > 0; ++__first, --__n) |
| 2004 *__first = __value_; |
| 2005 return __first; |
| 2006 } |
| 2007 |
| 2008 template <class _Tp, class _Size, class _Up> |
| 2009 inline _LIBCPP_INLINE_VISIBILITY |
| 2010 typename enable_if |
| 2011 < |
| 2012 is_integral<_Tp>::value && sizeof(_Tp) == 1 && |
| 2013 !is_same<_Tp, bool>::value && |
| 2014 is_integral<_Up>::value && sizeof(_Up) == 1, |
| 2015 _Tp* |
| 2016 >::type |
| 2017 __fill_n(_Tp* __first, _Size __n,_Up __value_) |
| 2018 { |
| 2019 if (__n > 0) |
| 2020 _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n)); |
| 2021 return __first + __n; |
| 2022 } |
| 2023 |
| 2024 template <class _OutputIterator, class _Size, class _Tp> |
| 2025 inline _LIBCPP_INLINE_VISIBILITY |
| 2026 _OutputIterator |
| 2027 fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_) |
| 2028 { |
| 2029 return _VSTD::__fill_n(__first, __n, __value_); |
| 2030 } |
| 2031 |
| 2032 // fill |
| 2033 |
| 2034 template <class _ForwardIterator, class _Tp> |
| 2035 inline _LIBCPP_INLINE_VISIBILITY |
| 2036 void |
| 2037 __fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, f
orward_iterator_tag) |
| 2038 { |
| 2039 for (; __first != __last; ++__first) |
| 2040 *__first = __value_; |
| 2041 } |
| 2042 |
| 2043 template <class _RandomAccessIterator, class _Tp> |
| 2044 inline _LIBCPP_INLINE_VISIBILITY |
| 2045 void |
| 2046 __fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& _
_value_, random_access_iterator_tag) |
| 2047 { |
| 2048 _VSTD::fill_n(__first, __last - __first, __value_); |
| 2049 } |
| 2050 |
| 2051 template <class _ForwardIterator, class _Tp> |
| 2052 inline _LIBCPP_INLINE_VISIBILITY |
| 2053 void |
| 2054 fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) |
| 2055 { |
| 2056 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIt
erator>::iterator_category()); |
| 2057 } |
| 2058 |
| 2059 // generate |
| 2060 |
| 2061 template <class _ForwardIterator, class _Generator> |
| 2062 inline _LIBCPP_INLINE_VISIBILITY |
| 2063 void |
| 2064 generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) |
| 2065 { |
| 2066 for (; __first != __last; ++__first) |
| 2067 *__first = __gen(); |
| 2068 } |
| 2069 |
| 2070 // generate_n |
| 2071 |
| 2072 template <class _OutputIterator, class _Size, class _Generator> |
| 2073 inline _LIBCPP_INLINE_VISIBILITY |
| 2074 _OutputIterator |
| 2075 generate_n(_OutputIterator __first, _Size __n, _Generator __gen) |
| 2076 { |
| 2077 for (; __n > 0; ++__first, --__n) |
| 2078 *__first = __gen(); |
| 2079 return __first; |
| 2080 } |
| 2081 |
| 2082 // remove |
| 2083 |
| 2084 template <class _ForwardIterator, class _Tp> |
| 2085 _ForwardIterator |
| 2086 remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) |
| 2087 { |
| 2088 __first = _VSTD::find(__first, __last, __value_); |
| 2089 if (__first != __last) |
| 2090 { |
| 2091 _ForwardIterator __i = __first; |
| 2092 while (++__i != __last) |
| 2093 { |
| 2094 if (!(*__i == __value_)) |
| 2095 { |
| 2096 *__first = _VSTD::move(*__i); |
| 2097 ++__first; |
| 2098 } |
| 2099 } |
| 2100 } |
| 2101 return __first; |
| 2102 } |
| 2103 |
| 2104 // remove_if |
| 2105 |
| 2106 template <class _ForwardIterator, class _Predicate> |
| 2107 _ForwardIterator |
| 2108 remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) |
| 2109 { |
| 2110 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Pr
edicate>::type> |
| 2111 (__first, __last, __pred); |
| 2112 if (__first != __last) |
| 2113 { |
| 2114 _ForwardIterator __i = __first; |
| 2115 while (++__i != __last) |
| 2116 { |
| 2117 if (!__pred(*__i)) |
| 2118 { |
| 2119 *__first = _VSTD::move(*__i); |
| 2120 ++__first; |
| 2121 } |
| 2122 } |
| 2123 } |
| 2124 return __first; |
| 2125 } |
| 2126 |
| 2127 // remove_copy |
| 2128 |
| 2129 template <class _InputIterator, class _OutputIterator, class _Tp> |
| 2130 inline _LIBCPP_INLINE_VISIBILITY |
| 2131 _OutputIterator |
| 2132 remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __res
ult, const _Tp& __value_) |
| 2133 { |
| 2134 for (; __first != __last; ++__first) |
| 2135 { |
| 2136 if (!(*__first == __value_)) |
| 2137 { |
| 2138 *__result = *__first; |
| 2139 ++__result; |
| 2140 } |
| 2141 } |
| 2142 return __result; |
| 2143 } |
| 2144 |
| 2145 // remove_copy_if |
| 2146 |
| 2147 template <class _InputIterator, class _OutputIterator, class _Predicate> |
| 2148 inline _LIBCPP_INLINE_VISIBILITY |
| 2149 _OutputIterator |
| 2150 remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __
result, _Predicate __pred) |
| 2151 { |
| 2152 for (; __first != __last; ++__first) |
| 2153 { |
| 2154 if (!__pred(*__first)) |
| 2155 { |
| 2156 *__result = *__first; |
| 2157 ++__result; |
| 2158 } |
| 2159 } |
| 2160 return __result; |
| 2161 } |
| 2162 |
| 2163 // unique |
| 2164 |
| 2165 template <class _ForwardIterator, class _BinaryPredicate> |
| 2166 _ForwardIterator |
| 2167 unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pre
d) |
| 2168 { |
| 2169 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_referen
ce<_BinaryPredicate>::type> |
| 2170 (__first, __last, __pred); |
| 2171 if (__first != __last) |
| 2172 { |
| 2173 // ... a a ? ... |
| 2174 // f i |
| 2175 _ForwardIterator __i = __first; |
| 2176 for (++__i; ++__i != __last;) |
| 2177 if (!__pred(*__first, *__i)) |
| 2178 *++__first = _VSTD::move(*__i); |
| 2179 ++__first; |
| 2180 } |
| 2181 return __first; |
| 2182 } |
| 2183 |
| 2184 template <class _ForwardIterator> |
| 2185 inline _LIBCPP_INLINE_VISIBILITY |
| 2186 _ForwardIterator |
| 2187 unique(_ForwardIterator __first, _ForwardIterator __last) |
| 2188 { |
| 2189 typedef typename iterator_traits<_ForwardIterator>::value_type __v; |
| 2190 return _VSTD::unique(__first, __last, __equal_to<__v>()); |
| 2191 } |
| 2192 |
| 2193 // unique_copy |
| 2194 |
| 2195 template <class _BinaryPredicate, class _InputIterator, class _OutputIterator> |
| 2196 _OutputIterator |
| 2197 __unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __r
esult, _BinaryPredicate __pred, |
| 2198 input_iterator_tag, output_iterator_tag) |
| 2199 { |
| 2200 if (__first != __last) |
| 2201 { |
| 2202 typename iterator_traits<_InputIterator>::value_type __t(*__first); |
| 2203 *__result = __t; |
| 2204 ++__result; |
| 2205 while (++__first != __last) |
| 2206 { |
| 2207 if (!__pred(__t, *__first)) |
| 2208 { |
| 2209 __t = *__first; |
| 2210 *__result = __t; |
| 2211 ++__result; |
| 2212 } |
| 2213 } |
| 2214 } |
| 2215 return __result; |
| 2216 } |
| 2217 |
| 2218 template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator> |
| 2219 _OutputIterator |
| 2220 __unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator
__result, _BinaryPredicate __pred, |
| 2221 forward_iterator_tag, output_iterator_tag) |
| 2222 { |
| 2223 if (__first != __last) |
| 2224 { |
| 2225 _ForwardIterator __i = __first; |
| 2226 *__result = *__i; |
| 2227 ++__result; |
| 2228 while (++__first != __last) |
| 2229 { |
| 2230 if (!__pred(*__i, *__first)) |
| 2231 { |
| 2232 *__result = *__first; |
| 2233 ++__result; |
| 2234 __i = __first; |
| 2235 } |
| 2236 } |
| 2237 } |
| 2238 return __result; |
| 2239 } |
| 2240 |
| 2241 template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator> |
| 2242 _ForwardIterator |
| 2243 __unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __
result, _BinaryPredicate __pred, |
| 2244 input_iterator_tag, forward_iterator_tag) |
| 2245 { |
| 2246 if (__first != __last) |
| 2247 { |
| 2248 *__result = *__first; |
| 2249 while (++__first != __last) |
| 2250 if (!__pred(*__result, *__first)) |
| 2251 *++__result = *__first; |
| 2252 ++__result; |
| 2253 } |
| 2254 return __result; |
| 2255 } |
| 2256 |
| 2257 template <class _InputIterator, class _OutputIterator, class _BinaryPredicate> |
| 2258 inline _LIBCPP_INLINE_VISIBILITY |
| 2259 _OutputIterator |
| 2260 unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __res
ult, _BinaryPredicate __pred) |
| 2261 { |
| 2262 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>:
:type> |
| 2263 (__first, __last, __result, __pred, |
| 2264 typename iterator_traits<_InputIterator>::iterato
r_category(), |
| 2265 typename iterator_traits<_OutputIterator>::iterat
or_category()); |
| 2266 } |
| 2267 |
| 2268 template <class _InputIterator, class _OutputIterator> |
| 2269 inline _LIBCPP_INLINE_VISIBILITY |
| 2270 _OutputIterator |
| 2271 unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __res
ult) |
| 2272 { |
| 2273 typedef typename iterator_traits<_InputIterator>::value_type __v; |
| 2274 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>()); |
| 2275 } |
| 2276 |
| 2277 // reverse |
| 2278 |
| 2279 template <class _BidirectionalIterator> |
| 2280 inline _LIBCPP_INLINE_VISIBILITY |
| 2281 void |
| 2282 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirec
tional_iterator_tag) |
| 2283 { |
| 2284 while (__first != __last) |
| 2285 { |
| 2286 if (__first == --__last) |
| 2287 break; |
| 2288 swap(*__first, *__last); |
| 2289 ++__first; |
| 2290 } |
| 2291 } |
| 2292 |
| 2293 template <class _RandomAccessIterator> |
| 2294 inline _LIBCPP_INLINE_VISIBILITY |
| 2295 void |
| 2296 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_ac
cess_iterator_tag) |
| 2297 { |
| 2298 if (__first != __last) |
| 2299 for (; __first < --__last; ++__first) |
| 2300 swap(*__first, *__last); |
| 2301 } |
| 2302 |
| 2303 template <class _BidirectionalIterator> |
| 2304 inline _LIBCPP_INLINE_VISIBILITY |
| 2305 void |
| 2306 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) |
| 2307 { |
| 2308 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIte
rator>::iterator_category()); |
| 2309 } |
| 2310 |
| 2311 // reverse_copy |
| 2312 |
| 2313 template <class _BidirectionalIterator, class _OutputIterator> |
| 2314 inline _LIBCPP_INLINE_VISIBILITY |
| 2315 _OutputIterator |
| 2316 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _Out
putIterator __result) |
| 2317 { |
| 2318 for (; __first != __last; ++__result) |
| 2319 *__result = *--__last; |
| 2320 return __result; |
| 2321 } |
| 2322 |
| 2323 // rotate |
| 2324 |
| 2325 template <class _ForwardIterator> |
| 2326 _ForwardIterator |
| 2327 __rotate_left(_ForwardIterator __first, _ForwardIterator __last) |
| 2328 { |
| 2329 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| 2330 value_type __tmp = _VSTD::move(*__first); |
| 2331 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first); |
| 2332 *__lm1 = _VSTD::move(__tmp); |
| 2333 return __lm1; |
| 2334 } |
| 2335 |
| 2336 template <class _BidirectionalIterator> |
| 2337 _BidirectionalIterator |
| 2338 __rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last) |
| 2339 { |
| 2340 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_t
ype; |
| 2341 _BidirectionalIterator __lm1 = _VSTD::prev(__last); |
| 2342 value_type __tmp = _VSTD::move(*__lm1); |
| 2343 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last); |
| 2344 *__first = _VSTD::move(__tmp); |
| 2345 return __fp1; |
| 2346 } |
| 2347 |
| 2348 template <class _ForwardIterator> |
| 2349 _ForwardIterator |
| 2350 __rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIt
erator __last) |
| 2351 { |
| 2352 _ForwardIterator __i = __middle; |
| 2353 while (true) |
| 2354 { |
| 2355 swap(*__first, *__i); |
| 2356 ++__first; |
| 2357 if (++__i == __last) |
| 2358 break; |
| 2359 if (__first == __middle) |
| 2360 __middle = __i; |
| 2361 } |
| 2362 _ForwardIterator __r = __first; |
| 2363 if (__first != __middle) |
| 2364 { |
| 2365 __i = __middle; |
| 2366 while (true) |
| 2367 { |
| 2368 swap(*__first, *__i); |
| 2369 ++__first; |
| 2370 if (++__i == __last) |
| 2371 { |
| 2372 if (__first == __middle) |
| 2373 break; |
| 2374 __i = __middle; |
| 2375 } |
| 2376 else if (__first == __middle) |
| 2377 __middle = __i; |
| 2378 } |
| 2379 } |
| 2380 return __r; |
| 2381 } |
| 2382 |
| 2383 template<typename _Integral> |
| 2384 inline _LIBCPP_INLINE_VISIBILITY |
| 2385 _Integral |
| 2386 __gcd(_Integral __x, _Integral __y) |
| 2387 { |
| 2388 do |
| 2389 { |
| 2390 _Integral __t = __x % __y; |
| 2391 __x = __y; |
| 2392 __y = __t; |
| 2393 } while (__y); |
| 2394 return __x; |
| 2395 } |
| 2396 |
| 2397 template<typename _RandomAccessIterator> |
| 2398 _RandomAccessIterator |
| 2399 __rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Ran
domAccessIterator __last) |
| 2400 { |
| 2401 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 2402 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 2403 |
| 2404 const difference_type __m1 = __middle - __first; |
| 2405 const difference_type __m2 = __last - __middle; |
| 2406 if (__m1 == __m2) |
| 2407 { |
| 2408 _VSTD::swap_ranges(__first, __middle, __middle); |
| 2409 return __middle; |
| 2410 } |
| 2411 const difference_type __g = _VSTD::__gcd(__m1, __m2); |
| 2412 for (_RandomAccessIterator __p = __first + __g; __p != __first;) |
| 2413 { |
| 2414 value_type __t(_VSTD::move(*--__p)); |
| 2415 _RandomAccessIterator __p1 = __p; |
| 2416 _RandomAccessIterator __p2 = __p1 + __m1; |
| 2417 do |
| 2418 { |
| 2419 *__p1 = _VSTD::move(*__p2); |
| 2420 __p1 = __p2; |
| 2421 const difference_type __d = __last - __p2; |
| 2422 if (__m1 < __d) |
| 2423 __p2 += __m1; |
| 2424 else |
| 2425 __p2 = __first + (__m1 - __d); |
| 2426 } while (__p2 != __p); |
| 2427 *__p1 = _VSTD::move(__t); |
| 2428 } |
| 2429 return __first + __m2; |
| 2430 } |
| 2431 |
| 2432 template <class _ForwardIterator> |
| 2433 inline _LIBCPP_INLINE_VISIBILITY |
| 2434 _ForwardIterator |
| 2435 __rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator _
_last, |
| 2436 _VSTD::forward_iterator_tag) |
| 2437 { |
| 2438 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_
type; |
| 2439 if (_VSTD::is_trivially_move_assignable<value_type>::value) |
| 2440 { |
| 2441 if (_VSTD::next(__first) == __middle) |
| 2442 return _VSTD::__rotate_left(__first, __last); |
| 2443 } |
| 2444 return _VSTD::__rotate_forward(__first, __middle, __last); |
| 2445 } |
| 2446 |
| 2447 template <class _BidirectionalIterator> |
| 2448 inline _LIBCPP_INLINE_VISIBILITY |
| 2449 _BidirectionalIterator |
| 2450 __rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _Bidir
ectionalIterator __last, |
| 2451 _VSTD::bidirectional_iterator_tag) |
| 2452 { |
| 2453 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type
value_type; |
| 2454 if (_VSTD::is_trivially_move_assignable<value_type>::value) |
| 2455 { |
| 2456 if (_VSTD::next(__first) == __middle) |
| 2457 return _VSTD::__rotate_left(__first, __last); |
| 2458 if (_VSTD::next(__middle) == __last) |
| 2459 return _VSTD::__rotate_right(__first, __last); |
| 2460 } |
| 2461 return _VSTD::__rotate_forward(__first, __middle, __last); |
| 2462 } |
| 2463 |
| 2464 template <class _RandomAccessIterator> |
| 2465 inline _LIBCPP_INLINE_VISIBILITY |
| 2466 _RandomAccessIterator |
| 2467 __rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomA
ccessIterator __last, |
| 2468 _VSTD::random_access_iterator_tag) |
| 2469 { |
| 2470 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type v
alue_type; |
| 2471 if (_VSTD::is_trivially_move_assignable<value_type>::value) |
| 2472 { |
| 2473 if (_VSTD::next(__first) == __middle) |
| 2474 return _VSTD::__rotate_left(__first, __last); |
| 2475 if (_VSTD::next(__middle) == __last) |
| 2476 return _VSTD::__rotate_right(__first, __last); |
| 2477 return _VSTD::__rotate_gcd(__first, __middle, __last); |
| 2478 } |
| 2479 return _VSTD::__rotate_forward(__first, __middle, __last); |
| 2480 } |
| 2481 |
| 2482 template <class _ForwardIterator> |
| 2483 inline _LIBCPP_INLINE_VISIBILITY |
| 2484 _ForwardIterator |
| 2485 rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __l
ast) |
| 2486 { |
| 2487 if (__first == __middle) |
| 2488 return __last; |
| 2489 if (__middle == __last) |
| 2490 return __first; |
| 2491 return _VSTD::__rotate(__first, __middle, __last, |
| 2492 typename _VSTD::iterator_traits<_ForwardIterator>::it
erator_category()); |
| 2493 } |
| 2494 |
| 2495 // rotate_copy |
| 2496 |
| 2497 template <class _ForwardIterator, class _OutputIterator> |
| 2498 inline _LIBCPP_INLINE_VISIBILITY |
| 2499 _OutputIterator |
| 2500 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterato
r __last, _OutputIterator __result) |
| 2501 { |
| 2502 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result
)); |
| 2503 } |
| 2504 |
| 2505 // min_element |
| 2506 |
| 2507 template <class _ForwardIterator, class _Compare> |
| 2508 inline _LIBCPP_INLINE_VISIBILITY |
| 2509 _ForwardIterator |
| 2510 min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) |
| 2511 { |
| 2512 if (__first != __last) |
| 2513 { |
| 2514 _ForwardIterator __i = __first; |
| 2515 while (++__i != __last) |
| 2516 if (__comp(*__i, *__first)) |
| 2517 __first = __i; |
| 2518 } |
| 2519 return __first; |
| 2520 } |
| 2521 |
| 2522 template <class _ForwardIterator> |
| 2523 inline _LIBCPP_INLINE_VISIBILITY |
| 2524 _ForwardIterator |
| 2525 min_element(_ForwardIterator __first, _ForwardIterator __last) |
| 2526 { |
| 2527 return _VSTD::min_element(__first, __last, |
| 2528 __less<typename iterator_traits<_ForwardIterator>::value_type>()); |
| 2529 } |
| 2530 |
| 2531 // min |
| 2532 |
| 2533 template <class _Tp, class _Compare> |
| 2534 inline _LIBCPP_INLINE_VISIBILITY |
| 2535 const _Tp& |
| 2536 min(const _Tp& __a, const _Tp& __b, _Compare __comp) |
| 2537 { |
| 2538 return __comp(__b, __a) ? __b : __a; |
| 2539 } |
| 2540 |
| 2541 template <class _Tp> |
| 2542 inline _LIBCPP_INLINE_VISIBILITY |
| 2543 const _Tp& |
| 2544 min(const _Tp& __a, const _Tp& __b) |
| 2545 { |
| 2546 return _VSTD::min(__a, __b, __less<_Tp>()); |
| 2547 } |
| 2548 |
| 2549 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2550 |
| 2551 template<class _Tp, class _Compare> |
| 2552 inline _LIBCPP_INLINE_VISIBILITY |
| 2553 _Tp |
| 2554 min(initializer_list<_Tp> __t, _Compare __comp) |
| 2555 { |
| 2556 return *_VSTD::min_element(__t.begin(), __t.end(), __comp); |
| 2557 } |
| 2558 |
| 2559 template<class _Tp> |
| 2560 inline _LIBCPP_INLINE_VISIBILITY |
| 2561 _Tp |
| 2562 min(initializer_list<_Tp> __t) |
| 2563 { |
| 2564 return *_VSTD::min_element(__t.begin(), __t.end()); |
| 2565 } |
| 2566 |
| 2567 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2568 |
| 2569 // max_element |
| 2570 |
| 2571 template <class _ForwardIterator, class _Compare> |
| 2572 inline _LIBCPP_INLINE_VISIBILITY |
| 2573 _ForwardIterator |
| 2574 max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) |
| 2575 { |
| 2576 if (__first != __last) |
| 2577 { |
| 2578 _ForwardIterator __i = __first; |
| 2579 while (++__i != __last) |
| 2580 if (__comp(*__first, *__i)) |
| 2581 __first = __i; |
| 2582 } |
| 2583 return __first; |
| 2584 } |
| 2585 |
| 2586 template <class _ForwardIterator> |
| 2587 inline _LIBCPP_INLINE_VISIBILITY |
| 2588 _ForwardIterator |
| 2589 max_element(_ForwardIterator __first, _ForwardIterator __last) |
| 2590 { |
| 2591 return _VSTD::max_element(__first, __last, |
| 2592 __less<typename iterator_traits<_ForwardIterator>::value_type>()); |
| 2593 } |
| 2594 |
| 2595 // max |
| 2596 |
| 2597 template <class _Tp, class _Compare> |
| 2598 inline _LIBCPP_INLINE_VISIBILITY |
| 2599 const _Tp& |
| 2600 max(const _Tp& __a, const _Tp& __b, _Compare __comp) |
| 2601 { |
| 2602 return __comp(__a, __b) ? __b : __a; |
| 2603 } |
| 2604 |
| 2605 template <class _Tp> |
| 2606 inline _LIBCPP_INLINE_VISIBILITY |
| 2607 const _Tp& |
| 2608 max(const _Tp& __a, const _Tp& __b) |
| 2609 { |
| 2610 return _VSTD::max(__a, __b, __less<_Tp>()); |
| 2611 } |
| 2612 |
| 2613 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2614 |
| 2615 template<class _Tp, class _Compare> |
| 2616 inline _LIBCPP_INLINE_VISIBILITY |
| 2617 _Tp |
| 2618 max(initializer_list<_Tp> __t, _Compare __comp) |
| 2619 { |
| 2620 return *_VSTD::max_element(__t.begin(), __t.end(), __comp); |
| 2621 } |
| 2622 |
| 2623 template<class _Tp> |
| 2624 inline _LIBCPP_INLINE_VISIBILITY |
| 2625 _Tp |
| 2626 max(initializer_list<_Tp> __t) |
| 2627 { |
| 2628 return *_VSTD::max_element(__t.begin(), __t.end()); |
| 2629 } |
| 2630 |
| 2631 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2632 |
| 2633 // minmax_element |
| 2634 |
| 2635 template <class _ForwardIterator, class _Compare> |
| 2636 std::pair<_ForwardIterator, _ForwardIterator> |
| 2637 minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __com
p) |
| 2638 { |
| 2639 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first); |
| 2640 if (__first != __last) |
| 2641 { |
| 2642 if (++__first != __last) |
| 2643 { |
| 2644 if (__comp(*__first, *__result.first)) |
| 2645 __result.first = __first; |
| 2646 else |
| 2647 __result.second = __first; |
| 2648 while (++__first != __last) |
| 2649 { |
| 2650 _ForwardIterator __i = __first; |
| 2651 if (++__first == __last) |
| 2652 { |
| 2653 if (__comp(*__i, *__result.first)) |
| 2654 __result.first = __i; |
| 2655 else if (!__comp(*__i, *__result.second)) |
| 2656 __result.second = __i; |
| 2657 break; |
| 2658 } |
| 2659 else |
| 2660 { |
| 2661 if (__comp(*__first, *__i)) |
| 2662 { |
| 2663 if (__comp(*__first, *__result.first)) |
| 2664 __result.first = __first; |
| 2665 if (!__comp(*__i, *__result.second)) |
| 2666 __result.second = __i; |
| 2667 } |
| 2668 else |
| 2669 { |
| 2670 if (__comp(*__i, *__result.first)) |
| 2671 __result.first = __i; |
| 2672 if (!__comp(*__first, *__result.second)) |
| 2673 __result.second = __first; |
| 2674 } |
| 2675 } |
| 2676 } |
| 2677 } |
| 2678 } |
| 2679 return __result; |
| 2680 } |
| 2681 |
| 2682 template <class _ForwardIterator> |
| 2683 inline _LIBCPP_INLINE_VISIBILITY |
| 2684 std::pair<_ForwardIterator, _ForwardIterator> |
| 2685 minmax_element(_ForwardIterator __first, _ForwardIterator __last) |
| 2686 { |
| 2687 return _VSTD::minmax_element(__first, __last, __less<typename iterator_trait
s<_ForwardIterator>::value_type>()); |
| 2688 } |
| 2689 |
| 2690 // minmax |
| 2691 |
| 2692 template<class _Tp, class _Compare> |
| 2693 inline _LIBCPP_INLINE_VISIBILITY |
| 2694 pair<const _Tp&, const _Tp&> |
| 2695 minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) |
| 2696 { |
| 2697 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) : |
| 2698 pair<const _Tp&, const _Tp&>(__a, __b); |
| 2699 } |
| 2700 |
| 2701 template<class _Tp> |
| 2702 inline _LIBCPP_INLINE_VISIBILITY |
| 2703 pair<const _Tp&, const _Tp&> |
| 2704 minmax(const _Tp& __a, const _Tp& __b) |
| 2705 { |
| 2706 return _VSTD::minmax(__a, __b, __less<_Tp>()); |
| 2707 } |
| 2708 |
| 2709 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2710 |
| 2711 template<class _Tp> |
| 2712 inline _LIBCPP_INLINE_VISIBILITY |
| 2713 pair<_Tp, _Tp> |
| 2714 minmax(initializer_list<_Tp> __t) |
| 2715 { |
| 2716 pair<const _Tp*, const _Tp*> __p = |
| 2717 _VSTD::minmax_element(__t.begin(), __t.end())
; |
| 2718 return pair<_Tp, _Tp>(*__p.first, *__p.second); |
| 2719 } |
| 2720 |
| 2721 template<class _Tp, class _Compare> |
| 2722 inline _LIBCPP_INLINE_VISIBILITY |
| 2723 pair<_Tp, _Tp> |
| 2724 minmax(initializer_list<_Tp> __t, _Compare __comp) |
| 2725 { |
| 2726 pair<const _Tp*, const _Tp*> __p = |
| 2727 _VSTD::minmax_element(__t.begin(), __t.end(), __comp)
; |
| 2728 return pair<_Tp, _Tp>(*__p.first, *__p.second); |
| 2729 } |
| 2730 |
| 2731 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
| 2732 |
| 2733 // random_shuffle |
| 2734 |
| 2735 // __independent_bits_engine |
| 2736 |
| 2737 template <unsigned long long _Xp, size_t _Rp> |
| 2738 struct __log2_imp |
| 2739 { |
| 2740 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp |
| 2741 : __log2_imp<_Xp, _Rp - 1>::value; |
| 2742 }; |
| 2743 |
| 2744 template <unsigned long long _Xp> |
| 2745 struct __log2_imp<_Xp, 0> |
| 2746 { |
| 2747 static const size_t value = 0; |
| 2748 }; |
| 2749 |
| 2750 template <size_t _Rp> |
| 2751 struct __log2_imp<0, _Rp> |
| 2752 { |
| 2753 static const size_t value = _Rp + 1; |
| 2754 }; |
| 2755 |
| 2756 template <class _UI, _UI _Xp> |
| 2757 struct __log2 |
| 2758 { |
| 2759 static const size_t value = __log2_imp<_Xp, |
| 2760 sizeof(_UI) * __CHAR_BIT__ - 1>::value; |
| 2761 }; |
| 2762 |
| 2763 template<class _Engine, class _UIntType> |
| 2764 class __independent_bits_engine |
| 2765 { |
| 2766 public: |
| 2767 // types |
| 2768 typedef _UIntType result_type; |
| 2769 |
| 2770 private: |
| 2771 typedef typename _Engine::result_type _Engine_result_type; |
| 2772 typedef typename conditional |
| 2773 < |
| 2774 sizeof(_Engine_result_type) <= sizeof(result_type), |
| 2775 result_type, |
| 2776 _Engine_result_type |
| 2777 >::type _Working_result_type; |
| 2778 |
| 2779 _Engine& __e_; |
| 2780 size_t __w_; |
| 2781 size_t __w0_; |
| 2782 size_t __n_; |
| 2783 size_t __n0_; |
| 2784 _Working_result_type __y0_; |
| 2785 _Working_result_type __y1_; |
| 2786 _Engine_result_type __mask0_; |
| 2787 _Engine_result_type __mask1_; |
| 2788 |
| 2789 #ifdef _LIBCPP_HAS_NO_CONSTEXPR |
| 2790 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min |
| 2791 + _Working_result_type(1); |
| 2792 #else |
| 2793 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _
Engine::min() |
| 2794 + _Working_result_type(1); |
| 2795 #endif |
| 2796 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp
>::value; |
| 2797 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_
type>::digits; |
| 2798 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_t
ype>::digits; |
| 2799 |
| 2800 public: |
| 2801 // constructors and seeding functions |
| 2802 __independent_bits_engine(_Engine& __e, size_t __w); |
| 2803 |
| 2804 // generating functions |
| 2805 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>())
;} |
| 2806 |
| 2807 private: |
| 2808 result_type __eval(false_type); |
| 2809 result_type __eval(true_type); |
| 2810 }; |
| 2811 |
| 2812 template<class _Engine, class _UIntType> |
| 2813 __independent_bits_engine<_Engine, _UIntType> |
| 2814 ::__independent_bits_engine(_Engine& __e, size_t __w) |
| 2815 : __e_(__e), |
| 2816 __w_(__w) |
| 2817 { |
| 2818 __n_ = __w_ / __m + (__w_ % __m != 0); |
| 2819 __w0_ = __w_ / __n_; |
| 2820 if (_Rp == 0) |
| 2821 __y0_ = _Rp; |
| 2822 else if (__w0_ < _WDt) |
| 2823 __y0_ = (_Rp >> __w0_) << __w0_; |
| 2824 else |
| 2825 __y0_ = 0; |
| 2826 if (_Rp - __y0_ > __y0_ / __n_) |
| 2827 { |
| 2828 ++__n_; |
| 2829 __w0_ = __w_ / __n_; |
| 2830 if (__w0_ < _WDt) |
| 2831 __y0_ = (_Rp >> __w0_) << __w0_; |
| 2832 else |
| 2833 __y0_ = 0; |
| 2834 } |
| 2835 __n0_ = __n_ - __w_ % __n_; |
| 2836 if (__w0_ < _WDt - 1) |
| 2837 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1); |
| 2838 else |
| 2839 __y1_ = 0; |
| 2840 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) : |
| 2841 _Engine_result_type(0); |
| 2842 __mask1_ = __w0_ < _EDt - 1 ? |
| 2843 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) : |
| 2844 _Engine_result_type(~0); |
| 2845 } |
| 2846 |
| 2847 template<class _Engine, class _UIntType> |
| 2848 inline |
| 2849 _UIntType |
| 2850 __independent_bits_engine<_Engine, _UIntType>::__eval(false_type) |
| 2851 { |
| 2852 return static_cast<result_type>(__e_() & __mask0_); |
| 2853 } |
| 2854 |
| 2855 template<class _Engine, class _UIntType> |
| 2856 _UIntType |
| 2857 __independent_bits_engine<_Engine, _UIntType>::__eval(true_type) |
| 2858 { |
| 2859 result_type _Sp = 0; |
| 2860 for (size_t __k = 0; __k < __n0_; ++__k) |
| 2861 { |
| 2862 _Engine_result_type __u; |
| 2863 do |
| 2864 { |
| 2865 __u = __e_() - _Engine::min(); |
| 2866 } while (__u >= __y0_); |
| 2867 if (__w0_ < _WDt) |
| 2868 _Sp <<= __w0_; |
| 2869 else |
| 2870 _Sp = 0; |
| 2871 _Sp += __u & __mask0_; |
| 2872 } |
| 2873 for (size_t __k = __n0_; __k < __n_; ++__k) |
| 2874 { |
| 2875 _Engine_result_type __u; |
| 2876 do |
| 2877 { |
| 2878 __u = __e_() - _Engine::min(); |
| 2879 } while (__u >= __y1_); |
| 2880 if (__w0_ < _WDt - 1) |
| 2881 _Sp <<= __w0_ + 1; |
| 2882 else |
| 2883 _Sp = 0; |
| 2884 _Sp += __u & __mask1_; |
| 2885 } |
| 2886 return _Sp; |
| 2887 } |
| 2888 |
| 2889 // uniform_int_distribution |
| 2890 |
| 2891 template<class _IntType = int> |
| 2892 class uniform_int_distribution |
| 2893 { |
| 2894 public: |
| 2895 // types |
| 2896 typedef _IntType result_type; |
| 2897 |
| 2898 class param_type |
| 2899 { |
| 2900 result_type __a_; |
| 2901 result_type __b_; |
| 2902 public: |
| 2903 typedef uniform_int_distribution distribution_type; |
| 2904 |
| 2905 explicit param_type(result_type __a = 0, |
| 2906 result_type __b = numeric_limits<result_type>::max()
) |
| 2907 : __a_(__a), __b_(__b) {} |
| 2908 |
| 2909 result_type a() const {return __a_;} |
| 2910 result_type b() const {return __b_;} |
| 2911 |
| 2912 friend bool operator==(const param_type& __x, const param_type& __y) |
| 2913 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} |
| 2914 friend bool operator!=(const param_type& __x, const param_type& __y) |
| 2915 {return !(__x == __y);} |
| 2916 }; |
| 2917 |
| 2918 private: |
| 2919 param_type __p_; |
| 2920 |
| 2921 public: |
| 2922 // constructors and reset functions |
| 2923 explicit uniform_int_distribution(result_type __a = 0, |
| 2924 result_type __b = numeric_limits<result_ty
pe>::max()) |
| 2925 : __p_(param_type(__a, __b)) {} |
| 2926 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {} |
| 2927 void reset() {} |
| 2928 |
| 2929 // generating functions |
| 2930 template<class _URNG> result_type operator()(_URNG& __g) |
| 2931 {return (*this)(__g, __p_);} |
| 2932 template<class _URNG> result_type operator()(_URNG& __g, const param_type& _
_p); |
| 2933 |
| 2934 // property functions |
| 2935 result_type a() const {return __p_.a();} |
| 2936 result_type b() const {return __p_.b();} |
| 2937 |
| 2938 param_type param() const {return __p_;} |
| 2939 void param(const param_type& __p) {__p_ = __p;} |
| 2940 |
| 2941 result_type min() const {return a();} |
| 2942 result_type max() const {return b();} |
| 2943 |
| 2944 friend bool operator==(const uniform_int_distribution& __x, |
| 2945 const uniform_int_distribution& __y) |
| 2946 {return __x.__p_ == __y.__p_;} |
| 2947 friend bool operator!=(const uniform_int_distribution& __x, |
| 2948 const uniform_int_distribution& __y) |
| 2949 {return !(__x == __y);} |
| 2950 }; |
| 2951 |
| 2952 template<class _IntType> |
| 2953 template<class _URNG> |
| 2954 typename uniform_int_distribution<_IntType>::result_type |
| 2955 uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p
) |
| 2956 { |
| 2957 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t), |
| 2958 uint32_t, uint64_t>::type _UIntType; |
| 2959 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1); |
| 2960 if (_Rp == 1) |
| 2961 return __p.a(); |
| 2962 const size_t _Dt = numeric_limits<_UIntType>::digits; |
| 2963 typedef __independent_bits_engine<_URNG, _UIntType> _Eng; |
| 2964 if (_Rp == 0) |
| 2965 return static_cast<result_type>(_Eng(__g, _Dt)()); |
| 2966 size_t __w = _Dt - __clz(_Rp) - 1; |
| 2967 if ((_Rp & (_UIntType(~0) >> (_Dt - __w))) != 0) |
| 2968 ++__w; |
| 2969 _Eng __e(__g, __w); |
| 2970 _UIntType __u; |
| 2971 do |
| 2972 { |
| 2973 __u = __e(); |
| 2974 } while (__u >= _Rp); |
| 2975 return static_cast<result_type>(__u + __p.a()); |
| 2976 } |
| 2977 |
| 2978 class _LIBCPP_TYPE_VIS __rs_default; |
| 2979 |
| 2980 _LIBCPP_FUNC_VIS __rs_default __rs_get(); |
| 2981 |
| 2982 class _LIBCPP_TYPE_VIS __rs_default |
| 2983 { |
| 2984 static unsigned __c_; |
| 2985 |
| 2986 __rs_default(); |
| 2987 public: |
| 2988 typedef uint_fast32_t result_type; |
| 2989 |
| 2990 static const result_type _Min = 0; |
| 2991 static const result_type _Max = 0xFFFFFFFF; |
| 2992 |
| 2993 __rs_default(const __rs_default&); |
| 2994 ~__rs_default(); |
| 2995 |
| 2996 result_type operator()(); |
| 2997 |
| 2998 static _LIBCPP_CONSTEXPR result_type min() {return _Min;} |
| 2999 static _LIBCPP_CONSTEXPR result_type max() {return _Max;} |
| 3000 |
| 3001 friend _LIBCPP_FUNC_VIS __rs_default __rs_get(); |
| 3002 }; |
| 3003 |
| 3004 _LIBCPP_FUNC_VIS __rs_default __rs_get(); |
| 3005 |
| 3006 template <class _RandomAccessIterator> |
| 3007 void |
| 3008 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 3009 { |
| 3010 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 3011 typedef uniform_int_distribution<ptrdiff_t> _Dp; |
| 3012 typedef typename _Dp::param_type _Pp; |
| 3013 difference_type __d = __last - __first; |
| 3014 if (__d > 1) |
| 3015 { |
| 3016 _Dp __uid; |
| 3017 __rs_default __g = __rs_get(); |
| 3018 for (--__last, --__d; __first < __last; ++__first, --__d) |
| 3019 { |
| 3020 difference_type __i = __uid(__g, _Pp(0, __d)); |
| 3021 if (__i != difference_type(0)) |
| 3022 swap(*__first, *(__first + __i)); |
| 3023 } |
| 3024 } |
| 3025 } |
| 3026 |
| 3027 template <class _RandomAccessIterator, class _RandomNumberGenerator> |
| 3028 void |
| 3029 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, |
| 3030 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
| 3031 _RandomNumberGenerator&& __rand) |
| 3032 #else |
| 3033 _RandomNumberGenerator& __rand) |
| 3034 #endif |
| 3035 { |
| 3036 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 3037 difference_type __d = __last - __first; |
| 3038 if (__d > 1) |
| 3039 { |
| 3040 for (--__last; __first < __last; ++__first, --__d) |
| 3041 { |
| 3042 difference_type __i = __rand(__d); |
| 3043 swap(*__first, *(__first + __i)); |
| 3044 } |
| 3045 } |
| 3046 } |
| 3047 |
| 3048 template<class _RandomAccessIterator, class _UniformRandomNumberGenerator> |
| 3049 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, |
| 3050 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
| 3051 _UniformRandomNumberGenerator&& __g) |
| 3052 #else |
| 3053 _UniformRandomNumberGenerator& __g) |
| 3054 #endif |
| 3055 { |
| 3056 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 3057 typedef uniform_int_distribution<ptrdiff_t> _Dp; |
| 3058 typedef typename _Dp::param_type _Pp; |
| 3059 difference_type __d = __last - __first; |
| 3060 if (__d > 1) |
| 3061 { |
| 3062 _Dp __uid; |
| 3063 for (--__last, --__d; __first < __last; ++__first, --__d) |
| 3064 { |
| 3065 difference_type __i = __uid(__g, _Pp(0, __d)); |
| 3066 if (__i != difference_type(0)) |
| 3067 swap(*__first, *(__first + __i)); |
| 3068 } |
| 3069 } |
| 3070 } |
| 3071 |
| 3072 template <class _InputIterator, class _Predicate> |
| 3073 bool |
| 3074 is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred) |
| 3075 { |
| 3076 for (; __first != __last; ++__first) |
| 3077 if (!__pred(*__first)) |
| 3078 break; |
| 3079 for (; __first != __last; ++__first) |
| 3080 if (__pred(*__first)) |
| 3081 return false; |
| 3082 return true; |
| 3083 } |
| 3084 |
| 3085 // partition |
| 3086 |
| 3087 template <class _Predicate, class _ForwardIterator> |
| 3088 _ForwardIterator |
| 3089 __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred
, forward_iterator_tag) |
| 3090 { |
| 3091 while (true) |
| 3092 { |
| 3093 if (__first == __last) |
| 3094 return __first; |
| 3095 if (!__pred(*__first)) |
| 3096 break; |
| 3097 ++__first; |
| 3098 } |
| 3099 for (_ForwardIterator __p = __first; ++__p != __last;) |
| 3100 { |
| 3101 if (__pred(*__p)) |
| 3102 { |
| 3103 swap(*__first, *__p); |
| 3104 ++__first; |
| 3105 } |
| 3106 } |
| 3107 return __first; |
| 3108 } |
| 3109 |
| 3110 template <class _Predicate, class _BidirectionalIterator> |
| 3111 _BidirectionalIterator |
| 3112 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Pred
icate __pred, |
| 3113 bidirectional_iterator_tag) |
| 3114 { |
| 3115 while (true) |
| 3116 { |
| 3117 while (true) |
| 3118 { |
| 3119 if (__first == __last) |
| 3120 return __first; |
| 3121 if (!__pred(*__first)) |
| 3122 break; |
| 3123 ++__first; |
| 3124 } |
| 3125 do |
| 3126 { |
| 3127 if (__first == --__last) |
| 3128 return __first; |
| 3129 } while (!__pred(*__last)); |
| 3130 swap(*__first, *__last); |
| 3131 ++__first; |
| 3132 } |
| 3133 } |
| 3134 |
| 3135 template <class _ForwardIterator, class _Predicate> |
| 3136 inline _LIBCPP_INLINE_VISIBILITY |
| 3137 _ForwardIterator |
| 3138 partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) |
| 3139 { |
| 3140 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type> |
| 3141 (__first, __last, __pred, typename iterator_traits<_
ForwardIterator>::iterator_category()); |
| 3142 } |
| 3143 |
| 3144 // partition_copy |
| 3145 |
| 3146 template <class _InputIterator, class _OutputIterator1, |
| 3147 class _OutputIterator2, class _Predicate> |
| 3148 pair<_OutputIterator1, _OutputIterator2> |
| 3149 partition_copy(_InputIterator __first, _InputIterator __last, |
| 3150 _OutputIterator1 __out_true, _OutputIterator2 __out_false, |
| 3151 _Predicate __pred) |
| 3152 { |
| 3153 for (; __first != __last; ++__first) |
| 3154 { |
| 3155 if (__pred(*__first)) |
| 3156 { |
| 3157 *__out_true = *__first; |
| 3158 ++__out_true; |
| 3159 } |
| 3160 else |
| 3161 { |
| 3162 *__out_false = *__first; |
| 3163 ++__out_false; |
| 3164 } |
| 3165 } |
| 3166 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); |
| 3167 } |
| 3168 |
| 3169 // partition_point |
| 3170 |
| 3171 template<class _ForwardIterator, class _Predicate> |
| 3172 _ForwardIterator |
| 3173 partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __
pred) |
| 3174 { |
| 3175 typedef typename iterator_traits<_ForwardIterator>::difference_type differen
ce_type; |
| 3176 difference_type __len = _VSTD::distance(__first, __last); |
| 3177 while (__len != 0) |
| 3178 { |
| 3179 difference_type __l2 = __len / 2; |
| 3180 _ForwardIterator __m = __first; |
| 3181 _VSTD::advance(__m, __l2); |
| 3182 if (__pred(*__m)) |
| 3183 { |
| 3184 __first = ++__m; |
| 3185 __len -= __l2 + 1; |
| 3186 } |
| 3187 else |
| 3188 __len = __l2; |
| 3189 } |
| 3190 return __first; |
| 3191 } |
| 3192 |
| 3193 // stable_partition |
| 3194 |
| 3195 template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair
> |
| 3196 _ForwardIterator |
| 3197 __stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate
__pred, |
| 3198 _Distance __len, _Pair __p, forward_iterator_tag __fit) |
| 3199 { |
| 3200 // *__first is known to be false |
| 3201 // __len >= 1 |
| 3202 if (__len == 1) |
| 3203 return __first; |
| 3204 if (__len == 2) |
| 3205 { |
| 3206 _ForwardIterator __m = __first; |
| 3207 if (__pred(*++__m)) |
| 3208 { |
| 3209 swap(*__first, *__m); |
| 3210 return __m; |
| 3211 } |
| 3212 return __first; |
| 3213 } |
| 3214 if (__len <= __p.second) |
| 3215 { // The buffer is big enough to use |
| 3216 typedef typename iterator_traits<_ForwardIterator>::value_type value_typ
e; |
| 3217 __destruct_n __d(0); |
| 3218 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); |
| 3219 // Move the falses into the temporary buffer, and the trues to the front
of the line |
| 3220 // Update __first to always point to the end of the trues |
| 3221 value_type* __t = __p.first; |
| 3222 ::new(__t) value_type(_VSTD::move(*__first)); |
| 3223 __d.__incr((value_type*)0); |
| 3224 ++__t; |
| 3225 _ForwardIterator __i = __first; |
| 3226 while (++__i != __last) |
| 3227 { |
| 3228 if (__pred(*__i)) |
| 3229 { |
| 3230 *__first = _VSTD::move(*__i); |
| 3231 ++__first; |
| 3232 } |
| 3233 else |
| 3234 { |
| 3235 ::new(__t) value_type(_VSTD::move(*__i)); |
| 3236 __d.__incr((value_type*)0); |
| 3237 ++__t; |
| 3238 } |
| 3239 } |
| 3240 // All trues now at start of range, all falses in buffer |
| 3241 // Move falses back into range, but don't mess up __first which points t
o first false |
| 3242 __i = __first; |
| 3243 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) |
| 3244 *__i = _VSTD::move(*__t2); |
| 3245 // __h destructs moved-from values out of the temp buffer, but doesn't d
eallocate buffer |
| 3246 return __first; |
| 3247 } |
| 3248 // Else not enough buffer, do in place |
| 3249 // __len >= 3 |
| 3250 _ForwardIterator __m = __first; |
| 3251 _Distance __len2 = __len / 2; // __len2 >= 2 |
| 3252 _VSTD::advance(__m, __len2); |
| 3253 // recurse on [__first, __m), *__first know to be false |
| 3254 // F????????????????? |
| 3255 // f m l |
| 3256 typedef typename add_lvalue_reference<_Predicate>::type _PredRef; |
| 3257 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m,
__pred, __len2, __p, __fit); |
| 3258 // TTTFFFFF?????????? |
| 3259 // f ff m l |
| 3260 // recurse on [__m, __last], except increase __m until *(__m) is false, *__l
ast know to be true |
| 3261 _ForwardIterator __m1 = __m; |
| 3262 _ForwardIterator __second_false = __last; |
| 3263 _Distance __len_half = __len - __len2; |
| 3264 while (__pred(*__m1)) |
| 3265 { |
| 3266 if (++__m1 == __last) |
| 3267 goto __second_half_done; |
| 3268 --__len_half; |
| 3269 } |
| 3270 // TTTFFFFFTTTF?????? |
| 3271 // f ff m m1 l |
| 3272 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_ha
lf, __p, __fit); |
| 3273 __second_half_done: |
| 3274 // TTTFFFFFTTTTTFFFFF |
| 3275 // f ff m sf l |
| 3276 return _VSTD::rotate(__first_false, __m, __second_false); |
| 3277 // TTTTTTTTFFFFFFFFFF |
| 3278 // | |
| 3279 } |
| 3280 |
| 3281 struct __return_temporary_buffer |
| 3282 { |
| 3283 template <class _Tp> |
| 3284 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_tem
porary_buffer(__p);} |
| 3285 }; |
| 3286 |
| 3287 template <class _Predicate, class _ForwardIterator> |
| 3288 _ForwardIterator |
| 3289 __stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate
__pred, |
| 3290 forward_iterator_tag) |
| 3291 { |
| 3292 const unsigned __alloc_limit = 3; // might want to make this a function of
trivial assignment |
| 3293 // Either prove all true and return __first or point to first false |
| 3294 while (true) |
| 3295 { |
| 3296 if (__first == __last) |
| 3297 return __first; |
| 3298 if (!__pred(*__first)) |
| 3299 break; |
| 3300 ++__first; |
| 3301 } |
| 3302 // We now have a reduced range [__first, __last) |
| 3303 // *__first is known to be false |
| 3304 typedef typename iterator_traits<_ForwardIterator>::difference_type differen
ce_type; |
| 3305 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| 3306 difference_type __len = _VSTD::distance(__first, __last); |
| 3307 pair<value_type*, ptrdiff_t> __p(0, 0); |
| 3308 unique_ptr<value_type, __return_temporary_buffer> __h; |
| 3309 if (__len >= __alloc_limit) |
| 3310 { |
| 3311 __p = _VSTD::get_temporary_buffer<value_type>(__len); |
| 3312 __h.reset(__p.first); |
| 3313 } |
| 3314 return __stable_partition<typename add_lvalue_reference<_Predicate>::type> |
| 3315 (__first, __last, __pred, __len, __p, forward_itera
tor_tag()); |
| 3316 } |
| 3317 |
| 3318 template <class _Predicate, class _BidirectionalIterator, class _Distance, class
_Pair> |
| 3319 _BidirectionalIterator |
| 3320 __stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last
, _Predicate __pred, |
| 3321 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit) |
| 3322 { |
| 3323 // *__first is known to be false |
| 3324 // *__last is known to be true |
| 3325 // __len >= 2 |
| 3326 if (__len == 2) |
| 3327 { |
| 3328 swap(*__first, *__last); |
| 3329 return __last; |
| 3330 } |
| 3331 if (__len == 3) |
| 3332 { |
| 3333 _BidirectionalIterator __m = __first; |
| 3334 if (__pred(*++__m)) |
| 3335 { |
| 3336 swap(*__first, *__m); |
| 3337 swap(*__m, *__last); |
| 3338 return __last; |
| 3339 } |
| 3340 swap(*__m, *__last); |
| 3341 swap(*__first, *__m); |
| 3342 return __m; |
| 3343 } |
| 3344 if (__len <= __p.second) |
| 3345 { // The buffer is big enough to use |
| 3346 typedef typename iterator_traits<_BidirectionalIterator>::value_type val
ue_type; |
| 3347 __destruct_n __d(0); |
| 3348 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); |
| 3349 // Move the falses into the temporary buffer, and the trues to the front
of the line |
| 3350 // Update __first to always point to the end of the trues |
| 3351 value_type* __t = __p.first; |
| 3352 ::new(__t) value_type(_VSTD::move(*__first)); |
| 3353 __d.__incr((value_type*)0); |
| 3354 ++__t; |
| 3355 _BidirectionalIterator __i = __first; |
| 3356 while (++__i != __last) |
| 3357 { |
| 3358 if (__pred(*__i)) |
| 3359 { |
| 3360 *__first = _VSTD::move(*__i); |
| 3361 ++__first; |
| 3362 } |
| 3363 else |
| 3364 { |
| 3365 ::new(__t) value_type(_VSTD::move(*__i)); |
| 3366 __d.__incr((value_type*)0); |
| 3367 ++__t; |
| 3368 } |
| 3369 } |
| 3370 // move *__last, known to be true |
| 3371 *__first = _VSTD::move(*__i); |
| 3372 __i = ++__first; |
| 3373 // All trues now at start of range, all falses in buffer |
| 3374 // Move falses back into range, but don't mess up __first which points t
o first false |
| 3375 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) |
| 3376 *__i = _VSTD::move(*__t2); |
| 3377 // __h destructs moved-from values out of the temp buffer, but doesn't d
eallocate buffer |
| 3378 return __first; |
| 3379 } |
| 3380 // Else not enough buffer, do in place |
| 3381 // __len >= 4 |
| 3382 _BidirectionalIterator __m = __first; |
| 3383 _Distance __len2 = __len / 2; // __len2 >= 2 |
| 3384 _VSTD::advance(__m, __len2); |
| 3385 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true,
*__first know to be false |
| 3386 // F????????????????T |
| 3387 // f m l |
| 3388 _BidirectionalIterator __m1 = __m; |
| 3389 _BidirectionalIterator __first_false = __first; |
| 3390 _Distance __len_half = __len2; |
| 3391 while (!__pred(*--__m1)) |
| 3392 { |
| 3393 if (__m1 == __first) |
| 3394 goto __first_half_done; |
| 3395 --__len_half; |
| 3396 } |
| 3397 // F???TFFF?????????T |
| 3398 // f m1 m l |
| 3399 typedef typename add_lvalue_reference<_Predicate>::type _PredRef; |
| 3400 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_ha
lf, __p, __bit); |
| 3401 __first_half_done: |
| 3402 // TTTFFFFF?????????T |
| 3403 // f ff m l |
| 3404 // recurse on [__m, __last], except increase __m until *(__m) is false, *__l
ast know to be true |
| 3405 __m1 = __m; |
| 3406 _BidirectionalIterator __second_false = __last; |
| 3407 ++__second_false; |
| 3408 __len_half = __len - __len2; |
| 3409 while (__pred(*__m1)) |
| 3410 { |
| 3411 if (++__m1 == __last) |
| 3412 goto __second_half_done; |
| 3413 --__len_half; |
| 3414 } |
| 3415 // TTTFFFFFTTTF?????T |
| 3416 // f ff m m1 l |
| 3417 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_ha
lf, __p, __bit); |
| 3418 __second_half_done: |
| 3419 // TTTFFFFFTTTTTFFFFF |
| 3420 // f ff m sf l |
| 3421 return _VSTD::rotate(__first_false, __m, __second_false); |
| 3422 // TTTTTTTTFFFFFFFFFF |
| 3423 // | |
| 3424 } |
| 3425 |
| 3426 template <class _Predicate, class _BidirectionalIterator> |
| 3427 _BidirectionalIterator |
| 3428 __stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last
, _Predicate __pred, |
| 3429 bidirectional_iterator_tag) |
| 3430 { |
| 3431 typedef typename iterator_traits<_BidirectionalIterator>::difference_type di
fference_type; |
| 3432 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_t
ype; |
| 3433 const difference_type __alloc_limit = 4; // might want to make this a funct
ion of trivial assignment |
| 3434 // Either prove all true and return __first or point to first false |
| 3435 while (true) |
| 3436 { |
| 3437 if (__first == __last) |
| 3438 return __first; |
| 3439 if (!__pred(*__first)) |
| 3440 break; |
| 3441 ++__first; |
| 3442 } |
| 3443 // __first points to first false, everything prior to __first is already set
. |
| 3444 // Either prove [__first, __last) is all false and return __first, or point
__last to last true |
| 3445 do |
| 3446 { |
| 3447 if (__first == --__last) |
| 3448 return __first; |
| 3449 } while (!__pred(*__last)); |
| 3450 // We now have a reduced range [__first, __last] |
| 3451 // *__first is known to be false |
| 3452 // *__last is known to be true |
| 3453 // __len >= 2 |
| 3454 difference_type __len = _VSTD::distance(__first, __last) + 1; |
| 3455 pair<value_type*, ptrdiff_t> __p(0, 0); |
| 3456 unique_ptr<value_type, __return_temporary_buffer> __h; |
| 3457 if (__len >= __alloc_limit) |
| 3458 { |
| 3459 __p = _VSTD::get_temporary_buffer<value_type>(__len); |
| 3460 __h.reset(__p.first); |
| 3461 } |
| 3462 return __stable_partition<typename add_lvalue_reference<_Predicate>::type> |
| 3463 (__first, __last, __pred, __len, __p, bidirectional
_iterator_tag()); |
| 3464 } |
| 3465 |
| 3466 template <class _ForwardIterator, class _Predicate> |
| 3467 inline _LIBCPP_INLINE_VISIBILITY |
| 3468 _ForwardIterator |
| 3469 stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate _
_pred) |
| 3470 { |
| 3471 return __stable_partition<typename add_lvalue_reference<_Predicate>::type> |
| 3472 (__first, __last, __pred, typename iterator_traits<
_ForwardIterator>::iterator_category()); |
| 3473 } |
| 3474 |
| 3475 // is_sorted_until |
| 3476 |
| 3477 template <class _ForwardIterator, class _Compare> |
| 3478 _ForwardIterator |
| 3479 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __co
mp) |
| 3480 { |
| 3481 if (__first != __last) |
| 3482 { |
| 3483 _ForwardIterator __i = __first; |
| 3484 while (++__i != __last) |
| 3485 { |
| 3486 if (__comp(*__i, *__first)) |
| 3487 return __i; |
| 3488 __first = __i; |
| 3489 } |
| 3490 } |
| 3491 return __last; |
| 3492 } |
| 3493 |
| 3494 template<class _ForwardIterator> |
| 3495 inline _LIBCPP_INLINE_VISIBILITY |
| 3496 _ForwardIterator |
| 3497 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last) |
| 3498 { |
| 3499 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_trai
ts<_ForwardIterator>::value_type>()); |
| 3500 } |
| 3501 |
| 3502 // is_sorted |
| 3503 |
| 3504 template <class _ForwardIterator, class _Compare> |
| 3505 inline _LIBCPP_INLINE_VISIBILITY |
| 3506 bool |
| 3507 is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) |
| 3508 { |
| 3509 return _VSTD::is_sorted_until(__first, __last, __comp) == __last; |
| 3510 } |
| 3511 |
| 3512 template<class _ForwardIterator> |
| 3513 inline _LIBCPP_INLINE_VISIBILITY |
| 3514 bool |
| 3515 is_sorted(_ForwardIterator __first, _ForwardIterator __last) |
| 3516 { |
| 3517 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_Fo
rwardIterator>::value_type>()); |
| 3518 } |
| 3519 |
| 3520 // sort |
| 3521 |
| 3522 // stable, 2-3 compares, 0-2 swaps |
| 3523 |
| 3524 template <class _Compare, class _ForwardIterator> |
| 3525 unsigned |
| 3526 __sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compa
re __c) |
| 3527 { |
| 3528 unsigned __r = 0; |
| 3529 if (!__c(*__y, *__x)) // if x <= y |
| 3530 { |
| 3531 if (!__c(*__z, *__y)) // if y <= z |
| 3532 return __r; // x <= y && y <= z |
| 3533 // x <= y && y > z |
| 3534 swap(*__y, *__z); // x <= z && y < z |
| 3535 __r = 1; |
| 3536 if (__c(*__y, *__x)) // if x > y |
| 3537 { |
| 3538 swap(*__x, *__y); // x < y && y <= z |
| 3539 __r = 2; |
| 3540 } |
| 3541 return __r; // x <= y && y < z |
| 3542 } |
| 3543 if (__c(*__z, *__y)) // x > y, if y > z |
| 3544 { |
| 3545 swap(*__x, *__z); // x < y && y < z |
| 3546 __r = 1; |
| 3547 return __r; |
| 3548 } |
| 3549 swap(*__x, *__y); // x > y && y <= z |
| 3550 __r = 1; // x < y && x <= z |
| 3551 if (__c(*__z, *__y)) // if y > z |
| 3552 { |
| 3553 swap(*__y, *__z); // x <= y && y < z |
| 3554 __r = 2; |
| 3555 } |
| 3556 return __r; |
| 3557 } // x <= y && y <= z |
| 3558 |
| 3559 // stable, 3-6 compares, 0-5 swaps |
| 3560 |
| 3561 template <class _Compare, class _ForwardIterator> |
| 3562 unsigned |
| 3563 __sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, |
| 3564 _ForwardIterator __x4, _Compare __c) |
| 3565 { |
| 3566 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c); |
| 3567 if (__c(*__x4, *__x3)) |
| 3568 { |
| 3569 swap(*__x3, *__x4); |
| 3570 ++__r; |
| 3571 if (__c(*__x3, *__x2)) |
| 3572 { |
| 3573 swap(*__x2, *__x3); |
| 3574 ++__r; |
| 3575 if (__c(*__x2, *__x1)) |
| 3576 { |
| 3577 swap(*__x1, *__x2); |
| 3578 ++__r; |
| 3579 } |
| 3580 } |
| 3581 } |
| 3582 return __r; |
| 3583 } |
| 3584 |
| 3585 // stable, 4-10 compares, 0-9 swaps |
| 3586 |
| 3587 template <class _Compare, class _ForwardIterator> |
| 3588 unsigned |
| 3589 __sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, |
| 3590 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c) |
| 3591 { |
| 3592 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c); |
| 3593 if (__c(*__x5, *__x4)) |
| 3594 { |
| 3595 swap(*__x4, *__x5); |
| 3596 ++__r; |
| 3597 if (__c(*__x4, *__x3)) |
| 3598 { |
| 3599 swap(*__x3, *__x4); |
| 3600 ++__r; |
| 3601 if (__c(*__x3, *__x2)) |
| 3602 { |
| 3603 swap(*__x2, *__x3); |
| 3604 ++__r; |
| 3605 if (__c(*__x2, *__x1)) |
| 3606 { |
| 3607 swap(*__x1, *__x2); |
| 3608 ++__r; |
| 3609 } |
| 3610 } |
| 3611 } |
| 3612 } |
| 3613 return __r; |
| 3614 } |
| 3615 |
| 3616 // Assumes size > 0 |
| 3617 template <class _Compare, class _BirdirectionalIterator> |
| 3618 void |
| 3619 __selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last
, _Compare __comp) |
| 3620 { |
| 3621 _BirdirectionalIterator __lm1 = __last; |
| 3622 for (--__lm1; __first != __lm1; ++__first) |
| 3623 { |
| 3624 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator
, |
| 3625 typename add_lvalue_refe
rence<_Compare>::type> |
| 3626 (__first, __last, __comp)
; |
| 3627 if (__i != __first) |
| 3628 swap(*__first, *__i); |
| 3629 } |
| 3630 } |
| 3631 |
| 3632 template <class _Compare, class _BirdirectionalIterator> |
| 3633 void |
| 3634 __insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last
, _Compare __comp) |
| 3635 { |
| 3636 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_
type; |
| 3637 if (__first != __last) |
| 3638 { |
| 3639 _BirdirectionalIterator __i = __first; |
| 3640 for (++__i; __i != __last; ++__i) |
| 3641 { |
| 3642 _BirdirectionalIterator __j = __i; |
| 3643 value_type __t(_VSTD::move(*__j)); |
| 3644 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t
, *--__k); --__j) |
| 3645 *__j = _VSTD::move(*__k); |
| 3646 *__j = _VSTD::move(__t); |
| 3647 } |
| 3648 } |
| 3649 } |
| 3650 |
| 3651 template <class _Compare, class _RandomAccessIterator> |
| 3652 void |
| 3653 __insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp) |
| 3654 { |
| 3655 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 3656 _RandomAccessIterator __j = __first+2; |
| 3657 __sort3<_Compare>(__first, __first+1, __j, __comp); |
| 3658 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) |
| 3659 { |
| 3660 if (__comp(*__i, *__j)) |
| 3661 { |
| 3662 value_type __t(_VSTD::move(*__i)); |
| 3663 _RandomAccessIterator __k = __j; |
| 3664 __j = __i; |
| 3665 do |
| 3666 { |
| 3667 *__j = _VSTD::move(*__k); |
| 3668 __j = __k; |
| 3669 } while (__j != __first && __comp(__t, *--__k)); |
| 3670 *__j = _VSTD::move(__t); |
| 3671 } |
| 3672 __j = __i; |
| 3673 } |
| 3674 } |
| 3675 |
| 3676 template <class _Compare, class _RandomAccessIterator> |
| 3677 bool |
| 3678 __insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator
__last, _Compare __comp) |
| 3679 { |
| 3680 switch (__last - __first) |
| 3681 { |
| 3682 case 0: |
| 3683 case 1: |
| 3684 return true; |
| 3685 case 2: |
| 3686 if (__comp(*--__last, *__first)) |
| 3687 swap(*__first, *__last); |
| 3688 return true; |
| 3689 case 3: |
| 3690 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp); |
| 3691 return true; |
| 3692 case 4: |
| 3693 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp
); |
| 3694 return true; |
| 3695 case 5: |
| 3696 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__l
ast, __comp); |
| 3697 return true; |
| 3698 } |
| 3699 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 3700 _RandomAccessIterator __j = __first+2; |
| 3701 __sort3<_Compare>(__first, __first+1, __j, __comp); |
| 3702 const unsigned __limit = 8; |
| 3703 unsigned __count = 0; |
| 3704 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) |
| 3705 { |
| 3706 if (__comp(*__i, *__j)) |
| 3707 { |
| 3708 value_type __t(_VSTD::move(*__i)); |
| 3709 _RandomAccessIterator __k = __j; |
| 3710 __j = __i; |
| 3711 do |
| 3712 { |
| 3713 *__j = _VSTD::move(*__k); |
| 3714 __j = __k; |
| 3715 } while (__j != __first && __comp(__t, *--__k)); |
| 3716 *__j = _VSTD::move(__t); |
| 3717 if (++__count == __limit) |
| 3718 return ++__i == __last; |
| 3719 } |
| 3720 __j = __i; |
| 3721 } |
| 3722 return true; |
| 3723 } |
| 3724 |
| 3725 template <class _Compare, class _BirdirectionalIterator> |
| 3726 void |
| 3727 __insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator
__last1, |
| 3728 typename iterator_traits<_BirdirectionalIterator>::value_t
ype* __first2, _Compare __comp) |
| 3729 { |
| 3730 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_
type; |
| 3731 if (__first1 != __last1) |
| 3732 { |
| 3733 __destruct_n __d(0); |
| 3734 unique_ptr<value_type, __destruct_n&> __h(__first2, __d); |
| 3735 value_type* __last2 = __first2; |
| 3736 ::new(__last2) value_type(_VSTD::move(*__first1)); |
| 3737 __d.__incr((value_type*)0); |
| 3738 for (++__last2; ++__first1 != __last1; ++__last2) |
| 3739 { |
| 3740 value_type* __j2 = __last2; |
| 3741 value_type* __i2 = __j2; |
| 3742 if (__comp(*__first1, *--__i2)) |
| 3743 { |
| 3744 ::new(__j2) value_type(_VSTD::move(*__i2)); |
| 3745 __d.__incr((value_type*)0); |
| 3746 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --
__j2) |
| 3747 *__j2 = _VSTD::move(*__i2); |
| 3748 *__j2 = _VSTD::move(*__first1); |
| 3749 } |
| 3750 else |
| 3751 { |
| 3752 ::new(__j2) value_type(_VSTD::move(*__first1)); |
| 3753 __d.__incr((value_type*)0); |
| 3754 } |
| 3755 } |
| 3756 __h.release(); |
| 3757 } |
| 3758 } |
| 3759 |
| 3760 template <class _Compare, class _RandomAccessIterator> |
| 3761 void |
| 3762 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __c
omp) |
| 3763 { |
| 3764 // _Compare is known to be a reference type |
| 3765 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 3766 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 3767 const difference_type __limit = is_trivially_copy_constructible<value_type>:
:value && |
| 3768 is_trivially_copy_assignable<value_type>::va
lue ? 30 : 6; |
| 3769 while (true) |
| 3770 { |
| 3771 __restart: |
| 3772 difference_type __len = __last - __first; |
| 3773 switch (__len) |
| 3774 { |
| 3775 case 0: |
| 3776 case 1: |
| 3777 return; |
| 3778 case 2: |
| 3779 if (__comp(*--__last, *__first)) |
| 3780 swap(*__first, *__last); |
| 3781 return; |
| 3782 case 3: |
| 3783 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp); |
| 3784 return; |
| 3785 case 4: |
| 3786 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __
comp); |
| 3787 return; |
| 3788 case 5: |
| 3789 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, -
-__last, __comp); |
| 3790 return; |
| 3791 } |
| 3792 if (__len <= __limit) |
| 3793 { |
| 3794 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp); |
| 3795 return; |
| 3796 } |
| 3797 // __len > 5 |
| 3798 _RandomAccessIterator __m = __first; |
| 3799 _RandomAccessIterator __lm1 = __last; |
| 3800 --__lm1; |
| 3801 unsigned __n_swaps; |
| 3802 { |
| 3803 difference_type __delta; |
| 3804 if (__len >= 1000) |
| 3805 { |
| 3806 __delta = __len/2; |
| 3807 __m += __delta; |
| 3808 __delta /= 2; |
| 3809 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m
, __m+__delta, __lm1, __comp); |
| 3810 } |
| 3811 else |
| 3812 { |
| 3813 __delta = __len/2; |
| 3814 __m += __delta; |
| 3815 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp); |
| 3816 } |
| 3817 } |
| 3818 // *__m is median |
| 3819 // partition [__first, __m) < *__m and *__m <= [__m, __last) |
| 3820 // (this inhibits tossing elements equivalent to __m around unnecessaril
y) |
| 3821 _RandomAccessIterator __i = __first; |
| 3822 _RandomAccessIterator __j = __lm1; |
| 3823 // j points beyond range to be tested, *__m is known to be <= *__lm1 |
| 3824 // The search going up is known to be guarded but the search coming down
isn't. |
| 3825 // Prime the downward search with a guard. |
| 3826 if (!__comp(*__i, *__m)) // if *__first == *__m |
| 3827 { |
| 3828 // *__first == *__m, *__first doesn't go in first part |
| 3829 // manually guard downward moving __j against __i |
| 3830 while (true) |
| 3831 { |
| 3832 if (__i == --__j) |
| 3833 { |
| 3834 // *__first == *__m, *__m <= all other elements |
| 3835 // Parition instead into [__first, __i) == *__first and *__f
irst < [__i, __last) |
| 3836 ++__i; // __first + 1 |
| 3837 __j = __last; |
| 3838 if (!__comp(*__first, *--__j)) // we need a guard if *__fir
st == *(__last-1) |
| 3839 { |
| 3840 while (true) |
| 3841 { |
| 3842 if (__i == __j) |
| 3843 return; // [__first, __last) all equivalent ele
ments |
| 3844 if (__comp(*__first, *__i)) |
| 3845 { |
| 3846 swap(*__i, *__j); |
| 3847 ++__n_swaps; |
| 3848 ++__i; |
| 3849 break; |
| 3850 } |
| 3851 ++__i; |
| 3852 } |
| 3853 } |
| 3854 // [__first, __i) == *__first and *__first < [__j, __last) a
nd __j == __last - 1 |
| 3855 if (__i == __j) |
| 3856 return; |
| 3857 while (true) |
| 3858 { |
| 3859 while (!__comp(*__first, *__i)) |
| 3860 ++__i; |
| 3861 while (__comp(*__first, *--__j)) |
| 3862 ; |
| 3863 if (__i >= __j) |
| 3864 break; |
| 3865 swap(*__i, *__j); |
| 3866 ++__n_swaps; |
| 3867 ++__i; |
| 3868 } |
| 3869 // [__first, __i) == *__first and *__first < [__i, __last) |
| 3870 // The first part is sorted, sort the secod part |
| 3871 // _VSTD::__sort<_Compare>(__i, __last, __comp); |
| 3872 __first = __i; |
| 3873 goto __restart; |
| 3874 } |
| 3875 if (__comp(*__j, *__m)) |
| 3876 { |
| 3877 swap(*__i, *__j); |
| 3878 ++__n_swaps; |
| 3879 break; // found guard for downward moving __j, now use ungu
arded partition |
| 3880 } |
| 3881 } |
| 3882 } |
| 3883 // It is known that *__i < *__m |
| 3884 ++__i; |
| 3885 // j points beyond range to be tested, *__m is known to be <= *__lm1 |
| 3886 // if not yet partitioned... |
| 3887 if (__i < __j) |
| 3888 { |
| 3889 // known that *(__i - 1) < *__m |
| 3890 // known that __i <= __m |
| 3891 while (true) |
| 3892 { |
| 3893 // __m still guards upward moving __i |
| 3894 while (__comp(*__i, *__m)) |
| 3895 ++__i; |
| 3896 // It is now known that a guard exists for downward moving __j |
| 3897 while (!__comp(*--__j, *__m)) |
| 3898 ; |
| 3899 if (__i > __j) |
| 3900 break; |
| 3901 swap(*__i, *__j); |
| 3902 ++__n_swaps; |
| 3903 // It is known that __m != __j |
| 3904 // If __m just moved, follow it |
| 3905 if (__m == __i) |
| 3906 __m = __j; |
| 3907 ++__i; |
| 3908 } |
| 3909 } |
| 3910 // [__first, __i) < *__m and *__m <= [__i, __last) |
| 3911 if (__i != __m && __comp(*__m, *__i)) |
| 3912 { |
| 3913 swap(*__i, *__m); |
| 3914 ++__n_swaps; |
| 3915 } |
| 3916 // [__first, __i) < *__i and *__i <= [__i+1, __last) |
| 3917 // If we were given a perfect partition, see if insertion sort is quick.
.. |
| 3918 if (__n_swaps == 0) |
| 3919 { |
| 3920 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __
i, __comp); |
| 3921 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __co
mp)) |
| 3922 { |
| 3923 if (__fs) |
| 3924 return; |
| 3925 __last = __i; |
| 3926 continue; |
| 3927 } |
| 3928 else |
| 3929 { |
| 3930 if (__fs) |
| 3931 { |
| 3932 __first = ++__i; |
| 3933 continue; |
| 3934 } |
| 3935 } |
| 3936 } |
| 3937 // sort smaller range with recursive call and larger with tail recursion
elimination |
| 3938 if (__i - __first < __last - __i) |
| 3939 { |
| 3940 _VSTD::__sort<_Compare>(__first, __i, __comp); |
| 3941 // _VSTD::__sort<_Compare>(__i+1, __last, __comp); |
| 3942 __first = ++__i; |
| 3943 } |
| 3944 else |
| 3945 { |
| 3946 _VSTD::__sort<_Compare>(__i+1, __last, __comp); |
| 3947 // _VSTD::__sort<_Compare>(__first, __i, __comp); |
| 3948 __last = __i; |
| 3949 } |
| 3950 } |
| 3951 } |
| 3952 |
| 3953 // This forwarder keeps the top call and the recursive calls using the same inst
antiation, forcing a reference _Compare |
| 3954 template <class _RandomAccessIterator, class _Compare> |
| 3955 inline _LIBCPP_INLINE_VISIBILITY |
| 3956 void |
| 3957 sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __com
p) |
| 3958 { |
| 3959 #ifdef _LIBCPP_DEBUG |
| 3960 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 3961 __debug_less<_Compare> __c(__comp); |
| 3962 __sort<_Comp_ref>(__first, __last, __c); |
| 3963 #else // _LIBCPP_DEBUG |
| 3964 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 3965 __sort<_Comp_ref>(__first, __last, __comp); |
| 3966 #endif // _LIBCPP_DEBUG |
| 3967 } |
| 3968 |
| 3969 template <class _RandomAccessIterator> |
| 3970 inline _LIBCPP_INLINE_VISIBILITY |
| 3971 void |
| 3972 sort(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 3973 { |
| 3974 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIt
erator>::value_type>()); |
| 3975 } |
| 3976 |
| 3977 template <class _Tp> |
| 3978 inline _LIBCPP_INLINE_VISIBILITY |
| 3979 void |
| 3980 sort(_Tp** __first, _Tp** __last) |
| 3981 { |
| 3982 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>()); |
| 3983 } |
| 3984 |
| 3985 template <class _Tp> |
| 3986 inline _LIBCPP_INLINE_VISIBILITY |
| 3987 void |
| 3988 sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last) |
| 3989 { |
| 3990 _VSTD::sort(__first.base(), __last.base()); |
| 3991 } |
| 3992 |
| 3993 template <class _Tp, class _Compare> |
| 3994 inline _LIBCPP_INLINE_VISIBILITY |
| 3995 void |
| 3996 sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp) |
| 3997 { |
| 3998 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 3999 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp); |
| 4000 } |
| 4001 |
| 4002 #ifdef _LIBCPP_MSVC |
| 4003 #pragma warning( push ) |
| 4004 #pragma warning( disable: 4231) |
| 4005 #endif // _LIBCPP_MSVC |
| 4006 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*
, char*, __less<char>&)) |
| 4007 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>
(wchar_t*, wchar_t*, __less<wchar_t>&)) |
| 4008 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signe
d char*>(signed char*, signed char*, __less<signed char>&)) |
| 4009 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, uns
igned char*>(unsigned char*, unsigned char*, __less<unsigned char>&)) |
| 4010 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(sho
rt*, short*, __less<short>&)) |
| 4011 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, un
signed short*>(unsigned short*, unsigned short*, __less<unsigned short>&)) |
| 4012 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, i
nt*, __less<int>&)) |
| 4013 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned
*>(unsigned*, unsigned*, __less<unsigned>&)) |
| 4014 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*
, long*, __less<long>&)) |
| 4015 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, uns
igned long*>(unsigned long*, unsigned long*, __less<unsigned long>&)) |
| 4016 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long lo
ng*>(long long*, long long*, __less<long long>&)) |
| 4017 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long long>&
, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned
long long>&)) |
| 4018 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(flo
at*, float*, __less<float>&)) |
| 4019 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(d
ouble*, double*, __less<double>&)) |
| 4020 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long
double*>(long double*, long double*, __less<long double>&)) |
| 4021 |
| 4022 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<char>&, char*>(char*, char*, __less<char>&)) |
| 4023 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&)) |
| 4024 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&)) |
| 4025 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigne
d char>&)) |
| 4026 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<short>&, short*>(short*, short*, __less<short>&)) |
| 4027 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<uns
igned short>&)) |
| 4028 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<int>&, int*>(int*, int*, __less<int>&)) |
| 4029 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&)) |
| 4030 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<long>&, long*>(long*, long*, __less<long>&)) |
| 4031 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigne
d long>&)) |
| 4032 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<long long>&, long long*>(long long*, long long*, __less<long long>&)) |
| 4033 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long l
ong*, __less<unsigned long long>&)) |
| 4034 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<float>&, float*>(float*, float*, __less<float>&)) |
| 4035 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<double>&, double*>(double*, double*, __less<double>&)) |
| 4036 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less
<long double>&, long double*>(long double*, long double*, __less<long double>&)) |
| 4037 |
| 4038 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS unsigned __sort5<__less<long double>&,
long double*>(long double*, long double*, long double*, long double*, long doubl
e*, __less<long double>&)) |
| 4039 #ifdef _LIBCPP_MSVC |
| 4040 #pragma warning( pop ) |
| 4041 #endif // _LIBCPP_MSVC |
| 4042 |
| 4043 // lower_bound |
| 4044 |
| 4045 template <class _Compare, class _ForwardIterator, class _Tp> |
| 4046 _ForwardIterator |
| 4047 __lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
lue_, _Compare __comp) |
| 4048 { |
| 4049 typedef typename iterator_traits<_ForwardIterator>::difference_type differen
ce_type; |
| 4050 difference_type __len = _VSTD::distance(__first, __last); |
| 4051 while (__len != 0) |
| 4052 { |
| 4053 difference_type __l2 = __len / 2; |
| 4054 _ForwardIterator __m = __first; |
| 4055 _VSTD::advance(__m, __l2); |
| 4056 if (__comp(*__m, __value_)) |
| 4057 { |
| 4058 __first = ++__m; |
| 4059 __len -= __l2 + 1; |
| 4060 } |
| 4061 else |
| 4062 __len = __l2; |
| 4063 } |
| 4064 return __first; |
| 4065 } |
| 4066 |
| 4067 template <class _ForwardIterator, class _Tp, class _Compare> |
| 4068 inline _LIBCPP_INLINE_VISIBILITY |
| 4069 _ForwardIterator |
| 4070 lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_, _Compare __comp) |
| 4071 { |
| 4072 #ifdef _LIBCPP_DEBUG |
| 4073 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4074 __debug_less<_Compare> __c(__comp); |
| 4075 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c); |
| 4076 #else // _LIBCPP_DEBUG |
| 4077 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4078 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp); |
| 4079 #endif // _LIBCPP_DEBUG |
| 4080 } |
| 4081 |
| 4082 template <class _ForwardIterator, class _Tp> |
| 4083 inline _LIBCPP_INLINE_VISIBILITY |
| 4084 _ForwardIterator |
| 4085 lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_) |
| 4086 { |
| 4087 return _VSTD::lower_bound(__first, __last, __value_, |
| 4088 __less<typename iterator_traits<_ForwardIterator>::
value_type, _Tp>()); |
| 4089 } |
| 4090 |
| 4091 // upper_bound |
| 4092 |
| 4093 template <class _Compare, class _ForwardIterator, class _Tp> |
| 4094 _ForwardIterator |
| 4095 __upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
lue_, _Compare __comp) |
| 4096 { |
| 4097 typedef typename iterator_traits<_ForwardIterator>::difference_type differen
ce_type; |
| 4098 difference_type __len = _VSTD::distance(__first, __last); |
| 4099 while (__len != 0) |
| 4100 { |
| 4101 difference_type __l2 = __len / 2; |
| 4102 _ForwardIterator __m = __first; |
| 4103 _VSTD::advance(__m, __l2); |
| 4104 if (__comp(__value_, *__m)) |
| 4105 __len = __l2; |
| 4106 else |
| 4107 { |
| 4108 __first = ++__m; |
| 4109 __len -= __l2 + 1; |
| 4110 } |
| 4111 } |
| 4112 return __first; |
| 4113 } |
| 4114 |
| 4115 template <class _ForwardIterator, class _Tp, class _Compare> |
| 4116 inline _LIBCPP_INLINE_VISIBILITY |
| 4117 _ForwardIterator |
| 4118 upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_, _Compare __comp) |
| 4119 { |
| 4120 #ifdef _LIBCPP_DEBUG |
| 4121 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4122 __debug_less<_Compare> __c(__comp); |
| 4123 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c); |
| 4124 #else // _LIBCPP_DEBUG |
| 4125 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4126 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp); |
| 4127 #endif // _LIBCPP_DEBUG |
| 4128 } |
| 4129 |
| 4130 template <class _ForwardIterator, class _Tp> |
| 4131 inline _LIBCPP_INLINE_VISIBILITY |
| 4132 _ForwardIterator |
| 4133 upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_) |
| 4134 { |
| 4135 return _VSTD::upper_bound(__first, __last, __value_, |
| 4136 __less<_Tp, typename iterator_traits<_ForwardIterat
or>::value_type>()); |
| 4137 } |
| 4138 |
| 4139 // equal_range |
| 4140 |
| 4141 template <class _Compare, class _ForwardIterator, class _Tp> |
| 4142 pair<_ForwardIterator, _ForwardIterator> |
| 4143 __equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
lue_, _Compare __comp) |
| 4144 { |
| 4145 typedef typename iterator_traits<_ForwardIterator>::difference_type differen
ce_type; |
| 4146 difference_type __len = _VSTD::distance(__first, __last); |
| 4147 while (__len != 0) |
| 4148 { |
| 4149 difference_type __l2 = __len / 2; |
| 4150 _ForwardIterator __m = __first; |
| 4151 _VSTD::advance(__m, __l2); |
| 4152 if (__comp(*__m, __value_)) |
| 4153 { |
| 4154 __first = ++__m; |
| 4155 __len -= __l2 + 1; |
| 4156 } |
| 4157 else if (__comp(__value_, *__m)) |
| 4158 { |
| 4159 __last = __m; |
| 4160 __len = __l2; |
| 4161 } |
| 4162 else |
| 4163 { |
| 4164 _ForwardIterator __mp1 = __m; |
| 4165 return pair<_ForwardIterator, _ForwardIterator> |
| 4166 ( |
| 4167 __lower_bound<_Compare>(__first, __m, __value_, __comp), |
| 4168 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp) |
| 4169 ); |
| 4170 } |
| 4171 } |
| 4172 return pair<_ForwardIterator, _ForwardIterator>(__first, __first); |
| 4173 } |
| 4174 |
| 4175 template <class _ForwardIterator, class _Tp, class _Compare> |
| 4176 inline _LIBCPP_INLINE_VISIBILITY |
| 4177 pair<_ForwardIterator, _ForwardIterator> |
| 4178 equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_, _Compare __comp) |
| 4179 { |
| 4180 #ifdef _LIBCPP_DEBUG |
| 4181 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4182 __debug_less<_Compare> __c(__comp); |
| 4183 return __equal_range<_Comp_ref>(__first, __last, __value_, __c); |
| 4184 #else // _LIBCPP_DEBUG |
| 4185 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4186 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp); |
| 4187 #endif // _LIBCPP_DEBUG |
| 4188 } |
| 4189 |
| 4190 template <class _ForwardIterator, class _Tp> |
| 4191 inline _LIBCPP_INLINE_VISIBILITY |
| 4192 pair<_ForwardIterator, _ForwardIterator> |
| 4193 equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
e_) |
| 4194 { |
| 4195 return _VSTD::equal_range(__first, __last, __value_, |
| 4196 __less<typename iterator_traits<_ForwardIterator>::
value_type, _Tp>()); |
| 4197 } |
| 4198 |
| 4199 // binary_search |
| 4200 |
| 4201 template <class _Compare, class _ForwardIterator, class _Tp> |
| 4202 inline _LIBCPP_INLINE_VISIBILITY |
| 4203 bool |
| 4204 __binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __
value_, _Compare __comp) |
| 4205 { |
| 4206 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp); |
| 4207 return __first != __last && !__comp(__value_, *__first); |
| 4208 } |
| 4209 |
| 4210 template <class _ForwardIterator, class _Tp, class _Compare> |
| 4211 inline _LIBCPP_INLINE_VISIBILITY |
| 4212 bool |
| 4213 binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
lue_, _Compare __comp) |
| 4214 { |
| 4215 #ifdef _LIBCPP_DEBUG |
| 4216 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4217 __debug_less<_Compare> __c(__comp); |
| 4218 return __binary_search<_Comp_ref>(__first, __last, __value_, __c); |
| 4219 #else // _LIBCPP_DEBUG |
| 4220 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4221 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp); |
| 4222 #endif // _LIBCPP_DEBUG |
| 4223 } |
| 4224 |
| 4225 template <class _ForwardIterator, class _Tp> |
| 4226 inline _LIBCPP_INLINE_VISIBILITY |
| 4227 bool |
| 4228 binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
lue_) |
| 4229 { |
| 4230 return _VSTD::binary_search(__first, __last, __value_, |
| 4231 __less<typename iterator_traits<_ForwardIterator>::
value_type, _Tp>()); |
| 4232 } |
| 4233 |
| 4234 // merge |
| 4235 |
| 4236 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 4237 _OutputIterator |
| 4238 __merge(_InputIterator1 __first1, _InputIterator1 __last1, |
| 4239 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __res
ult, _Compare __comp) |
| 4240 { |
| 4241 for (; __first1 != __last1; ++__result) |
| 4242 { |
| 4243 if (__first2 == __last2) |
| 4244 return _VSTD::copy(__first1, __last1, __result); |
| 4245 if (__comp(*__first2, *__first1)) |
| 4246 { |
| 4247 *__result = *__first2; |
| 4248 ++__first2; |
| 4249 } |
| 4250 else |
| 4251 { |
| 4252 *__result = *__first1; |
| 4253 ++__first1; |
| 4254 } |
| 4255 } |
| 4256 return _VSTD::copy(__first2, __last2, __result); |
| 4257 } |
| 4258 |
| 4259 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _Compare> |
| 4260 inline _LIBCPP_INLINE_VISIBILITY |
| 4261 _OutputIterator |
| 4262 merge(_InputIterator1 __first1, _InputIterator1 __last1, |
| 4263 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __resul
t, _Compare __comp) |
| 4264 { |
| 4265 #ifdef _LIBCPP_DEBUG |
| 4266 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4267 __debug_less<_Compare> __c(__comp); |
| 4268 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __res
ult, __c); |
| 4269 #else // _LIBCPP_DEBUG |
| 4270 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4271 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __res
ult, __comp); |
| 4272 #endif // _LIBCPP_DEBUG |
| 4273 } |
| 4274 |
| 4275 template <class _InputIterator1, class _InputIterator2, class _OutputIterator> |
| 4276 inline _LIBCPP_INLINE_VISIBILITY |
| 4277 _OutputIterator |
| 4278 merge(_InputIterator1 __first1, _InputIterator1 __last1, |
| 4279 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __resul
t) |
| 4280 { |
| 4281 typedef typename iterator_traits<_InputIterator1>::value_type __v1; |
| 4282 typedef typename iterator_traits<_InputIterator2>::value_type __v2; |
| 4283 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __
v2>()); |
| 4284 } |
| 4285 |
| 4286 // inplace_merge |
| 4287 |
| 4288 template <class _Compare, class _BidirectionalIterator> |
| 4289 void |
| 4290 __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
__middle, _BidirectionalIterator __last, |
| 4291 _Compare __comp, typename iterator_traits<_BidirectionalIterator
>::difference_type __len1, |
| 4292 typename iterator_traits<_BidirectionalIterator
>::difference_type __len2, |
| 4293 typename iterator_traits<_BidirectionalIterator>::value_type* __
buff) |
| 4294 { |
| 4295 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_t
ype; |
| 4296 typedef typename iterator_traits<_BidirectionalIterator>::difference_type di
fference_type; |
| 4297 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer; |
| 4298 __destruct_n __d(0); |
| 4299 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); |
| 4300 if (__len1 <= __len2) |
| 4301 { |
| 4302 value_type* __p = __buff; |
| 4303 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((
value_type*)0), ++__i, ++__p) |
| 4304 ::new(__p) value_type(_VSTD::move(*__i)); |
| 4305 __merge<_Compare>(move_iterator<value_type*>(__buff), |
| 4306 move_iterator<value_type*>(__p), |
| 4307 move_iterator<_BidirectionalIterator>(__middle), |
| 4308 move_iterator<_BidirectionalIterator>(__last), |
| 4309 __first, __comp); |
| 4310 } |
| 4311 else |
| 4312 { |
| 4313 value_type* __p = __buff; |
| 4314 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((v
alue_type*)0), ++__i, ++__p) |
| 4315 ::new(__p) value_type(_VSTD::move(*__i)); |
| 4316 typedef reverse_iterator<_BidirectionalIterator> _RBi; |
| 4317 typedef reverse_iterator<value_type*> _Rv; |
| 4318 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__
first)), |
| 4319 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)), |
| 4320 _RBi(__last), __negate<_Compare>(__comp)); |
| 4321 } |
| 4322 } |
| 4323 |
| 4324 template <class _Compare, class _BidirectionalIterator> |
| 4325 void |
| 4326 __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
_BidirectionalIterator __last, |
| 4327 _Compare __comp, typename iterator_traits<_BidirectionalIterator
>::difference_type __len1, |
| 4328 typename iterator_traits<_BidirectionalIterator
>::difference_type __len2, |
| 4329 typename iterator_traits<_BidirectionalIterator>::value_type* __
buff, ptrdiff_t __buff_size) |
| 4330 { |
| 4331 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_t
ype; |
| 4332 typedef typename iterator_traits<_BidirectionalIterator>::difference_type di
fference_type; |
| 4333 while (true) |
| 4334 { |
| 4335 // if __middle == __last, we're done |
| 4336 if (__len2 == 0) |
| 4337 return; |
| 4338 // shrink [__first, __middle) as much as possible (with no moves), retur
ning if it shrinks to 0 |
| 4339 for (; true; ++__first, --__len1) |
| 4340 { |
| 4341 if (__len1 == 0) |
| 4342 return; |
| 4343 if (__comp(*__middle, *__first)) |
| 4344 break; |
| 4345 } |
| 4346 if (__len1 <= __buff_size || __len2 <= __buff_size) |
| 4347 { |
| 4348 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp
, __len1, __len2, __buff); |
| 4349 return; |
| 4350 } |
| 4351 // __first < __middle < __last |
| 4352 // *__first > *__middle |
| 4353 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __
last) such that |
| 4354 // all elements in: |
| 4355 // [__first, __m1) <= [__middle, __m2) |
| 4356 // [__middle, __m2) < [__m1, __middle) |
| 4357 // [__m1, __middle) <= [__m2, __last) |
| 4358 // and __m1 or __m2 is in the middle of its range |
| 4359 _BidirectionalIterator __m1; // "median" of [__first, __middle) |
| 4360 _BidirectionalIterator __m2; // "median" of [__middle, __last) |
| 4361 difference_type __len11; // distance(__first, __m1) |
| 4362 difference_type __len21; // distance(__middle, __m2) |
| 4363 // binary search smaller range |
| 4364 if (__len1 < __len2) |
| 4365 { // __len >= 1, __len2 >= 2 |
| 4366 __len21 = __len2 / 2; |
| 4367 __m2 = __middle; |
| 4368 _VSTD::advance(__m2, __len21); |
| 4369 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp); |
| 4370 __len11 = _VSTD::distance(__first, __m1); |
| 4371 } |
| 4372 else |
| 4373 { |
| 4374 if (__len1 == 1) |
| 4375 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1 |
| 4376 // It is known *__first > *__middle |
| 4377 swap(*__first, *__middle); |
| 4378 return; |
| 4379 } |
| 4380 // __len1 >= 2, __len2 >= 1 |
| 4381 __len11 = __len1 / 2; |
| 4382 __m1 = __first; |
| 4383 _VSTD::advance(__m1, __len11); |
| 4384 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp); |
| 4385 __len21 = _VSTD::distance(__middle, __m2); |
| 4386 } |
| 4387 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle) |
| 4388 difference_type __len22 = __len2 - __len21; // distance(__m2, __last) |
| 4389 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) |
| 4390 // swap middle two partitions |
| 4391 __middle = _VSTD::rotate(__m1, __middle, __m2); |
| 4392 // __len12 and __len21 now have swapped meanings |
| 4393 // merge smaller range with recurisve call and larger with tail recursio
n elimination |
| 4394 if (__len11 + __len21 < __len12 + __len22) |
| 4395 { |
| 4396 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11,
__len21, __buff, __buff_size); |
| 4397 // __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, _
_len22, __buff, __buff_size); |
| 4398 __first = __middle; |
| 4399 __middle = __m2; |
| 4400 __len1 = __len12; |
| 4401 __len2 = __len22; |
| 4402 } |
| 4403 else |
| 4404 { |
| 4405 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, _
_len22, __buff, __buff_size); |
| 4406 // __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11,
__len21, __buff, __buff_size); |
| 4407 __last = __middle; |
| 4408 __middle = __m1; |
| 4409 __len1 = __len11; |
| 4410 __len2 = __len21; |
| 4411 } |
| 4412 } |
| 4413 } |
| 4414 |
| 4415 template <class _Tp> |
| 4416 struct __inplace_merge_switch |
| 4417 { |
| 4418 static const unsigned value = is_trivially_copy_assignable<_Tp>::value; |
| 4419 }; |
| 4420 |
| 4421 template <class _BidirectionalIterator, class _Compare> |
| 4422 inline _LIBCPP_INLINE_VISIBILITY |
| 4423 void |
| 4424 inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _
BidirectionalIterator __last, |
| 4425 _Compare __comp) |
| 4426 { |
| 4427 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_t
ype; |
| 4428 typedef typename iterator_traits<_BidirectionalIterator>::difference_type di
fference_type; |
| 4429 difference_type __len1 = _VSTD::distance(__first, __middle); |
| 4430 difference_type __len2 = _VSTD::distance(__middle, __last); |
| 4431 difference_type __buf_size = _VSTD::min(__len1, __len2); |
| 4432 pair<value_type*, ptrdiff_t> __buf(0, 0); |
| 4433 unique_ptr<value_type, __return_temporary_buffer> __h; |
| 4434 if (__inplace_merge_switch<value_type>::value && __buf_size > 8) |
| 4435 { |
| 4436 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size); |
| 4437 __h.reset(__buf.first); |
| 4438 } |
| 4439 #ifdef _LIBCPP_DEBUG |
| 4440 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4441 __debug_less<_Compare> __c(__comp); |
| 4442 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __l
en1, __len2, |
| 4443 __buf.first, __buf.second); |
| 4444 #else // _LIBCPP_DEBUG |
| 4445 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4446 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp,
__len1, __len2, |
| 4447 __buf.first, __buf.second); |
| 4448 #endif // _LIBCPP_DEBUG |
| 4449 } |
| 4450 |
| 4451 template <class _BidirectionalIterator> |
| 4452 inline _LIBCPP_INLINE_VISIBILITY |
| 4453 void |
| 4454 inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _
BidirectionalIterator __last) |
| 4455 { |
| 4456 _VSTD::inplace_merge(__first, __middle, __last, |
| 4457 __less<typename iterator_traits<_BidirectionalIterator>:
:value_type>()); |
| 4458 } |
| 4459 |
| 4460 // stable_sort |
| 4461 |
| 4462 template <class _Compare, class _InputIterator1, class _InputIterator2> |
| 4463 void |
| 4464 __merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1, |
| 4465 _InputIterator2 __first2, _InputIterator2 __last2, |
| 4466 typename iterator_traits<_InputIterator1>::value_type* __result, _Compar
e __comp) |
| 4467 { |
| 4468 typedef typename iterator_traits<_InputIterator1>::value_type value_type; |
| 4469 __destruct_n __d(0); |
| 4470 unique_ptr<value_type, __destruct_n&> __h(__result, __d); |
| 4471 for (; true; ++__result) |
| 4472 { |
| 4473 if (__first1 == __last1) |
| 4474 { |
| 4475 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((valu
e_type*)0)) |
| 4476 ::new (__result) value_type(_VSTD::move(*__first2)); |
| 4477 __h.release(); |
| 4478 return; |
| 4479 } |
| 4480 if (__first2 == __last2) |
| 4481 { |
| 4482 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((valu
e_type*)0)) |
| 4483 ::new (__result) value_type(_VSTD::move(*__first1)); |
| 4484 __h.release(); |
| 4485 return; |
| 4486 } |
| 4487 if (__comp(*__first2, *__first1)) |
| 4488 { |
| 4489 ::new (__result) value_type(_VSTD::move(*__first2)); |
| 4490 __d.__incr((value_type*)0); |
| 4491 ++__first2; |
| 4492 } |
| 4493 else |
| 4494 { |
| 4495 ::new (__result) value_type(_VSTD::move(*__first1)); |
| 4496 __d.__incr((value_type*)0); |
| 4497 ++__first1; |
| 4498 } |
| 4499 } |
| 4500 } |
| 4501 |
| 4502 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 4503 void |
| 4504 __merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1, |
| 4505 _InputIterator2 __first2, _InputIterator2 __last2, |
| 4506 _OutputIterator __result, _Compare __comp) |
| 4507 { |
| 4508 for (; __first1 != __last1; ++__result) |
| 4509 { |
| 4510 if (__first2 == __last2) |
| 4511 { |
| 4512 for (; __first1 != __last1; ++__first1, ++__result) |
| 4513 *__result = _VSTD::move(*__first1); |
| 4514 return; |
| 4515 } |
| 4516 if (__comp(*__first2, *__first1)) |
| 4517 { |
| 4518 *__result = _VSTD::move(*__first2); |
| 4519 ++__first2; |
| 4520 } |
| 4521 else |
| 4522 { |
| 4523 *__result = _VSTD::move(*__first1); |
| 4524 ++__first1; |
| 4525 } |
| 4526 } |
| 4527 for (; __first2 != __last2; ++__first2, ++__result) |
| 4528 *__result = _VSTD::move(*__first2); |
| 4529 } |
| 4530 |
| 4531 template <class _Compare, class _RandomAccessIterator> |
| 4532 void |
| 4533 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp
are __comp, |
| 4534 typename iterator_traits<_RandomAccessIterator>::difference_type _
_len, |
| 4535 typename iterator_traits<_RandomAccessIterator>::value_type* __buf
f, ptrdiff_t __buff_size); |
| 4536 |
| 4537 template <class _Compare, class _RandomAccessIterator> |
| 4538 void |
| 4539 __stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1
, _Compare __comp, |
| 4540 typename iterator_traits<_RandomAccessIterator>::difference_t
ype __len, |
| 4541 typename iterator_traits<_RandomAccessIterator>::value_type*
__first2) |
| 4542 { |
| 4543 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 4544 switch (__len) |
| 4545 { |
| 4546 case 0: |
| 4547 return; |
| 4548 case 1: |
| 4549 ::new(__first2) value_type(_VSTD::move(*__first1)); |
| 4550 return; |
| 4551 case 2: |
| 4552 __destruct_n __d(0); |
| 4553 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d); |
| 4554 if (__comp(*--__last1, *__first1)) |
| 4555 { |
| 4556 ::new(__first2) value_type(_VSTD::move(*__last1)); |
| 4557 __d.__incr((value_type*)0); |
| 4558 ++__first2; |
| 4559 ::new(__first2) value_type(_VSTD::move(*__first1)); |
| 4560 } |
| 4561 else |
| 4562 { |
| 4563 ::new(__first2) value_type(_VSTD::move(*__first1)); |
| 4564 __d.__incr((value_type*)0); |
| 4565 ++__first2; |
| 4566 ::new(__first2) value_type(_VSTD::move(*__last1)); |
| 4567 } |
| 4568 __h2.release(); |
| 4569 return; |
| 4570 } |
| 4571 if (__len <= 8) |
| 4572 { |
| 4573 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp); |
| 4574 return; |
| 4575 } |
| 4576 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __le
n / 2; |
| 4577 _RandomAccessIterator __m = __first1 + __l2; |
| 4578 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2); |
| 4579 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2,
__len - __l2); |
| 4580 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __co
mp); |
| 4581 } |
| 4582 |
| 4583 template <class _Tp> |
| 4584 struct __stable_sort_switch |
| 4585 { |
| 4586 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value; |
| 4587 }; |
| 4588 |
| 4589 template <class _Compare, class _RandomAccessIterator> |
| 4590 void |
| 4591 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp
are __comp, |
| 4592 typename iterator_traits<_RandomAccessIterator>::difference_type _
_len, |
| 4593 typename iterator_traits<_RandomAccessIterator>::value_type* __buf
f, ptrdiff_t __buff_size) |
| 4594 { |
| 4595 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 4596 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4597 switch (__len) |
| 4598 { |
| 4599 case 0: |
| 4600 case 1: |
| 4601 return; |
| 4602 case 2: |
| 4603 if (__comp(*--__last, *__first)) |
| 4604 swap(*__first, *__last); |
| 4605 return; |
| 4606 } |
| 4607 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::
value)) |
| 4608 { |
| 4609 __insertion_sort<_Compare>(__first, __last, __comp); |
| 4610 return; |
| 4611 } |
| 4612 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __le
n / 2; |
| 4613 _RandomAccessIterator __m = __first + __l2; |
| 4614 if (__len <= __buff_size) |
| 4615 { |
| 4616 __destruct_n __d(0); |
| 4617 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); |
| 4618 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff); |
| 4619 __d.__set(__l2, (value_type*)0); |
| 4620 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff +
__l2); |
| 4621 __d.__set(__len, (value_type*)0); |
| 4622 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __bu
ff + __len, __first, __comp); |
| 4623 // __merge<_Compare>(move_iterator<value_type*>(__buff), |
| 4624 // move_iterator<value_type*>(__buff + __l2), |
| 4625 // move_iterator<_RandomAccessIterator>(__buff + __l2)
, |
| 4626 // move_iterator<_RandomAccessIterator>(__buff + __len
), |
| 4627 // __first, __comp); |
| 4628 return; |
| 4629 } |
| 4630 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size); |
| 4631 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_si
ze); |
| 4632 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2,
__buff, __buff_size); |
| 4633 } |
| 4634 |
| 4635 template <class _RandomAccessIterator, class _Compare> |
| 4636 inline _LIBCPP_INLINE_VISIBILITY |
| 4637 void |
| 4638 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compar
e __comp) |
| 4639 { |
| 4640 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 4641 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4642 difference_type __len = __last - __first; |
| 4643 pair<value_type*, ptrdiff_t> __buf(0, 0); |
| 4644 unique_ptr<value_type, __return_temporary_buffer> __h; |
| 4645 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::v
alue)) |
| 4646 { |
| 4647 __buf = _VSTD::get_temporary_buffer<value_type>(__len); |
| 4648 __h.reset(__buf.first); |
| 4649 } |
| 4650 #ifdef _LIBCPP_DEBUG |
| 4651 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4652 __debug_less<_Compare> __c(__comp); |
| 4653 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.sec
ond); |
| 4654 #else // _LIBCPP_DEBUG |
| 4655 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4656 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.
second); |
| 4657 #endif // _LIBCPP_DEBUG |
| 4658 } |
| 4659 |
| 4660 template <class _RandomAccessIterator> |
| 4661 inline _LIBCPP_INLINE_VISIBILITY |
| 4662 void |
| 4663 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4664 { |
| 4665 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomA
ccessIterator>::value_type>()); |
| 4666 } |
| 4667 |
| 4668 // is_heap_until |
| 4669 |
| 4670 template <class _RandomAccessIterator, class _Compare> |
| 4671 _RandomAccessIterator |
| 4672 is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp
are __comp) |
| 4673 { |
| 4674 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_t
ype difference_type; |
| 4675 difference_type __len = __last - __first; |
| 4676 difference_type __p = 0; |
| 4677 difference_type __c = 1; |
| 4678 _RandomAccessIterator __pp = __first; |
| 4679 while (__c < __len) |
| 4680 { |
| 4681 _RandomAccessIterator __cp = __first + __c; |
| 4682 if (__comp(*__pp, *__cp)) |
| 4683 return __cp; |
| 4684 ++__c; |
| 4685 ++__cp; |
| 4686 if (__c == __len) |
| 4687 return __last; |
| 4688 if (__comp(*__pp, *__cp)) |
| 4689 return __cp; |
| 4690 ++__p; |
| 4691 ++__pp; |
| 4692 __c = 2 * __p + 1; |
| 4693 } |
| 4694 return __last; |
| 4695 } |
| 4696 |
| 4697 template<class _RandomAccessIterator> |
| 4698 inline _LIBCPP_INLINE_VISIBILITY |
| 4699 _RandomAccessIterator |
| 4700 is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4701 { |
| 4702 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits
<_RandomAccessIterator>::value_type>()); |
| 4703 } |
| 4704 |
| 4705 // is_heap |
| 4706 |
| 4707 template <class _RandomAccessIterator, class _Compare> |
| 4708 inline _LIBCPP_INLINE_VISIBILITY |
| 4709 bool |
| 4710 is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __
comp) |
| 4711 { |
| 4712 return _VSTD::is_heap_until(__first, __last, __comp) == __last; |
| 4713 } |
| 4714 |
| 4715 template<class _RandomAccessIterator> |
| 4716 inline _LIBCPP_INLINE_VISIBILITY |
| 4717 bool |
| 4718 is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4719 { |
| 4720 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_Rand
omAccessIterator>::value_type>()); |
| 4721 } |
| 4722 |
| 4723 // push_heap |
| 4724 |
| 4725 template <class _Compare, class _RandomAccessIterator> |
| 4726 void |
| 4727 __push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare
__comp, |
| 4728 typename iterator_traits<_RandomAccessIterator>::difference_ty
pe __len) |
| 4729 { |
| 4730 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4731 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 4732 if (__len > 1) |
| 4733 { |
| 4734 difference_type __p = 0; |
| 4735 _RandomAccessIterator __pp = __first; |
| 4736 difference_type __c = 2; |
| 4737 _RandomAccessIterator __cp = __first + __c; |
| 4738 if (__c == __len || __comp(*__cp, *(__cp - 1))) |
| 4739 { |
| 4740 --__c; |
| 4741 --__cp; |
| 4742 } |
| 4743 if (__comp(*__pp, *__cp)) |
| 4744 { |
| 4745 value_type __t(_VSTD::move(*__pp)); |
| 4746 do |
| 4747 { |
| 4748 *__pp = _VSTD::move(*__cp); |
| 4749 __pp = __cp; |
| 4750 __p = __c; |
| 4751 __c = (__p + 1) * 2; |
| 4752 if (__c > __len) |
| 4753 break; |
| 4754 __cp = __first + __c; |
| 4755 if (__c == __len || __comp(*__cp, *(__cp - 1))) |
| 4756 { |
| 4757 --__c; |
| 4758 --__cp; |
| 4759 } |
| 4760 } while (__comp(__t, *__cp)); |
| 4761 *__pp = _VSTD::move(__t); |
| 4762 } |
| 4763 } |
| 4764 } |
| 4765 |
| 4766 template <class _Compare, class _RandomAccessIterator> |
| 4767 void |
| 4768 __push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _C
ompare __comp, |
| 4769 typename iterator_traits<_RandomAccessIterator>::difference_typ
e __len) |
| 4770 { |
| 4771 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4772 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_ty
pe; |
| 4773 if (__len > 1) |
| 4774 { |
| 4775 __len = (__len - 2) / 2; |
| 4776 _RandomAccessIterator __ptr = __first + __len; |
| 4777 if (__comp(*__ptr, *--__last)) |
| 4778 { |
| 4779 value_type __t(_VSTD::move(*__last)); |
| 4780 do |
| 4781 { |
| 4782 *__last = _VSTD::move(*__ptr); |
| 4783 __last = __ptr; |
| 4784 if (__len == 0) |
| 4785 break; |
| 4786 __len = (__len - 1) / 2; |
| 4787 __ptr = __first + __len; |
| 4788 } while (__comp(*__ptr, __t)); |
| 4789 *__last = _VSTD::move(__t); |
| 4790 } |
| 4791 } |
| 4792 } |
| 4793 |
| 4794 template <class _RandomAccessIterator, class _Compare> |
| 4795 inline _LIBCPP_INLINE_VISIBILITY |
| 4796 void |
| 4797 push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare
__comp) |
| 4798 { |
| 4799 #ifdef _LIBCPP_DEBUG |
| 4800 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4801 __debug_less<_Compare> __c(__comp); |
| 4802 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first); |
| 4803 #else // _LIBCPP_DEBUG |
| 4804 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4805 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first); |
| 4806 #endif // _LIBCPP_DEBUG |
| 4807 } |
| 4808 |
| 4809 template <class _RandomAccessIterator> |
| 4810 inline _LIBCPP_INLINE_VISIBILITY |
| 4811 void |
| 4812 push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4813 { |
| 4814 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAcc
essIterator>::value_type>()); |
| 4815 } |
| 4816 |
| 4817 // pop_heap |
| 4818 |
| 4819 template <class _Compare, class _RandomAccessIterator> |
| 4820 inline _LIBCPP_INLINE_VISIBILITY |
| 4821 void |
| 4822 __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare
__comp, |
| 4823 typename iterator_traits<_RandomAccessIterator>::difference_type __le
n) |
| 4824 { |
| 4825 if (__len > 1) |
| 4826 { |
| 4827 swap(*__first, *--__last); |
| 4828 __push_heap_front<_Compare>(__first, __last, __comp, __len-1); |
| 4829 } |
| 4830 } |
| 4831 |
| 4832 template <class _RandomAccessIterator, class _Compare> |
| 4833 inline _LIBCPP_INLINE_VISIBILITY |
| 4834 void |
| 4835 pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare _
_comp) |
| 4836 { |
| 4837 #ifdef _LIBCPP_DEBUG |
| 4838 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4839 __debug_less<_Compare> __c(__comp); |
| 4840 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first); |
| 4841 #else // _LIBCPP_DEBUG |
| 4842 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4843 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first); |
| 4844 #endif // _LIBCPP_DEBUG |
| 4845 } |
| 4846 |
| 4847 template <class _RandomAccessIterator> |
| 4848 inline _LIBCPP_INLINE_VISIBILITY |
| 4849 void |
| 4850 pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4851 { |
| 4852 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAcce
ssIterator>::value_type>()); |
| 4853 } |
| 4854 |
| 4855 // make_heap |
| 4856 |
| 4857 template <class _Compare, class _RandomAccessIterator> |
| 4858 void |
| 4859 __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compar
e __comp) |
| 4860 { |
| 4861 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4862 difference_type __n = __last - __first; |
| 4863 if (__n > 1) |
| 4864 { |
| 4865 __last = __first; |
| 4866 ++__last; |
| 4867 for (difference_type __i = 1; __i < __n;) |
| 4868 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i); |
| 4869 } |
| 4870 } |
| 4871 |
| 4872 template <class _RandomAccessIterator, class _Compare> |
| 4873 inline _LIBCPP_INLINE_VISIBILITY |
| 4874 void |
| 4875 make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare
__comp) |
| 4876 { |
| 4877 #ifdef _LIBCPP_DEBUG |
| 4878 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4879 __debug_less<_Compare> __c(__comp); |
| 4880 __make_heap<_Comp_ref>(__first, __last, __c); |
| 4881 #else // _LIBCPP_DEBUG |
| 4882 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4883 __make_heap<_Comp_ref>(__first, __last, __comp); |
| 4884 #endif // _LIBCPP_DEBUG |
| 4885 } |
| 4886 |
| 4887 template <class _RandomAccessIterator> |
| 4888 inline _LIBCPP_INLINE_VISIBILITY |
| 4889 void |
| 4890 make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4891 { |
| 4892 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAcc
essIterator>::value_type>()); |
| 4893 } |
| 4894 |
| 4895 // sort_heap |
| 4896 |
| 4897 template <class _Compare, class _RandomAccessIterator> |
| 4898 void |
| 4899 __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compar
e __comp) |
| 4900 { |
| 4901 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 4902 for (difference_type __n = __last - __first; __n > 1; --__last, --__n) |
| 4903 __pop_heap<_Compare>(__first, __last, __comp, __n); |
| 4904 } |
| 4905 |
| 4906 template <class _RandomAccessIterator, class _Compare> |
| 4907 inline _LIBCPP_INLINE_VISIBILITY |
| 4908 void |
| 4909 sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare
__comp) |
| 4910 { |
| 4911 #ifdef _LIBCPP_DEBUG |
| 4912 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4913 __debug_less<_Compare> __c(__comp); |
| 4914 __sort_heap<_Comp_ref>(__first, __last, __c); |
| 4915 #else // _LIBCPP_DEBUG |
| 4916 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4917 __sort_heap<_Comp_ref>(__first, __last, __comp); |
| 4918 #endif // _LIBCPP_DEBUG |
| 4919 } |
| 4920 |
| 4921 template <class _RandomAccessIterator> |
| 4922 inline _LIBCPP_INLINE_VISIBILITY |
| 4923 void |
| 4924 sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) |
| 4925 { |
| 4926 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAcc
essIterator>::value_type>()); |
| 4927 } |
| 4928 |
| 4929 // partial_sort |
| 4930 |
| 4931 template <class _Compare, class _RandomAccessIterator> |
| 4932 void |
| 4933 __partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _R
andomAccessIterator __last, |
| 4934 _Compare __comp) |
| 4935 { |
| 4936 __make_heap<_Compare>(__first, __middle, __comp); |
| 4937 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __m
iddle - __first; |
| 4938 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i) |
| 4939 { |
| 4940 if (__comp(*__i, *__first)) |
| 4941 { |
| 4942 swap(*__i, *__first); |
| 4943 __push_heap_front<_Compare>(__first, __middle, __comp, __len); |
| 4944 } |
| 4945 } |
| 4946 __sort_heap<_Compare>(__first, __middle, __comp); |
| 4947 } |
| 4948 |
| 4949 template <class _RandomAccessIterator, class _Compare> |
| 4950 inline _LIBCPP_INLINE_VISIBILITY |
| 4951 void |
| 4952 partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Ran
domAccessIterator __last, |
| 4953 _Compare __comp) |
| 4954 { |
| 4955 #ifdef _LIBCPP_DEBUG |
| 4956 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 4957 __debug_less<_Compare> __c(__comp); |
| 4958 __partial_sort<_Comp_ref>(__first, __middle, __last, __c); |
| 4959 #else // _LIBCPP_DEBUG |
| 4960 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 4961 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp); |
| 4962 #endif // _LIBCPP_DEBUG |
| 4963 } |
| 4964 |
| 4965 template <class _RandomAccessIterator> |
| 4966 inline _LIBCPP_INLINE_VISIBILITY |
| 4967 void |
| 4968 partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Ran
domAccessIterator __last) |
| 4969 { |
| 4970 _VSTD::partial_sort(__first, __middle, __last, |
| 4971 __less<typename iterator_traits<_RandomAccessIterator>::v
alue_type>()); |
| 4972 } |
| 4973 |
| 4974 // partial_sort_copy |
| 4975 |
| 4976 template <class _Compare, class _InputIterator, class _RandomAccessIterator> |
| 4977 _RandomAccessIterator |
| 4978 __partial_sort_copy(_InputIterator __first, _InputIterator __last, |
| 4979 _RandomAccessIterator __result_first, _RandomAccessIterator
__result_last, _Compare __comp) |
| 4980 { |
| 4981 _RandomAccessIterator __r = __result_first; |
| 4982 if (__r != __result_last) |
| 4983 { |
| 4984 typename iterator_traits<_RandomAccessIterator>::difference_type __len =
0; |
| 4985 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__
len) |
| 4986 *__r = *__first; |
| 4987 __make_heap<_Compare>(__result_first, __r, __comp); |
| 4988 for (; __first != __last; ++__first) |
| 4989 if (__comp(*__first, *__result_first)) |
| 4990 { |
| 4991 *__result_first = *__first; |
| 4992 __push_heap_front<_Compare>(__result_first, __r, __comp, __len); |
| 4993 } |
| 4994 __sort_heap<_Compare>(__result_first, __r, __comp); |
| 4995 } |
| 4996 return __r; |
| 4997 } |
| 4998 |
| 4999 template <class _InputIterator, class _RandomAccessIterator, class _Compare> |
| 5000 inline _LIBCPP_INLINE_VISIBILITY |
| 5001 _RandomAccessIterator |
| 5002 partial_sort_copy(_InputIterator __first, _InputIterator __last, |
| 5003 _RandomAccessIterator __result_first, _RandomAccessIterator __
result_last, _Compare __comp) |
| 5004 { |
| 5005 #ifdef _LIBCPP_DEBUG |
| 5006 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5007 __debug_less<_Compare> __c(__comp); |
| 5008 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __res
ult_last, __c); |
| 5009 #else // _LIBCPP_DEBUG |
| 5010 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5011 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __res
ult_last, __comp); |
| 5012 #endif // _LIBCPP_DEBUG |
| 5013 } |
| 5014 |
| 5015 template <class _InputIterator, class _RandomAccessIterator> |
| 5016 inline _LIBCPP_INLINE_VISIBILITY |
| 5017 _RandomAccessIterator |
| 5018 partial_sort_copy(_InputIterator __first, _InputIterator __last, |
| 5019 _RandomAccessIterator __result_first, _RandomAccessIterator __
result_last) |
| 5020 { |
| 5021 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_la
st, |
| 5022 __less<typename iterator_traits<_RandomAccess
Iterator>::value_type>()); |
| 5023 } |
| 5024 |
| 5025 // nth_element |
| 5026 |
| 5027 template <class _Compare, class _RandomAccessIterator> |
| 5028 void |
| 5029 __nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _Rando
mAccessIterator __last, _Compare __comp) |
| 5030 { |
| 5031 // _Compare is known to be a reference type |
| 5032 typedef typename iterator_traits<_RandomAccessIterator>::difference_type dif
ference_type; |
| 5033 const difference_type __limit = 7; |
| 5034 while (true) |
| 5035 { |
| 5036 __restart: |
| 5037 if (__nth == __last) |
| 5038 return; |
| 5039 difference_type __len = __last - __first; |
| 5040 switch (__len) |
| 5041 { |
| 5042 case 0: |
| 5043 case 1: |
| 5044 return; |
| 5045 case 2: |
| 5046 if (__comp(*--__last, *__first)) |
| 5047 swap(*__first, *__last); |
| 5048 return; |
| 5049 case 3: |
| 5050 { |
| 5051 _RandomAccessIterator __m = __first; |
| 5052 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp); |
| 5053 return; |
| 5054 } |
| 5055 } |
| 5056 if (__len <= __limit) |
| 5057 { |
| 5058 __selection_sort<_Compare>(__first, __last, __comp); |
| 5059 return; |
| 5060 } |
| 5061 // __len > __limit >= 3 |
| 5062 _RandomAccessIterator __m = __first + __len/2; |
| 5063 _RandomAccessIterator __lm1 = __last; |
| 5064 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __c
omp); |
| 5065 // *__m is median |
| 5066 // partition [__first, __m) < *__m and *__m <= [__m, __last) |
| 5067 // (this inhibits tossing elements equivalent to __m around unnecessaril
y) |
| 5068 _RandomAccessIterator __i = __first; |
| 5069 _RandomAccessIterator __j = __lm1; |
| 5070 // j points beyond range to be tested, *__lm1 is known to be <= *__m |
| 5071 // The search going up is known to be guarded but the search coming down
isn't. |
| 5072 // Prime the downward search with a guard. |
| 5073 if (!__comp(*__i, *__m)) // if *__first == *__m |
| 5074 { |
| 5075 // *__first == *__m, *__first doesn't go in first part |
| 5076 // manually guard downward moving __j against __i |
| 5077 while (true) |
| 5078 { |
| 5079 if (__i == --__j) |
| 5080 { |
| 5081 // *__first == *__m, *__m <= all other elements |
| 5082 // Parition instead into [__first, __i) == *__first and *__f
irst < [__i, __last) |
| 5083 ++__i; // __first + 1 |
| 5084 __j = __last; |
| 5085 if (!__comp(*__first, *--__j)) // we need a guard if *__fir
st == *(__last-1) |
| 5086 { |
| 5087 while (true) |
| 5088 { |
| 5089 if (__i == __j) |
| 5090 return; // [__first, __last) all equivalent ele
ments |
| 5091 if (__comp(*__first, *__i)) |
| 5092 { |
| 5093 swap(*__i, *__j); |
| 5094 ++__n_swaps; |
| 5095 ++__i; |
| 5096 break; |
| 5097 } |
| 5098 ++__i; |
| 5099 } |
| 5100 } |
| 5101 // [__first, __i) == *__first and *__first < [__j, __last) a
nd __j == __last - 1 |
| 5102 if (__i == __j) |
| 5103 return; |
| 5104 while (true) |
| 5105 { |
| 5106 while (!__comp(*__first, *__i)) |
| 5107 ++__i; |
| 5108 while (__comp(*__first, *--__j)) |
| 5109 ; |
| 5110 if (__i >= __j) |
| 5111 break; |
| 5112 swap(*__i, *__j); |
| 5113 ++__n_swaps; |
| 5114 ++__i; |
| 5115 } |
| 5116 // [__first, __i) == *__first and *__first < [__i, __last) |
| 5117 // The first part is sorted, |
| 5118 if (__nth < __i) |
| 5119 return; |
| 5120 // __nth_element the secod part |
| 5121 // __nth_element<_Compare>(__i, __nth, __last, __comp); |
| 5122 __first = __i; |
| 5123 goto __restart; |
| 5124 } |
| 5125 if (__comp(*__j, *__m)) |
| 5126 { |
| 5127 swap(*__i, *__j); |
| 5128 ++__n_swaps; |
| 5129 break; // found guard for downward moving __j, now use ungu
arded partition |
| 5130 } |
| 5131 } |
| 5132 } |
| 5133 ++__i; |
| 5134 // j points beyond range to be tested, *__lm1 is known to be <= *__m |
| 5135 // if not yet partitioned... |
| 5136 if (__i < __j) |
| 5137 { |
| 5138 // known that *(__i - 1) < *__m |
| 5139 while (true) |
| 5140 { |
| 5141 // __m still guards upward moving __i |
| 5142 while (__comp(*__i, *__m)) |
| 5143 ++__i; |
| 5144 // It is now known that a guard exists for downward moving __j |
| 5145 while (!__comp(*--__j, *__m)) |
| 5146 ; |
| 5147 if (__i >= __j) |
| 5148 break; |
| 5149 swap(*__i, *__j); |
| 5150 ++__n_swaps; |
| 5151 // It is known that __m != __j |
| 5152 // If __m just moved, follow it |
| 5153 if (__m == __i) |
| 5154 __m = __j; |
| 5155 ++__i; |
| 5156 } |
| 5157 } |
| 5158 // [__first, __i) < *__m and *__m <= [__i, __last) |
| 5159 if (__i != __m && __comp(*__m, *__i)) |
| 5160 { |
| 5161 swap(*__i, *__m); |
| 5162 ++__n_swaps; |
| 5163 } |
| 5164 // [__first, __i) < *__i and *__i <= [__i+1, __last) |
| 5165 if (__nth == __i) |
| 5166 return; |
| 5167 if (__n_swaps == 0) |
| 5168 { |
| 5169 // We were given a perfectly partitioned sequence. Coincidence? |
| 5170 if (__nth < __i) |
| 5171 { |
| 5172 // Check for [__first, __i) already sorted |
| 5173 __j = __m = __first; |
| 5174 while (++__j != __i) |
| 5175 { |
| 5176 if (__comp(*__j, *__m)) |
| 5177 // not yet sorted, so sort |
| 5178 goto not_sorted; |
| 5179 __m = __j; |
| 5180 } |
| 5181 // [__first, __i) sorted |
| 5182 return; |
| 5183 } |
| 5184 else |
| 5185 { |
| 5186 // Check for [__i, __last) already sorted |
| 5187 __j = __m = __i; |
| 5188 while (++__j != __last) |
| 5189 { |
| 5190 if (__comp(*__j, *__m)) |
| 5191 // not yet sorted, so sort |
| 5192 goto not_sorted; |
| 5193 __m = __j; |
| 5194 } |
| 5195 // [__i, __last) sorted |
| 5196 return; |
| 5197 } |
| 5198 } |
| 5199 not_sorted: |
| 5200 // __nth_element on range containing __nth |
| 5201 if (__nth < __i) |
| 5202 { |
| 5203 // __nth_element<_Compare>(__first, __nth, __i, __comp); |
| 5204 __last = __i; |
| 5205 } |
| 5206 else |
| 5207 { |
| 5208 // __nth_element<_Compare>(__i+1, __nth, __last, __comp); |
| 5209 __first = ++__i; |
| 5210 } |
| 5211 } |
| 5212 } |
| 5213 |
| 5214 template <class _RandomAccessIterator, class _Compare> |
| 5215 inline _LIBCPP_INLINE_VISIBILITY |
| 5216 void |
| 5217 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomA
ccessIterator __last, _Compare __comp) |
| 5218 { |
| 5219 #ifdef _LIBCPP_DEBUG |
| 5220 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5221 __debug_less<_Compare> __c(__comp); |
| 5222 __nth_element<_Comp_ref>(__first, __nth, __last, __c); |
| 5223 #else // _LIBCPP_DEBUG |
| 5224 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5225 __nth_element<_Comp_ref>(__first, __nth, __last, __comp); |
| 5226 #endif // _LIBCPP_DEBUG |
| 5227 } |
| 5228 |
| 5229 template <class _RandomAccessIterator> |
| 5230 inline _LIBCPP_INLINE_VISIBILITY |
| 5231 void |
| 5232 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomA
ccessIterator __last) |
| 5233 { |
| 5234 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_
RandomAccessIterator>::value_type>()); |
| 5235 } |
| 5236 |
| 5237 // includes |
| 5238 |
| 5239 template <class _Compare, class _InputIterator1, class _InputIterator2> |
| 5240 bool |
| 5241 __includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __
first2, _InputIterator2 __last2, |
| 5242 _Compare __comp) |
| 5243 { |
| 5244 for (; __first2 != __last2; ++__first1) |
| 5245 { |
| 5246 if (__first1 == __last1 || __comp(*__first2, *__first1)) |
| 5247 return false; |
| 5248 if (!__comp(*__first1, *__first2)) |
| 5249 ++__first2; |
| 5250 } |
| 5251 return true; |
| 5252 } |
| 5253 |
| 5254 template <class _InputIterator1, class _InputIterator2, class _Compare> |
| 5255 inline _LIBCPP_INLINE_VISIBILITY |
| 5256 bool |
| 5257 includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi
rst2, _InputIterator2 __last2, |
| 5258 _Compare __comp) |
| 5259 { |
| 5260 #ifdef _LIBCPP_DEBUG |
| 5261 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5262 __debug_less<_Compare> __c(__comp); |
| 5263 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c); |
| 5264 #else // _LIBCPP_DEBUG |
| 5265 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5266 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp); |
| 5267 #endif // _LIBCPP_DEBUG |
| 5268 } |
| 5269 |
| 5270 template <class _InputIterator1, class _InputIterator2> |
| 5271 inline _LIBCPP_INLINE_VISIBILITY |
| 5272 bool |
| 5273 includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi
rst2, _InputIterator2 __last2) |
| 5274 { |
| 5275 return _VSTD::includes(__first1, __last1, __first2, __last2, |
| 5276 __less<typename iterator_traits<_InputIterator1>::valu
e_type, |
| 5277 typename iterator_traits<_InputIterator2>::valu
e_type>()); |
| 5278 } |
| 5279 |
| 5280 // set_union |
| 5281 |
| 5282 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 5283 _OutputIterator |
| 5284 __set_union(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5285 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator _
_result, _Compare __comp) |
| 5286 { |
| 5287 for (; __first1 != __last1; ++__result) |
| 5288 { |
| 5289 if (__first2 == __last2) |
| 5290 return _VSTD::copy(__first1, __last1, __result); |
| 5291 if (__comp(*__first2, *__first1)) |
| 5292 { |
| 5293 *__result = *__first2; |
| 5294 ++__first2; |
| 5295 } |
| 5296 else |
| 5297 { |
| 5298 *__result = *__first1; |
| 5299 if (!__comp(*__first1, *__first2)) |
| 5300 ++__first2; |
| 5301 ++__first1; |
| 5302 } |
| 5303 } |
| 5304 return _VSTD::copy(__first2, __last2, __result); |
| 5305 } |
| 5306 |
| 5307 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _Compare> |
| 5308 inline _LIBCPP_INLINE_VISIBILITY |
| 5309 _OutputIterator |
| 5310 set_union(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5311 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __r
esult, _Compare __comp) |
| 5312 { |
| 5313 #ifdef _LIBCPP_DEBUG |
| 5314 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5315 __debug_less<_Compare> __c(__comp); |
| 5316 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result
, __c); |
| 5317 #else // _LIBCPP_DEBUG |
| 5318 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5319 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result
, __comp); |
| 5320 #endif // _LIBCPP_DEBUG |
| 5321 } |
| 5322 |
| 5323 template <class _InputIterator1, class _InputIterator2, class _OutputIterator> |
| 5324 inline _LIBCPP_INLINE_VISIBILITY |
| 5325 _OutputIterator |
| 5326 set_union(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5327 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __r
esult) |
| 5328 { |
| 5329 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result, |
| 5330 __less<typename iterator_traits<_InputIterator1>::valu
e_type, |
| 5331 typename iterator_traits<_InputIterator2>::valu
e_type>()); |
| 5332 } |
| 5333 |
| 5334 // set_intersection |
| 5335 |
| 5336 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 5337 _OutputIterator |
| 5338 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5339 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIte
rator __result, _Compare __comp) |
| 5340 { |
| 5341 while (__first1 != __last1 && __first2 != __last2) |
| 5342 { |
| 5343 if (__comp(*__first1, *__first2)) |
| 5344 ++__first1; |
| 5345 else |
| 5346 { |
| 5347 if (!__comp(*__first2, *__first1)) |
| 5348 { |
| 5349 *__result = *__first1; |
| 5350 ++__result; |
| 5351 ++__first1; |
| 5352 } |
| 5353 ++__first2; |
| 5354 } |
| 5355 } |
| 5356 return __result; |
| 5357 } |
| 5358 |
| 5359 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _Compare> |
| 5360 inline _LIBCPP_INLINE_VISIBILITY |
| 5361 _OutputIterator |
| 5362 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5363 _InputIterator2 __first2, _InputIterator2 __last2, _OutputItera
tor __result, _Compare __comp) |
| 5364 { |
| 5365 #ifdef _LIBCPP_DEBUG |
| 5366 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5367 __debug_less<_Compare> __c(__comp); |
| 5368 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, _
_result, __c); |
| 5369 #else // _LIBCPP_DEBUG |
| 5370 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5371 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, _
_result, __comp); |
| 5372 #endif // _LIBCPP_DEBUG |
| 5373 } |
| 5374 |
| 5375 template <class _InputIterator1, class _InputIterator2, class _OutputIterator> |
| 5376 inline _LIBCPP_INLINE_VISIBILITY |
| 5377 _OutputIterator |
| 5378 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5379 _InputIterator2 __first2, _InputIterator2 __last2, _OutputItera
tor __result) |
| 5380 { |
| 5381 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __resul
t, |
| 5382 __less<typename iterator_traits<_InputIterator
1>::value_type, |
| 5383 typename iterator_traits<_InputIterator
2>::value_type>()); |
| 5384 } |
| 5385 |
| 5386 // set_difference |
| 5387 |
| 5388 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 5389 _OutputIterator |
| 5390 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5391 _InputIterator2 __first2, _InputIterator2 __last2, _OutputItera
tor __result, _Compare __comp) |
| 5392 { |
| 5393 while (__first1 != __last1) |
| 5394 { |
| 5395 if (__first2 == __last2) |
| 5396 return _VSTD::copy(__first1, __last1, __result); |
| 5397 if (__comp(*__first1, *__first2)) |
| 5398 { |
| 5399 *__result = *__first1; |
| 5400 ++__result; |
| 5401 ++__first1; |
| 5402 } |
| 5403 else |
| 5404 { |
| 5405 if (!__comp(*__first2, *__first1)) |
| 5406 ++__first1; |
| 5407 ++__first2; |
| 5408 } |
| 5409 } |
| 5410 return __result; |
| 5411 } |
| 5412 |
| 5413 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _Compare> |
| 5414 inline _LIBCPP_INLINE_VISIBILITY |
| 5415 _OutputIterator |
| 5416 set_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5417 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterato
r __result, _Compare __comp) |
| 5418 { |
| 5419 #ifdef _LIBCPP_DEBUG |
| 5420 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5421 __debug_less<_Compare> __c(__comp); |
| 5422 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __r
esult, __c); |
| 5423 #else // _LIBCPP_DEBUG |
| 5424 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5425 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __r
esult, __comp); |
| 5426 #endif // _LIBCPP_DEBUG |
| 5427 } |
| 5428 |
| 5429 template <class _InputIterator1, class _InputIterator2, class _OutputIterator> |
| 5430 inline _LIBCPP_INLINE_VISIBILITY |
| 5431 _OutputIterator |
| 5432 set_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5433 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterato
r __result) |
| 5434 { |
| 5435 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result, |
| 5436 __less<typename iterator_traits<_InputIterator1>
::value_type, |
| 5437 typename iterator_traits<_InputIterator2>
::value_type>()); |
| 5438 } |
| 5439 |
| 5440 // set_symmetric_difference |
| 5441 |
| 5442 template <class _Compare, class _InputIterator1, class _InputIterator2, class _O
utputIterator> |
| 5443 _OutputIterator |
| 5444 __set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5445 _InputIterator2 __first2, _InputIterator2 __last2, _O
utputIterator __result, _Compare __comp) |
| 5446 { |
| 5447 while (__first1 != __last1) |
| 5448 { |
| 5449 if (__first2 == __last2) |
| 5450 return _VSTD::copy(__first1, __last1, __result); |
| 5451 if (__comp(*__first1, *__first2)) |
| 5452 { |
| 5453 *__result = *__first1; |
| 5454 ++__result; |
| 5455 ++__first1; |
| 5456 } |
| 5457 else |
| 5458 { |
| 5459 if (__comp(*__first2, *__first1)) |
| 5460 { |
| 5461 *__result = *__first2; |
| 5462 ++__result; |
| 5463 } |
| 5464 else |
| 5465 ++__first1; |
| 5466 ++__first2; |
| 5467 } |
| 5468 } |
| 5469 return _VSTD::copy(__first2, __last2, __result); |
| 5470 } |
| 5471 |
| 5472 template <class _InputIterator1, class _InputIterator2, class _OutputIterator, c
lass _Compare> |
| 5473 inline _LIBCPP_INLINE_VISIBILITY |
| 5474 _OutputIterator |
| 5475 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5476 _InputIterator2 __first2, _InputIterator2 __last2, _Out
putIterator __result, _Compare __comp) |
| 5477 { |
| 5478 #ifdef _LIBCPP_DEBUG |
| 5479 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5480 __debug_less<_Compare> __c(__comp); |
| 5481 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __
last2, __result, __c); |
| 5482 #else // _LIBCPP_DEBUG |
| 5483 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5484 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __
last2, __result, __comp); |
| 5485 #endif // _LIBCPP_DEBUG |
| 5486 } |
| 5487 |
| 5488 template <class _InputIterator1, class _InputIterator2, class _OutputIterator> |
| 5489 inline _LIBCPP_INLINE_VISIBILITY |
| 5490 _OutputIterator |
| 5491 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5492 _InputIterator2 __first2, _InputIterator2 __last2, _Out
putIterator __result) |
| 5493 { |
| 5494 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2,
__result, |
| 5495 __less<typename iterator_traits<_Input
Iterator1>::value_type, |
| 5496 typename iterator_traits<_Input
Iterator2>::value_type>()); |
| 5497 } |
| 5498 |
| 5499 // lexicographical_compare |
| 5500 |
| 5501 template <class _Compare, class _InputIterator1, class _InputIterator2> |
| 5502 bool |
| 5503 __lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5504 _InputIterator2 __first2, _InputIterator2 __last2, _Co
mpare __comp) |
| 5505 { |
| 5506 for (; __first2 != __last2; ++__first1, ++__first2) |
| 5507 { |
| 5508 if (__first1 == __last1 || __comp(*__first1, *__first2)) |
| 5509 return true; |
| 5510 if (__comp(*__first2, *__first1)) |
| 5511 return false; |
| 5512 } |
| 5513 return false; |
| 5514 } |
| 5515 |
| 5516 template <class _InputIterator1, class _InputIterator2, class _Compare> |
| 5517 inline _LIBCPP_INLINE_VISIBILITY |
| 5518 bool |
| 5519 lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5520 _InputIterator2 __first2, _InputIterator2 __last2, _Comp
are __comp) |
| 5521 { |
| 5522 #ifdef _LIBCPP_DEBUG |
| 5523 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5524 __debug_less<_Compare> __c(__comp); |
| 5525 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __l
ast2, __c); |
| 5526 #else // _LIBCPP_DEBUG |
| 5527 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5528 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __l
ast2, __comp); |
| 5529 #endif // _LIBCPP_DEBUG |
| 5530 } |
| 5531 |
| 5532 template <class _InputIterator1, class _InputIterator2> |
| 5533 inline _LIBCPP_INLINE_VISIBILITY |
| 5534 bool |
| 5535 lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, |
| 5536 _InputIterator2 __first2, _InputIterator2 __last2) |
| 5537 { |
| 5538 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2, |
| 5539 __less<typename iterator_traits<_InputI
terator1>::value_type, |
| 5540 typename iterator_traits<_InputI
terator2>::value_type>()); |
| 5541 } |
| 5542 |
| 5543 // next_permutation |
| 5544 |
| 5545 template <class _Compare, class _BidirectionalIterator> |
| 5546 bool |
| 5547 __next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
, _Compare __comp) |
| 5548 { |
| 5549 _BidirectionalIterator __i = __last; |
| 5550 if (__first == __last || __first == --__i) |
| 5551 return false; |
| 5552 while (true) |
| 5553 { |
| 5554 _BidirectionalIterator __ip1 = __i; |
| 5555 if (__comp(*--__i, *__ip1)) |
| 5556 { |
| 5557 _BidirectionalIterator __j = __last; |
| 5558 while (!__comp(*__i, *--__j)) |
| 5559 ; |
| 5560 swap(*__i, *__j); |
| 5561 _VSTD::reverse(__ip1, __last); |
| 5562 return true; |
| 5563 } |
| 5564 if (__i == __first) |
| 5565 { |
| 5566 _VSTD::reverse(__first, __last); |
| 5567 return false; |
| 5568 } |
| 5569 } |
| 5570 } |
| 5571 |
| 5572 template <class _BidirectionalIterator, class _Compare> |
| 5573 inline _LIBCPP_INLINE_VISIBILITY |
| 5574 bool |
| 5575 next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
_Compare __comp) |
| 5576 { |
| 5577 #ifdef _LIBCPP_DEBUG |
| 5578 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5579 __debug_less<_Compare> __c(__comp); |
| 5580 return __next_permutation<_Comp_ref>(__first, __last, __c); |
| 5581 #else // _LIBCPP_DEBUG |
| 5582 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5583 return __next_permutation<_Comp_ref>(__first, __last, __comp); |
| 5584 #endif // _LIBCPP_DEBUG |
| 5585 } |
| 5586 |
| 5587 template <class _BidirectionalIterator> |
| 5588 inline _LIBCPP_INLINE_VISIBILITY |
| 5589 bool |
| 5590 next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) |
| 5591 { |
| 5592 return _VSTD::next_permutation(__first, __last, |
| 5593 __less<typename iterator_traits<_Bidirectional
Iterator>::value_type>()); |
| 5594 } |
| 5595 |
| 5596 // prev_permutation |
| 5597 |
| 5598 template <class _Compare, class _BidirectionalIterator> |
| 5599 bool |
| 5600 __prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
, _Compare __comp) |
| 5601 { |
| 5602 _BidirectionalIterator __i = __last; |
| 5603 if (__first == __last || __first == --__i) |
| 5604 return false; |
| 5605 while (true) |
| 5606 { |
| 5607 _BidirectionalIterator __ip1 = __i; |
| 5608 if (__comp(*__ip1, *--__i)) |
| 5609 { |
| 5610 _BidirectionalIterator __j = __last; |
| 5611 while (!__comp(*--__j, *__i)) |
| 5612 ; |
| 5613 swap(*__i, *__j); |
| 5614 _VSTD::reverse(__ip1, __last); |
| 5615 return true; |
| 5616 } |
| 5617 if (__i == __first) |
| 5618 { |
| 5619 _VSTD::reverse(__first, __last); |
| 5620 return false; |
| 5621 } |
| 5622 } |
| 5623 } |
| 5624 |
| 5625 template <class _BidirectionalIterator, class _Compare> |
| 5626 inline _LIBCPP_INLINE_VISIBILITY |
| 5627 bool |
| 5628 prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
_Compare __comp) |
| 5629 { |
| 5630 #ifdef _LIBCPP_DEBUG |
| 5631 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_r
ef; |
| 5632 __debug_less<_Compare> __c(__comp); |
| 5633 return __prev_permutation<_Comp_ref>(__first, __last, __c); |
| 5634 #else // _LIBCPP_DEBUG |
| 5635 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; |
| 5636 return __prev_permutation<_Comp_ref>(__first, __last, __comp); |
| 5637 #endif // _LIBCPP_DEBUG |
| 5638 } |
| 5639 |
| 5640 template <class _BidirectionalIterator> |
| 5641 inline _LIBCPP_INLINE_VISIBILITY |
| 5642 bool |
| 5643 prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) |
| 5644 { |
| 5645 return _VSTD::prev_permutation(__first, __last, |
| 5646 __less<typename iterator_traits<_Bidirectional
Iterator>::value_type>()); |
| 5647 } |
| 5648 |
| 5649 template <class _Tp> |
| 5650 inline _LIBCPP_INLINE_VISIBILITY |
| 5651 typename enable_if |
| 5652 < |
| 5653 is_integral<_Tp>::value, |
| 5654 _Tp |
| 5655 >::type |
| 5656 __rotate_left(_Tp __t, _Tp __n = 1) |
| 5657 { |
| 5658 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1
); |
| 5659 __n &= __bits; |
| 5660 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_
Tp>::type>(__t) >> (__bits - __n))); |
| 5661 } |
| 5662 |
| 5663 template <class _Tp> |
| 5664 inline _LIBCPP_INLINE_VISIBILITY |
| 5665 typename enable_if |
| 5666 < |
| 5667 is_integral<_Tp>::value, |
| 5668 _Tp |
| 5669 >::type |
| 5670 __rotate_right(_Tp __t, _Tp __n = 1) |
| 5671 { |
| 5672 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1
); |
| 5673 __n &= __bits; |
| 5674 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make
_unsigned<_Tp>::type>(__t) >> __n)); |
| 5675 } |
| 5676 |
| 5677 _LIBCPP_END_NAMESPACE_STD |
| 5678 |
| 5679 #endif // _LIBCPP_ALGORITHM |
OLD | NEW |