7#include <dr/concepts/concepts.hpp>
8#include <dr/detail/enumerate.hpp>
9#include <dr/detail/ranges_shim.hpp>
10#include <dr/detail/remote_subrange.hpp>
11#include <dr/detail/view_detectors.hpp>
20auto take_segments(R &&segments, std::size_t last_seg, std::size_t local_id) {
21 auto remainder = local_id;
23 auto take_partial = [=](
auto &&v) {
24 auto &&[i, segment] = v;
26 auto first = rng::begin(segment);
27 auto last = rng::begin(segment);
28 rng::advance(last, remainder);
35 return enumerate(segments) | rng::views::take(last_seg + 1) |
36 rng::views::transform(std::move(take_partial));
40template <
typename R>
auto take_segments(R &&segments, std::size_t n) {
41 std::size_t last_seg = 0;
42 std::size_t remainder = n;
44 for (
auto &&seg : segments) {
45 if (seg.size() >= remainder) {
48 remainder -= seg.size();
52 return take_segments(std::forward<R>(segments), last_seg, remainder);
57auto drop_segments(R &&segments, std::size_t first_seg, std::size_t local_id) {
58 auto remainder = local_id;
60 auto drop_partial = [=](
auto &&v) {
61 auto &&[i, segment] = v;
63 auto first = rng::begin(segment);
64 rng::advance(first, remainder);
65 auto last = rng::end(segment);
72 return enumerate(segments) | rng::views::drop(first_seg) |
73 rng::views::transform(std::move(drop_partial));
77template <
typename R>
auto drop_segments(R &&segments, std::size_t n) {
78 std::size_t first_seg = 0;
79 std::size_t remainder = n;
81 for (
auto &&seg : segments) {
82 if (seg.size() > remainder) {
85 remainder -= seg.size();
89 return drop_segments(std::forward<R>(segments), first_seg, remainder);
96namespace DR_RANGES_NAMESPACE {
100template <rng::range V>
103 return dr::ranges::rank(std::forward<V>(v).base());
106template <rng::range V>
107 requires(dr::is_ref_view_v<std::remove_cvref_t<V>> &&
109auto segments_(V &&v) {
110 return dr::ranges::segments(v.base());
113template <rng::range V>
114 requires(dr::is_take_view_v<std::remove_cvref_t<V>> &&
116auto segments_(V &&v) {
117 return dr::__detail::take_segments(dr::ranges::segments(v.base()), v.size());
120template <rng::range V>
121 requires(dr::is_drop_view_v<std::remove_cvref_t<V>> &&
123auto segments_(V &&v) {
124 return dr::__detail::drop_segments(dr::ranges::segments(v.base()),
125 v.base().size() - v.size());
128template <rng::range V>
129 requires(dr::is_subrange_view_v<std::remove_cvref_t<V>> &&
131auto segments_(V &&v) {
132 auto first = rng::begin(v);
133 auto last = rng::end(v);
134 auto size = rng::distance(first, last);
136 return dr::__detail::take_segments(dr::ranges::segments(first), size);
Definition: remote_subrange.hpp:15
Definition: concepts.hpp:31
Definition: concepts.hpp:20
Definition: concepts.hpp:16