Iros
 
Loading...
Searching...
No Matches
shuffle.h
Go to the documentation of this file.
1#pragma once
2
8
9namespace di::container {
10namespace detail {
12 template<concepts::RandomAccessIterator It, concepts::SentinelFor<It> Sent, typename Gen>
14 constexpr auto operator()(It first, Sent last, Gen&& generator) const -> It {
15 using SSizeType = meta::IteratorSSizeType<It>;
17 using Param = Distribution::Param;
18
19 auto const size = container::distance(first, last);
20 auto distribution = Distribution();
21
22 // Fisher-Yates shuffle.
23 for (SSizeType i = size - 1; i > 0; i--) {
24 auto j = distribution(generator, Param { 0, i });
25 container::iterator_swap(first + i, first + j);
26 }
27 return first + size;
28 }
29
30 template<concepts::RandomAccessContainer Con, typename Gen>
33 constexpr auto operator()(Con&& container, Gen&& generator) const -> meta::BorrowedIterator<Con> {
34 return (*this)(container::begin(container), container::end(container), generator);
35 }
36 };
37}
38
39constexpr inline auto shuffle = detail::ShuffleFunction {};
40}
41
42namespace di {
44}
Definition uniform_int_distribution.h:10
Definition permutable.h:9
Definition uniform_random_bit_generator.h:10
Definition sequence.h:13
Definition sequence.h:12
constexpr auto shuffle
Definition shuffle.h:39
constexpr auto distance
Definition distance.h:44
constexpr auto size
Definition size.h:54
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
Conditional< concepts::BorrowedContainer< Con >, ContainerIterator< Con >, container::Dangling > BorrowedIterator
Definition borrowed_iterator.h:11
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
Definition zstring_parser.h:9