51 template<
typename I,
typename S>
auto operator()(
I first,
S last) {
52 const std::size_t size = std::distance(first, last);
71 template<
typename I,
typename S>
auto operator()(
I first,
S last) {
77 const std::size_t size = std::distance(first, last);
90 return std::clamp(
n / (8 * std::max(
occupancy,
static_cast<std::size_t
>(1))),
size_t(1),
size_t(2048));
105 template<traits::input_iterator I, traits::sentinel_for<I> S>
122 if constexpr(can_query<E, ExecutorOccupancy>::value) {
133 template<traits::executor E, traits::input_iterator I, traits::sentinel_for<I> S>
148 template<
class T,
class I,
class S>
149 using is_partitioner = std::conjunction<std::conditional_t<traits::is_input_iterator_v<I>, std::true_type, std::false_type>,
150 std::conditional_t<traits::is_input_iterator_v<S>, std::true_type, std::false_type>, std::is_invocable<T, I, S>>;
156 template<
class T,
class I,
class S>
167 template<
class T,
class R>
The halve partitioner always splits the sequence into two parts of roughly equal size.
Definition Partitioner.hpp:37
auto operator()(I first, S last)
Split a range of elements.
Definition Partitioner.hpp:51
constexpr HalvePartitioner(const std::size_t minimumGrainSize)
Halve partition constructor.
Definition Partitioner.hpp:43
std::size_t mMinimumGrainSize
Definition Partitioner.hpp:38
A partitioner that splits the ranges until it identifies we are not moving to new threads.
Definition Partitioner.hpp:63
ThreadPartitioner(const std::size_t minimumGrainSize, const std::size_t occupancy=hardware_concurrency())
Definition Partitioner.hpp:68
std::size_t mThreadCount
Definition Partitioner.hpp:65
auto operator()(I first, S last)
Definition Partitioner.hpp:71
std::size_t mMinimumGrainSize
Definition Partitioner.hpp:64
Definition Partitioner.hpp:157
Definition Partitioner.hpp:168
std::conjunction< std::conditional_t< traits::is_input_iterator_v< I >, std::true_type, std::false_type >, std::conditional_t< traits::is_input_iterator_v< S >, std::true_type, std::false_type >, std::is_invocable< T, I, S > > is_partitioner
Determine if P is a valid partitioner for the iterator range [I,S].
Definition Partitioner.hpp:150
constexpr bool is_partitioner_v
Determine if P is a valid partitioner for the iterator range [I,S].
Definition Partitioner.hpp:153
constexpr bool is_range_partitioner_v
Determine if P is a valid partitioner for the range R.
Definition Partitioner.hpp:164
Definition Application.hpp:19
constexpr std::size_t make_grain_size(const std::size_t n, const std::size_t occupancy=hardware_concurrency())
Determine a reasonable minimum grain size depending on the number of elements in a sequence.
Definition Partitioner.hpp:89
constexpr std::size_t hardware_concurrency() noexcept
A version of hardware_concurrency that always returns at least 1.
Definition ExecutionContext.hpp:597
asio::execution::occupancy_t ExecutorOccupancy
Definition ExecutionContext.hpp:212
ThreadPartitioner DefaultPartitioner
Default partitioner used by parallel algorithms.
Definition Partitioner.hpp:85
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
DefaultPartitioner make_default_partitioner(const size_t n, const std::size_t occupancy=hardware_concurrency())
Create an instance of the default partitioner with a reasonable grain size for n elements.
Definition Partitioner.hpp:97
Determine if P is a valid partitioner for the range R.
Definition Partitioner.hpp:160