//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // template // SampleIterator sample(PopulationIterator first, PopulationIterator last, // SampleIterator out, Distance n, // UniformRandomNumberGenerator &&g); #include #include #include #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::experimental::sample(first, last, out, kSampleSize, g); unstable |= !std::is_sorted(oa, oa + kSampleSize); } assert(expect_stable == !unstable); } int main() { test_stability, output_iterator >(true); test_stability, random_access_iterator >(false); }