//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // // template // SampleIterator sample(PopulationIterator first, PopulationIterator last, // SampleIterator out, Distance n, // UniformRandomNumberGenerator &&g); #include #include #include #include "test_macros.h" #include "test_iterators.h" // Stable if and only if PopulationIterator meets the requirements of a // ForwardIterator type. template void test_stability(bool expect_stable) { const unsigned kPopulationSize = 100; int ia[kPopulationSize]; for (unsigned i = 0; i < kPopulationSize; ++i) ia[i] = i; PopulationIterator first(ia); PopulationIterator last(ia + kPopulationSize); const unsigned kSampleSize = 20; int oa[kPopulationSize]; SampleIterator out(oa); std::minstd_rand g; const int kIterations = 1000; bool unstable = false; for (int i = 0; i < kIterations; ++i) { std::sample(first, last, out, kSampleSize, g); unstable |= !std::is_sorted(oa, oa + kSampleSize); } assert(expect_stable == !unstable); } int main(int, char**) { test_stability, output_iterator >(true); test_stability, random_access_iterator >(false); return 0; }