399 {
400
401 if (first == middle || middle == last) {
402 return;
403 }
404
405
406 auto left_size = middle - first;
407 auto right_size = last - middle;
408 if (left_size + right_size <= 32) {
409
410 Iterator left = first;
411 Iterator right = middle;
412
413 while (left < middle && right < last) {
414 if (!comp(*right, *left)) {
415
416 ++left;
417 } else {
418
420 Iterator shift_end = right;
421 Iterator shift_start = left;
422
423
424 while (shift_end > shift_start) {
425 *shift_end =
fl::move(*(shift_end - 1));
426 --shift_end;
427 }
428
430 ++left;
431 ++middle;
432 ++right;
433 }
434 }
435 return;
436 }
437
438
439 if (left_size == 0 || right_size == 0) {
440 return;
441 }
442
443 if (left_size == 1) {
444
447 return;
448 }
449
450 if (right_size == 1) {
451
454 return;
455 }
456
457
458 Iterator left_mid = first + left_size / 2;
460
461
463
464
465 Iterator new_middle = left_mid + (right_mid - middle);
466
467
470}
void merge_inplace(Iterator first, Iterator middle, Iterator last, Compare comp)
void rotate_impl(Iterator first, Iterator middle, Iterator last)
Iterator lower_bound_impl(Iterator first, Iterator last, const T &value, Compare comp)
constexpr remove_reference< T >::type && move(T &&t) noexcept