diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index a179acf63f2f..9c51284a4ce5 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -4482,12 +4482,6 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, } } -template -struct __inplace_merge_switch -{ - static const unsigned value = is_trivially_copy_assignable<_Tp>::value; -}; - template inline _LIBCPP_INLINE_VISIBILITY void @@ -4499,13 +4493,9 @@ inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _ difference_type __len1 = _VSTD::distance(__first, __middle); difference_type __len2 = _VSTD::distance(__middle, __last); difference_type __buf_size = _VSTD::min(__len1, __len2); - pair __buf(0, 0); - unique_ptr __h; - if (__inplace_merge_switch::value && __buf_size > 8) - { - __buf = _VSTD::get_temporary_buffer(__buf_size); - __h.reset(__buf.first); - } + pair __buf = _VSTD::get_temporary_buffer(__buf_size); + unique_ptr __h(__buf.first); + #ifdef _LIBCPP_DEBUG typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; __debug_less<_Compare> __c(__comp); diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp index 8da8dfee7191..b54efb688de0 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp @@ -31,6 +31,7 @@ struct indirect_less #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES #include "test_iterators.h" +#include "counting_predicates.hpp" template void @@ -43,12 +44,14 @@ test_one(unsigned N, unsigned M) std::random_shuffle(ia, ia+N); std::sort(ia, ia+M, std::greater()); std::sort(ia+M, ia+N, std::greater()); - std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N), std::greater()); + binary_counting_predicate, int, int> pred((std::greater())); + std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N), std::ref(pred)); if(N > 0) { assert(ia[0] == N-1); assert(ia[N-1] == 0); assert(std::is_sorted(ia, ia+N, std::greater())); + assert(pred.count() <= (N-1)); } delete [] ia; } @@ -79,6 +82,7 @@ test() test_one(3, 2); test_one(3, 3); test(4); + test(20); test(100); test(1000); } diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp index 69bcaf1198ba..bd38d7de6894 100644 --- a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp @@ -25,6 +25,7 @@ #include #include "test_iterators.h" +#include "counting_predicates.hpp" template void @@ -41,12 +42,14 @@ test() ib[i] = 2*i+1; std::reverse(ia, ia+N); std::reverse(ib, ib+N); + binary_counting_predicate, int, int> pred((std::greater())); OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic), std::greater()); + InIter2(ib), InIter2(ib+N), OutIter(ic), pred); assert(base(r) == ic+2*N); assert(ic[0] == 2*N-1); assert(ic[2*N-1] == 0); assert(std::is_sorted(ic, ic+2*N, std::greater())); + assert(pred.count() <= (N + N - 1)); delete [] ic; delete [] ib; delete [] ia; @@ -63,12 +66,14 @@ test() std::copy(ic+N, ic+2*N, ib); std::sort(ia, ia+N, std::greater()); std::sort(ib, ib+N, std::greater()); + binary_counting_predicate, int, int> pred((std::greater())); OutIter r = std::merge(InIter1(ia), InIter1(ia+N), - InIter2(ib), InIter2(ib+N), OutIter(ic), std::greater()); + InIter2(ib), InIter2(ib+N), OutIter(ic), pred); assert(base(r) == ic+2*N); assert(ic[0] == 2*N-1); assert(ic[2*N-1] == 0); assert(std::is_sorted(ic, ic+2*N, std::greater())); + assert(pred.count() <= (N + N - 1)); delete [] ic; delete [] ib; delete [] ia;