Distributed Ranges
Loading...
Searching...
No Matches
alignment.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/concepts/concepts.hpp>
8#include <dr/detail/ranges.hpp>
9#include <dr/detail/ranges_shim.hpp>
10
11namespace dr::mp {
12
13template <typename T>
14concept has_segments = requires(T &t) { dr::ranges::segments(t); };
15
16template <typename T>
18
19auto sub_aligned(has_segments auto &&r) {
20 if (rng::empty(dr::ranges::segments(r))) {
21 dr::drlog.debug("unaligned: empty segments\n");
22 return false;
23 } else {
24 return true;
25 }
26}
27
28auto sub_aligned(auto &&r) { return true; }
29
30// iter1 is aligned with iter2, and iter2 is aligned with the rest
31bool sub_aligned(has_segments auto &&r1, has_segments auto &&r2,
32 auto &&...rest) {
33 auto z = rng::views::zip(dr::ranges::segments(r1), dr::ranges::segments(r2));
34 auto i = rng::distance(z) - 1;
35 for (auto seg : z) {
36 if (dr::ranges::rank(seg.first) != dr::ranges::rank(seg.second)) {
37 dr::drlog.debug("unaligned: ranks: {} {}\n", dr::ranges::rank(seg.first),
38 dr::ranges::rank(seg.second));
39 return false;
40 }
41 // Size mismatch would misalign following segments. Skip test if this is the
42 // last segment
43 if (i > 0 && rng::distance(seg.first) != rng::distance(seg.second)) {
44 dr::drlog.debug("unaligned: size: {} {}\n", rng::distance(seg.first),
45 rng::distance(seg.second));
46 return false;
47 }
48 i--;
49 }
50
51 return sub_aligned(r2, rest...);
52}
53
54// Skip local iterators
55bool sub_aligned(no_segments auto &&r1, has_segments auto &&r2, auto... rest) {
56 return sub_aligned(r2, rest...);
57}
58
59bool sub_aligned(has_segments auto &&r1, no_segments auto &&r2,
60 auto &&...rest) {
61 return sub_aligned(r1, rest...);
62}
63
64// This was added to allow passing state down the call tree, but it is
65// no longer needed. I did not delete it in case we need it again.
66template <typename... Args> bool aligned(Args &&...args) {
67 return sub_aligned(std::forward<Args>(args)...);
68}
69
70} // namespace dr::mp
Definition: alignment.hpp:14
Definition: alignment.hpp:17