Distributed Ranges
Loading...
Searching...
No Matches
enumerate.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/mp/views/zip.hpp>
8
9namespace dr::mp {
10
11namespace views {
12
13namespace __detail {
14
15template <rng::range R> struct range_size {
16 using type = std::size_t;
17};
18
19template <rng::sized_range R> struct range_size<R> {
20 using type = rng::range_size_t<R>;
21};
22
23template <rng::range R> using range_size_t = typename range_size<R>::type;
24
25} // namespace __detail
26
28public:
29 template <rng::viewable_range R>
30 requires(rng::sized_range<R>)
31 auto operator()(R &&r) const {
32 using W = std::uint32_t;
33 return mp::views::zip(mp::views::iota(W(0), W(rng::distance(r))),
34 std::forward<R>(r));
35 }
36
37 template <rng::viewable_range R>
38 friend auto operator|(R &&r, const enumerate_adapter_closure &closure) {
39 return closure(std::forward<R>(r));
40 }
41};
42
44public:
45 template <rng::viewable_range R> constexpr auto operator()(R &&r) const {
46 return enumerate_adapter_closure{}(std::forward<R>(r));
47 }
48
49 inline auto enumerate() const { return enumerate_adapter_closure{}; }
50};
51
52inline constexpr auto enumerate = enumerate_fn_{};
53
54} // namespace views
55
56} // namespace dr::mp
Definition: enumerate.hpp:27
Definition: enumerate.hpp:43
Definition: enumerate.hpp:15