1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <algorithm>
10 
11 // template<RandomAccessIterator Iter, Callable<auto, Iter::difference_type> Rand>
12 //   requires ShuffleIterator<Iter>
13 //         && Convertible<Rand::result_type, Iter::difference_type>
14 //   void
15 //   random_shuffle(Iter first, Iter last, Rand&& rand);
16 
17 // REQUIRES: c++03 || c++11 || c++14
18 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
19 
20 #include <algorithm>
21 #include <cassert>
22 #include <cstddef>
23 
24 #include "test_macros.h"
25 #include "test_iterators.h"
26 
27 
28 struct gen
29 {
operator ()gen30     std::ptrdiff_t operator()(std::ptrdiff_t n)
31     {
32         return n-1;
33     }
34 };
35 
36 
37 template <class Iter>
38 void
test_with_iterator()39 test_with_iterator()
40 {
41 
42     int ia[] = {1, 2, 3, 4};
43     int ia1[] = {4, 1, 2, 3};
44     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
45     gen r;
46 
47     std::random_shuffle(ia, ia+sa, r);
48     LIBCPP_ASSERT(std::equal(ia, ia+sa, ia1));
49     assert(std::is_permutation(ia, ia+sa, ia1));
50 
51     std::random_shuffle(ia, ia+sa, r);
52     assert(std::is_permutation(ia, ia+sa, ia1));
53 }
54 
55 
main(int,char **)56 int main(int, char**)
57 {
58     test_with_iterator<random_access_iterator<int*> >();
59     test_with_iterator<int*>();
60     return 0;
61 }
62