Home | History | Annotate | Download | only in partial.sort
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <algorithm>
     11 
     12 // template<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare>
     13 //   requires ShuffleIterator<Iter>
     14 //         && CopyConstructible<Compare>
     15 //   void
     16 //   partial_sort(Iter first, Iter middle, Iter last, Compare comp);
     17 
     18 #include <algorithm>
     19 #include <vector>
     20 #include <functional>
     21 #include <cassert>
     22 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     23 #include <memory>
     24 
     25 struct indirect_less
     26 {
     27     template <class P>
     28     bool operator()(const P& x, const P& y)
     29         {return *x < *y;}
     30 };
     31 
     32 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     33 
     34 void
     35 test_larger_sorts(unsigned N, unsigned M)
     36 {
     37     assert(N != 0);
     38     int* array = new int[N];
     39     for (int i = 0; i < N; ++i)
     40         array[i] = i;
     41     std::random_shuffle(array, array+N);
     42     std::partial_sort(array, array+M, array+N, std::greater<int>());
     43     for (int i = 0; i < M; ++i)
     44         assert(array[i] == N-i-1);
     45     delete [] array;
     46 }
     47 
     48 void
     49 test_larger_sorts(unsigned N)
     50 {
     51     test_larger_sorts(N, 0);
     52     test_larger_sorts(N, 1);
     53     test_larger_sorts(N, 2);
     54     test_larger_sorts(N, 3);
     55     test_larger_sorts(N, N/2-1);
     56     test_larger_sorts(N, N/2);
     57     test_larger_sorts(N, N/2+1);
     58     test_larger_sorts(N, N-2);
     59     test_larger_sorts(N, N-1);
     60     test_larger_sorts(N, N);
     61 }
     62 
     63 int main()
     64 {
     65     int i = 0;
     66     std::partial_sort(&i, &i, &i);
     67     assert(i == 0);
     68     test_larger_sorts(10);
     69     test_larger_sorts(256);
     70     test_larger_sorts(257);
     71     test_larger_sorts(499);
     72     test_larger_sorts(500);
     73     test_larger_sorts(997);
     74     test_larger_sorts(1000);
     75     test_larger_sorts(1009);
     76 
     77 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     78     {
     79     std::vector<std::unique_ptr<int> > v(1000);
     80     for (int i = 0; i < v.size(); ++i)
     81         v[i].reset(new int(i));
     82     std::partial_sort(v.begin(), v.begin() + v.size()/2, v.end(), indirect_less());
     83     for (int i = 0; i < v.size()/2; ++i)
     84         assert(*v[i] == i);
     85     }
     86 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     87 }
     88