1#ifndef NEFORCE_CORE_ALGORITHM_PARALLEL_HPP__
2#define NEFORCE_CORE_ALGORITHM_PARALLEL_HPP__
13NEFORCE_BEGIN_NAMESPACE__
41template <
typename Iterator,
typename BinaryOperation,
typename Result,
size_t Threshhold = 10>
42void reduce(Iterator first, Iterator last, BinaryOperation op, Result& res) {
45 const size_t dist = _NEFORCE
distance(first, last);
46 if (dist <= Threshhold) {
47 for (Iterator it = first; it != last; ++it) {
51 Iterator mid = _NEFORCE
next(first, dist / 2);
52 Result l_res = res, r_res = res;
55 _NEFORCE
reduce(first, mid, op, l_res);
57 res = op(l_res, r_res);
77template <
typename Iterator,
typename UnaryOperation,
typename BinaryOp,
typename Result,
size_t Threshhold = 10>
81 const size_t dist = _NEFORCE
distance(first, last);
82 if (dist <= Threshhold) {
83 for (Iterator it = first; it != last; ++it) {
84 res =
reduce(res, transform(*it));
87 Iterator mid = _NEFORCE
next(first, dist / 2);
101NEFORCE_END_NAMESPACE__
NEFORCE_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
void transform_reduce(Iterator first, Iterator last, UnaryOperation transform, BinaryOp reduce, Result &res)
并行变换归约操作
void reduce(Iterator first, Iterator last, BinaryOperation op, Result &res)
并行归约操作
NEFORCE_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值