7#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_INPLACE_MERGE_HPP_
8#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_INPLACE_MERGE_HPP_
13#include "arene/base/algorithm/detail/bind_back_with_iterator.hpp"
14#include "arene/base/algorithm/detail/traits.hpp"
15#include "arene/base/algorithm/find_if.hpp"
16#include "arene/base/algorithm/rotate.hpp"
17#include "arene/base/compiler_support/cpp14_inline.hpp"
18#include "arene/base/constraints/constraints.hpp"
19#include "arene/base/functional/not_fn.hpp"
20#include "arene/base/iterator/advance.hpp"
21#include "arene/base/iterator/distance.hpp"
22#include "arene/base/stdlib_choice/declval.hpp"
23#include "arene/base/stdlib_choice/enable_if.hpp"
24#include "arene/base/stdlib_choice/is_copy_constructible.hpp"
25#include "arene/base/stdlib_choice/is_move_assignable.hpp"
26#include "arene/base/stdlib_choice/move.hpp"
27#include "arene/base/type_traits/comparison_traits.hpp"
28#include "arene/base/type_traits/denotes_range.hpp"
29#include "arene/base/type_traits/is_compare.hpp"
30#include "arene/base/type_traits/is_invocable.hpp"
31#include "arene/base/type_traits/is_movable.hpp"
32#include "arene/base/type_traits/is_swappable.hpp"
33#include "arene/base/type_traits/iterator_category_traits.hpp"
34#include "arene/base/type_traits/remove_cvref.hpp"
42namespace algorithm_detail {
43namespace inplace_merge_detail {
47class inplace_merge_impl_fn {
91 class BidirectionalIt,
94 std::enable_if_t<is_bidirectional_iterator_v<BidirectionalIt>>,
95 std::enable_if_t<is_swappable_v<iter_reference_t<BidirectionalIt>>>,
96 std::enable_if_t<is_movable_v<remove_cvref_t<iter_reference_t<BidirectionalIt>>>>,
97 std::enable_if_t<is_compare_v<Compare&, iter_reference_t<BidirectionalIt>>>> =
nullptr>
98 constexpr auto operator()(BidirectionalIt first, BidirectionalIt middle, BidirectionalIt last, Compare comp)
const
100 is_nothrow_equality_comparable_v<BidirectionalIt> &&
101 denotes_nothrow_iterable_range_v<BidirectionalIt> &&
102 std::is_nothrow_copy_constructible<BidirectionalIt>::value&&
103 noexcept(arene::base::find_if(
104 std::declval<BidirectionalIt>(),
105 std::declval<BidirectionalIt&>(),
106 std::declval<bind_back_with_iterator<Compare, BidirectionalIt>>()
108 is_nothrow_invocable_v<
decltype(rotate), BidirectionalIt, BidirectionalIt, BidirectionalIt>&&
109 noexcept(arene::base::advance(
110 std::declval<BidirectionalIt&>(),
111 arene::base::distance(
112 std::declval<BidirectionalIt&>(),
113 std::declval<BidirectionalIt&>()
116 std::is_nothrow_move_assignable<BidirectionalIt>::value
121 while ((left != middle) && (right != last)) {
122 auto right_end = arene::base::find_if(
125 not_fn(bind_back_with_iterator<Compare, BidirectionalIt>{comp, left})
127 if (right_end == right) {
130 auto const block_size = arene::base::distance(right, right_end);
131 left = rotate(left, right, right_end);
132 arene::base::advance(middle, block_size);
133 right = std::move(right_end);
Definition array_exceptions_disabled.cpp:11
ARENE_CPP14_INLINE_VARIABLE(algorithm_detail::inplace_merge_detail::inplace_merge_impl_fn, inplace_merge)
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10