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/detail/ranges_shim.hpp>
8
9namespace dr {
10
11namespace __detail {
12
13namespace {
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
26
28public:
29 template <rng::viewable_range R> auto operator()(R &&r) const {
30 using S = range_size_t<R>;
31 // NOTE: This line only necessary due to bug in range-v3 where views
32 // have non-weakly-incrementable size types. (Standard mandates
33 // size type must be weakly incrementable.)
34 using W = std::conditional_t<std::weakly_incrementable<S>, S, std::size_t>;
35 if constexpr (rng::sized_range<R>) {
36 return rng::views::zip(rng::views::iota(W{0}, W{rng::size(r)}),
37 std::forward<R>(r));
38 } else {
39 return rng::views::zip(rng::views::iota(W{0}), std::forward<R>(r));
40 }
41 }
42
43 template <rng::viewable_range R>
44 friend auto operator|(R &&r, const enumerate_adapter_closure &closure) {
45 return closure(std::forward<R>(r));
46 }
47};
48
50public:
51 template <rng::viewable_range R> constexpr auto operator()(R &&r) const {
52 return enumerate_adapter_closure{}(std::forward<R>(r));
53 }
54
55 inline auto enumerate() const { return enumerate_adapter_closure{}; }
56};
57
58inline constexpr auto enumerate = enumerate_fn_{};
59
60} // namespace __detail
61
62} // namespace dr
Definition: enumerate.hpp:27
Definition: enumerate.hpp:49