173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 273ebcabfSKonstantin Varlamov // 373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673ebcabfSKonstantin Varlamov // 773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 873ebcabfSKonstantin Varlamov 973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H 1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H 1173ebcabfSKonstantin Varlamov 1214cf74d6SKonstantin Varlamov #include <__algorithm/iterator_operations.h> 1373ebcabfSKonstantin Varlamov #include <__algorithm/shuffle.h> 146bdb6422SKonstantin Varlamov #include <__algorithm/uniform_random_bit_generator_adaptor.h> 1573ebcabfSKonstantin Varlamov #include <__config> 1673ebcabfSKonstantin Varlamov #include <__functional/invoke.h> 1773ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h> 1873ebcabfSKonstantin Varlamov #include <__iterator/concepts.h> 1973ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h> 2014cf74d6SKonstantin Varlamov #include <__iterator/next.h> 2173ebcabfSKonstantin Varlamov #include <__iterator/permutable.h> 2273ebcabfSKonstantin Varlamov #include <__random/uniform_random_bit_generator.h> 2373ebcabfSKonstantin Varlamov #include <__ranges/access.h> 2473ebcabfSKonstantin Varlamov #include <__ranges/concepts.h> 2573ebcabfSKonstantin Varlamov #include <__ranges/dangling.h> 26e698c595SNikolas Klauser #include <__type_traits/remove_reference.h> 2773ebcabfSKonstantin Varlamov #include <__utility/forward.h> 2873ebcabfSKonstantin Varlamov #include <__utility/move.h> 2973ebcabfSKonstantin Varlamov 3073ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3173ebcabfSKonstantin Varlamov # pragma GCC system_header 3273ebcabfSKonstantin Varlamov #endif 3373ebcabfSKonstantin Varlamov 347b462251SLouis Dionne _LIBCPP_PUSH_MACROS 357b462251SLouis Dionne #include <__undef_macros> 367b462251SLouis Dionne 374f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 3873ebcabfSKonstantin Varlamov 3973ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 4073ebcabfSKonstantin Varlamov 4173ebcabfSKonstantin Varlamov namespace ranges { 42*d10dc5a0SChristopher Di Bella struct __shuffle { 4373ebcabfSKonstantin Varlamov template <random_access_iterator _Iter, sentinel_for<_Iter> _Sent, class _Gen> 4473ebcabfSKonstantin Varlamov requires permutable<_Iter> && uniform_random_bit_generator<remove_reference_t<_Gen>> 455aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Iter operator()(_Iter __first, _Sent __last, _Gen&& __gen) const { 4614cf74d6SKonstantin Varlamov _ClassicGenAdaptor<_Gen> __adapted_gen(__gen); 4714cf74d6SKonstantin Varlamov return std::__shuffle<_RangeAlgPolicy>(std::move(__first), std::move(__last), __adapted_gen); 4873ebcabfSKonstantin Varlamov } 4973ebcabfSKonstantin Varlamov 5073ebcabfSKonstantin Varlamov template <random_access_range _Range, class _Gen> 5173ebcabfSKonstantin Varlamov requires permutable<iterator_t<_Range>> && uniform_random_bit_generator<remove_reference_t<_Gen>> 525aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_Range> operator()(_Range&& __range, _Gen&& __gen) const { 5314cf74d6SKonstantin Varlamov return (*this)(ranges::begin(__range), ranges::end(__range), std::forward<_Gen>(__gen)); 5473ebcabfSKonstantin Varlamov } 5573ebcabfSKonstantin Varlamov }; 5673ebcabfSKonstantin Varlamov 5773ebcabfSKonstantin Varlamov inline namespace __cpo { 58*d10dc5a0SChristopher Di Bella inline constexpr auto shuffle = __shuffle{}; 5973ebcabfSKonstantin Varlamov } // namespace __cpo 6073ebcabfSKonstantin Varlamov } // namespace ranges 6173ebcabfSKonstantin Varlamov 6273ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 6373ebcabfSKonstantin Varlamov 644f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 6573ebcabfSKonstantin Varlamov 667b462251SLouis Dionne _LIBCPP_POP_MACROS 677b462251SLouis Dionne 6873ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H 69