diff --git a/libcxx/include/__cxx03/__algorithm/shuffle.h b/libcxx/include/__cxx03/__algorithm/shuffle.h index fee7028ae22a..24cd71c71378 100644 --- a/libcxx/include/__cxx03/__algorithm/shuffle.h +++ b/libcxx/include/__cxx03/__algorithm/shuffle.h @@ -109,7 +109,7 @@ _LIBCPP_HIDE_FROM_ABI void random_shuffle(_RandomAccessIterator __first, _Random template _LIBCPP_HIDE_FROM_ABI void -random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, _RandomNumberGenerator&& __rand) { +random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, _RandomNumberGenerator& __rand) { typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; difference_type __d = __last - __first; if (__d > 1) { diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp index 5a2b58f4a535..620561511a5a 100644 --- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp +++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp @@ -8,11 +8,11 @@ // -// template Rand> -// requires ShuffleIterator -// && Convertible -// void -// random_shuffle(Iter first, Iter last, Rand&& rand); +// template +// void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomFunc& rand); // until C++11 +// +// template +// void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomFunc&& rand); // since C++11 // REQUIRES: c++03 || c++11 || c++14 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS @@ -20,42 +20,43 @@ #include #include #include +#include #include "test_macros.h" #include "test_iterators.h" - -struct gen -{ - std::ptrdiff_t operator()(std::ptrdiff_t n) - { - return n-1; - } +struct RandomGenerator { + std::ptrdiff_t operator()(std::ptrdiff_t n) { return n - 1; } }; - template -void -test_with_iterator() -{ +void test_with_iterator() { + RandomGenerator gen; + int values[] = {1, 2, 3, 4}; - int ia[] = {1, 2, 3, 4}; - int ia1[] = {4, 1, 2, 3}; - const unsigned sa = sizeof(ia)/sizeof(ia[0]); - gen r; + // Make sure the algorithm shuffles + { + int arr[] = {1, 2, 3, 4}; + std::random_shuffle(Iter(std::begin(arr)), Iter(std::end(arr)), gen); + int libcxx_expected[] = {4, 1, 2, 3}; + LIBCPP_ASSERT(std::equal(std::begin(arr), std::end(arr), std::begin(libcxx_expected))); + assert(std::is_permutation(std::begin(arr), std::end(arr), std::begin(values))); + std::random_shuffle(Iter(std::begin(arr)), Iter(std::end(arr)), gen); + assert(std::is_permutation(std::begin(arr), std::end(arr), std::begin(values))); + } - std::random_shuffle(ia, ia+sa, r); - LIBCPP_ASSERT(std::equal(ia, ia+sa, ia1)); - assert(std::is_permutation(ia, ia+sa, ia1)); - - std::random_shuffle(ia, ia+sa, r); - assert(std::is_permutation(ia, ia+sa, ia1)); + // Test the signature in C++03 mode, which takes a lvalue reference +#if TEST_STD_VER == 03 + { + int arr[] = {1, 2, 3, 4}; + std::random_shuffle(Iter(std::begin(arr)), Iter(std::end(arr)), gen); + assert(std::is_permutation(std::begin(arr), std::end(arr), std::begin(values))); + } +#endif } - -int main(int, char**) -{ - test_with_iterator >(); - test_with_iterator(); - return 0; +int main(int, char**) { + test_with_iterator >(); + test_with_iterator(); + return 0; }