1 | #ifndef BOOST_MOVE_TEST_RANDOM_SHUFFLE_HPP |
---|---|
2 | #define BOOST_MOVE_TEST_RANDOM_SHUFFLE_HPP |
3 | |
4 | |
5 | #include <boost/move/adl_move_swap.hpp> |
6 | #include <boost/move/detail/iterator_traits.hpp> |
7 | #include <stdlib.h> |
8 | |
9 | inline unsigned long long rand_15_bit() |
10 | { |
11 | //Many rand implementation only use 15 bits |
12 | //so make sure we have only 15 bits |
13 | return (unsigned long long)((std::rand()) & 0x7fff); |
14 | } |
15 | |
16 | inline unsigned long long ullrand() |
17 | { |
18 | return (rand_15_bit() << 54u) ^ (rand_15_bit() << 39u) |
19 | ^ (rand_15_bit() << 26u) ^ (rand_15_bit() << 13u) |
20 | ^ rand_15_bit(); |
21 | } |
22 | |
23 | template< class RandomIt > |
24 | void random_shuffle( RandomIt first, RandomIt last ) |
25 | { |
26 | std::size_t n = std::size_t (last - first); |
27 | for (std::size_t i = n-1; i > 0; --i) { |
28 | std::size_t j = static_cast<std::size_t >(ullrand() % (unsigned long long)(i+1)); |
29 | if(j != i) { |
30 | boost::adl_move_swap(first[i], first[j]); |
31 | } |
32 | } |
33 | } |
34 | |
35 | |
36 | #endif// BOOST_MOVE_TEST_RANDOM_SHUFFLE_HPP |
37 |