1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // template<BidirectionalIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare>
13 // requires ShuffleIterator<Iter>
14 // && CopyConstructible<Compare>
16 // inplace_merge(Iter first, Iter middle, Iter last, Compare comp);
22 #include "test_macros.h"
24 #if TEST_STD_VER >= 11
30 bool operator()(const P& x, const P& y)
38 S(const S& rhs) : i_(rhs.i_) {}
39 S( S&& rhs) : i_(rhs.i_) { rhs.i_ = -1; }
41 S& operator =(const S& rhs) { i_ = rhs.i_; return *this; }
42 S& operator =( S&& rhs) { i_ = rhs.i_; rhs.i_ = -2; assert(this != &rhs); return *this; }
43 S& operator =(int i) { i_ = i; return *this; }
45 bool operator <(const S& rhs) const { return i_ < rhs.i_; }
46 bool operator >(const S& rhs) const { return i_ > rhs.i_; }
47 bool operator ==(const S& rhs) const { return i_ == rhs.i_; }
48 bool operator ==(int i) const { return i_ == i; }
50 void set(int i) { i_ = i; }
56 #endif // TEST_STD_VER >= 11
58 #include "test_iterators.h"
59 #include "counting_predicates.hpp"
63 test_one(unsigned N, unsigned M)
66 typedef typename std::iterator_traits<Iter>::value_type value_type;
67 value_type* ia = new value_type[N];
68 for (unsigned i = 0; i < N; ++i)
70 std::random_shuffle(ia, ia+N);
71 std::sort(ia, ia+M, std::greater<value_type>());
72 std::sort(ia+M, ia+N, std::greater<value_type>());
73 binary_counting_predicate<std::greater<value_type>, value_type, value_type> pred((std::greater<value_type>()));
74 std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N), std::ref(pred));
77 assert(ia[0] == static_cast<int>(N)-1);
79 assert(std::is_sorted(ia, ia+N, std::greater<value_type>()));
80 assert(pred.count() <= (N-1));
90 test_one<Iter>(N, N/4);
91 test_one<Iter>(N, N/2);
92 test_one<Iter>(N, 3*N/4);
100 test_one<Iter>(0, 0);
101 test_one<Iter>(1, 0);
102 test_one<Iter>(1, 1);
103 test_one<Iter>(2, 0);
104 test_one<Iter>(2, 1);
105 test_one<Iter>(2, 2);
106 test_one<Iter>(3, 0);
107 test_one<Iter>(3, 1);
108 test_one<Iter>(3, 2);
109 test_one<Iter>(3, 3);
118 test<bidirectional_iterator<int*> >();
119 test<random_access_iterator<int*> >();
122 #if TEST_STD_VER >= 11
123 test<bidirectional_iterator<S*> >();
124 test<random_access_iterator<S*> >();
130 std::unique_ptr<int>* ia = new std::unique_ptr<int>[N];
131 for (int i = 0; i < N; ++i)
132 ia[i].reset(new int(i));
133 std::random_shuffle(ia, ia+N);
134 std::sort(ia, ia+M, indirect_less());
135 std::sort(ia+M, ia+N, indirect_less());
136 std::inplace_merge(ia, ia+M, ia+N, indirect_less());
140 assert(*ia[N-1] == N-1);
141 assert(std::is_sorted(ia, ia+N, indirect_less()));
145 #endif // TEST_STD_VER >= 11