1 // Copyright (C) 2014-2017 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-options "-std=gnu++17" }
19 // { dg-do run { target c++17 } }
23 #include <testsuite_hooks.h>
24 #include <testsuite_iterators.h>
29 using __gnu_test::test_container
;
30 using __gnu_test::input_iterator_wrapper
;
31 using __gnu_test::output_iterator_wrapper
;
32 using __gnu_test::forward_iterator_wrapper
;
33 using __gnu_test::random_access_iterator_wrapper
;
38 const int in
[] = { 1, 2 };
39 test_container
<const int, random_access_iterator_wrapper
> pop(in
);
40 const int sample_size
= 10;
41 int samp
[sample_size
] = { };
43 // population smaller than desired sample size
44 auto it
= sample(pop
.begin(), pop
.end(), samp
, sample_size
, rng
);
45 VERIFY( it
== samp
+ std::distance(pop
.begin(), pop
.end()) );
46 const auto sum
= std::accumulate(pop
.begin(), pop
.end(), 0);
47 VERIFY( std::accumulate(samp
, samp
+ sample_size
, 0) == sum
);
53 const int in
[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
54 test_container
<const int, random_access_iterator_wrapper
> pop(in
);
55 const int sample_size
= 10;
56 int samp
[sample_size
] = { };
58 auto it
= sample(pop
.begin(), pop
.end(), samp
, sample_size
, rng
);
59 VERIFY( it
== samp
+ sample_size
);
61 // verify no duplicates
63 auto it2
= std::unique(samp
, it
);
70 const int in
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
71 test_container
<const int, input_iterator_wrapper
> pop(in
);
72 const int sample_size
= 5;
73 int samp
[sample_size
] = { };
75 // input iterator for population
76 auto it
= sample(pop
.begin(), pop
.end(), samp
, sample_size
, rng
);
77 VERIFY( it
== samp
+ sample_size
);
79 // verify no duplicates
81 auto it2
= std::unique(samp
, it
);
88 const int in
[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
89 test_container
<const int, forward_iterator_wrapper
> pop(in
);
90 const int sample_size
= 5;
92 test_container
<int, output_iterator_wrapper
> samp(out
);
94 // forward iterator for population and output iterator for result
95 auto res
= sample(pop
.begin(), pop
.end(), samp
.begin(), sample_size
, rng
);
97 // verify no duplicates
98 std::sort(std::begin(out
), std::end(out
));
99 auto it
= std::unique(std::begin(out
), std::end(out
));
100 VERIFY( it
== std::end(out
) );