Distributed Ranges
Loading...
Searching...
No Matches
transform.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <algorithm>
8#include <execution>
9#include <type_traits>
10#include <utility>
11
12#include <dr/concepts/concepts.hpp>
13#include <dr/detail/logger.hpp>
14#include <dr/detail/onedpl_direct_iterator.hpp>
15#include <dr/detail/ranges_shim.hpp>
16#include <dr/mp/global.hpp>
17
18namespace dr::mp {
19
20void transform(rng::forward_range auto &&in, dr::distributed_iterator auto out,
21 auto op) {
22 if (rng::empty(in)) {
23 return;
24 }
25 assert(aligned(in, out));
26
27 auto zip = mp::views::zip(in, rng::subrange(out, out + rng::size(in)));
28 auto transform_op = [op](auto pair) {
29 auto &[in, out] = pair;
30 out = op(in);
31 };
32 for_each(zip, transform_op);
33}
34
35template <rng::forward_iterator DI_IN>
36void transform(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out,
37 auto op) {
38 mp::transform(rng::subrange(first, last), out, op);
39}
40
41} // namespace dr::mp
Definition: concepts.hpp:31