includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
template<typename _BIter>
+ _GLIBCXX26_CONSTEXPR
void
inplace_merge(_BIter, _BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX26_CONSTEXPR
void
inplace_merge(_BIter, _BIter, _BIter, _Compare);
typename _Comp = ranges::less,
typename _Proj = identity>
requires sortable<_Iter, _Comp, _Proj>
+ _GLIBCXX26_CONSTEXPR
_Iter
operator()(_Iter __first, _Iter __middle, _Sent __last,
_Comp __comp = {}, _Proj __proj = {}) const
template<bidirectional_range _Range,
typename _Comp = ranges::less, typename _Proj = identity>
requires sortable<iterator_t<_Range>, _Comp, _Proj>
+ _GLIBCXX26_CONSTEXPR
borrowed_iterator_t<_Range>
operator()(_Range&& __r, iterator_t<_Range> __middle,
_Comp __comp = {}, _Proj __proj = {}) const
}
template<typename _BidirectionalIterator, typename _Compare>
+ _GLIBCXX26_CONSTEXPR
void
__inplace_merge(_BidirectionalIterator __first,
_BidirectionalIterator __middle,
const _DistanceType __len2 = std::distance(__middle, __last);
#if _GLIBCXX_HOSTED
+# if __glibcxx_constexpr_algorithms >= 202306L // >= C++26
+ if consteval {
+ return std::__merge_without_buffer
+ (__first, __middle, __last, __len1, __len2, __comp);
+ }
+# endif
typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
// __merge_adaptive will use a buffer for the smaller of
// [first,middle) and [middle,last).
* distance(__first,__last).
*/
template<typename _BidirectionalIterator>
+ _GLIBCXX26_CONSTEXPR
inline void
inplace_merge(_BidirectionalIterator __first,
_BidirectionalIterator __middle,
* the function used for the initial sort.
*/
template<typename _BidirectionalIterator, typename _Compare>
+ _GLIBCXX26_CONSTEXPR
inline void
inplace_merge(_BidirectionalIterator __first,
_BidirectionalIterator __middle,
merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
template<typename _BIter>
+ _GLIBCXX26_CONSTEXPR
void
inplace_merge(_BIter, _BIter, _BIter);
template<typename _BIter, typename _Compare>
+ _GLIBCXX26_CONSTEXPR
void
inplace_merge(_BIter, _BIter, _BIter, _Compare);
--- /dev/null
+// { dg-do compile { target c++26 } }
+
+#include <algorithm>
+#include <array>
+#include <functional>
+#include <utility>
+
+// returns a pair [array, index of partitioning point]
+constexpr auto
+create_array()
+{
+ return std::make_pair(
+ std::to_array({0, 2, 2, 2, 4, 6, 1, 2, 3, 3, 4, 4, 5}),
+ 6);
+}
+
+constexpr bool
+test01()
+{
+ auto [ar, index] = create_array();
+ std::inplace_merge(ar.begin(), ar.begin() + index, ar.end());
+ return std::is_sorted(ar.begin(), ar.end());
+}
+
+static_assert(test01());
+
+constexpr bool
+test02()
+{
+ auto [ar, index] = create_array();
+ auto index_it = ar.begin() + index;
+ std::reverse(ar.begin(), index_it);
+ std::reverse(index_it, ar.end());
+ std::inplace_merge(ar.begin(), index_it, ar.end(), std::greater<>());
+ return std::is_sorted(ar.begin(), ar.end(), std::greater<>());
+}
+
+static_assert(test02());
+
+constexpr bool
+test03()
+{
+ auto [ar, index] = create_array();
+ std::ranges::inplace_merge(ar, ar.begin() + index);
+ return std::ranges::is_sorted(ar);
+}
+
+static_assert(test03());
+
+constexpr bool
+test04()
+{
+ auto [ar, index] = create_array();
+ auto index_it = ar.begin() + index;
+ std::ranges::reverse(ar.begin(), index_it);
+ std::ranges::reverse(index_it, ar.end());
+ std::ranges::inplace_merge(ar, index_it, std::ranges::greater());
+ return std::ranges::is_sorted(ar, std::ranges::greater());
+}
+
+static_assert(test04());
+
+constexpr bool
+test05()
+{
+ auto [ar, index] = create_array();
+ auto proj = [](int i) { return -i; };
+ std::ranges::inplace_merge(ar, ar.begin() + index, std::ranges::greater(), proj);
+ return std::ranges::is_sorted(ar, std::ranges::greater(), proj);
+}
+
+static_assert(test05());