Distributed Ranges
Loading...
Searching...
No Matches
remote_subrange.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <iterator>
8
9#include <dr/concepts/concepts.hpp>
10#include <dr/detail/ranges_shim.hpp>
11
12namespace dr {
13
14template <std::forward_iterator I>
15class remote_subrange : public rng::subrange<I, I> {
16 using base = rng::subrange<I, I>;
17
18public:
20 requires std::default_initializable<I>
21 = default;
22
23 constexpr remote_subrange(I first, I last, std::size_t rank)
24 : base(first, last), rank_(rank) {}
25
26 template <rng::forward_range R>
27 constexpr remote_subrange(R &&r, std::size_t rank)
28 : base(rng::begin(r), rng::end(r)), rank_(rank) {}
29
30 template <dr::remote_range R>
31 constexpr remote_subrange(R &&r)
32 : base(rng::begin(r), rng::end(r)), rank_(dr::ranges::rank(r)) {}
33
34 constexpr std::size_t rank() const noexcept { return rank_; }
35
36private:
37 std::size_t rank_;
38};
39
40template <rng::forward_range R>
42
43template <dr::remote_range R>
45
46} // namespace dr
47
48#if !defined(DR_SPEC)
49
50// Needed to satisfy concepts for rng::begin
51template <typename R>
52inline constexpr bool rng::enable_borrowed_range<dr::remote_subrange<R>> = true;
53
54#endif
Definition: remote_subrange.hpp:15