11debfc3dSmrg// <experimental/algorithm> -*- C++ -*- 21debfc3dSmrg 3*8feb0f0bSmrg// Copyright (C) 2014-2020 Free Software Foundation, Inc. 41debfc3dSmrg// 51debfc3dSmrg// This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg// software; you can redistribute it and/or modify it under the 71debfc3dSmrg// terms of the GNU General Public License as published by the 81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg// any later version. 101debfc3dSmrg 111debfc3dSmrg// This library is distributed in the hope that it will be useful, 121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg// GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg// 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg// You should have received a copy of the GNU General Public License and 211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg// <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg/** @file experimental/algorithm 261debfc3dSmrg * This is a TS C++ Library header. 27*8feb0f0bSmrg * @ingroup libfund-ts 281debfc3dSmrg */ 291debfc3dSmrg 301debfc3dSmrg#ifndef _GLIBCXX_EXPERIMENTAL_ALGORITHM 311debfc3dSmrg#define _GLIBCXX_EXPERIMENTAL_ALGORITHM 1 321debfc3dSmrg 331debfc3dSmrg#pragma GCC system_header 341debfc3dSmrg 351debfc3dSmrg#if __cplusplus >= 201402L 361debfc3dSmrg 371debfc3dSmrg#include <algorithm> 381debfc3dSmrg#include <experimental/bits/lfts_config.h> 39a2dc1f3fSmrg#include <experimental/random> 401debfc3dSmrg 411debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 421debfc3dSmrg{ 431debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 441debfc3dSmrg 45a2dc1f3fSmrgnamespace experimental 46a2dc1f3fSmrg{ 47a2dc1f3fSmrginline namespace fundamentals_v2 48a2dc1f3fSmrg{ 491debfc3dSmrg template<typename _ForwardIterator, typename _Searcher> 501debfc3dSmrg inline _ForwardIterator 511debfc3dSmrg search(_ForwardIterator __first, _ForwardIterator __last, 521debfc3dSmrg const _Searcher& __searcher) 531debfc3dSmrg { return __searcher(__first, __last); } 541debfc3dSmrg 551debfc3dSmrg#define __cpp_lib_experimental_sample 201402 561debfc3dSmrg 571debfc3dSmrg /// Take a random sample from a population. 581debfc3dSmrg template<typename _PopulationIterator, typename _SampleIterator, 591debfc3dSmrg typename _Distance, typename _UniformRandomNumberGenerator> 601debfc3dSmrg _SampleIterator 611debfc3dSmrg sample(_PopulationIterator __first, _PopulationIterator __last, 621debfc3dSmrg _SampleIterator __out, _Distance __n, 631debfc3dSmrg _UniformRandomNumberGenerator&& __g) 641debfc3dSmrg { 651debfc3dSmrg using __pop_cat = typename 661debfc3dSmrg std::iterator_traits<_PopulationIterator>::iterator_category; 671debfc3dSmrg using __samp_cat = typename 681debfc3dSmrg std::iterator_traits<_SampleIterator>::iterator_category; 691debfc3dSmrg 701debfc3dSmrg static_assert( 711debfc3dSmrg __or_<is_convertible<__pop_cat, forward_iterator_tag>, 721debfc3dSmrg is_convertible<__samp_cat, random_access_iterator_tag>>::value, 731debfc3dSmrg "output range must use a RandomAccessIterator when input range" 741debfc3dSmrg " does not meet the ForwardIterator requirements"); 751debfc3dSmrg 761debfc3dSmrg static_assert(is_integral<_Distance>::value, 771debfc3dSmrg "sample size must be an integer type"); 781debfc3dSmrg 791debfc3dSmrg typename iterator_traits<_PopulationIterator>::difference_type __d = __n; 80*8feb0f0bSmrg return _GLIBCXX_STD_A:: 81*8feb0f0bSmrg __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d, 821debfc3dSmrg std::forward<_UniformRandomNumberGenerator>(__g)); 831debfc3dSmrg } 841debfc3dSmrg 85a2dc1f3fSmrg template<typename _PopulationIterator, typename _SampleIterator, 86a2dc1f3fSmrg typename _Distance> 87a2dc1f3fSmrg inline _SampleIterator 88a2dc1f3fSmrg sample(_PopulationIterator __first, _PopulationIterator __last, 89a2dc1f3fSmrg _SampleIterator __out, _Distance __n) 90a2dc1f3fSmrg { 91a2dc1f3fSmrg return experimental::sample(__first, __last, __out, __n, 92a2dc1f3fSmrg _S_randint_engine()); 93a2dc1f3fSmrg } 94a2dc1f3fSmrg 95a2dc1f3fSmrg template<typename _RandomAccessIterator> 96a2dc1f3fSmrg inline void 97a2dc1f3fSmrg shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) 98a2dc1f3fSmrg { return std::shuffle(__first, __last, _S_randint_engine()); } 99a2dc1f3fSmrg 100a2dc1f3fSmrg} // namespace fundamentals_v2 1011debfc3dSmrg} // namespace experimental 102a2dc1f3fSmrg 103a2dc1f3fSmrg_GLIBCXX_END_NAMESPACE_VERSION 1041debfc3dSmrg} // namespace std 1051debfc3dSmrg 1061debfc3dSmrg#endif // C++14 1071debfc3dSmrg 1081debfc3dSmrg#endif // _GLIBCXX_EXPERIMENTAL_ALGORITHM 109