7#include <dr/detail/remote_subrange.hpp>
11template <
typename BaseIter,
typename SegTplIter,
typename SegTplSentinel>
14 using iterator_category = std::forward_iterator_tag;
15 using difference_type = rng::iter_difference_t<SegTplIter>;
20 SegTplSentinel tpl_end)
21 : base_cur_(base_begin), tpl_cur_(tpl_begin), tpl_end_(tpl_end) {}
24 return tpl_cur_ == other.tpl_cur_;
27 base_cur_ += rng::size(*tpl_cur_);
31 auto operator++(
int) {
33 base_cur_ += rng::size(*tpl_cur_);
37 auto operator*()
const {
39 dr::ranges::rank(*tpl_cur_));
45 SegTplSentinel tpl_end_;
58template <rng::random_access_range R, rng::common_range SegTpl>
59class segmented_view :
public rng::view_interface<segmented_view<R, SegTpl>> {
61 template <
typename V1,
typename V2>
63 : base_(rng::views::all(std::forward<V1>(r))),
64 segments_tpl_(rng::views::all(std::forward<V2>(tpl))) {}
68 rng::end(segments_tpl_));
72 rng::end(segments_tpl_));
75 auto size()
const {
return rng::size(segments_tpl_); }
78 rng::views::all_t<R> base_;
79 rng::views::all_t<SegTpl> segments_tpl_;
82template <
typename R,
typename Seg>
89template <
typename R,
typename Seg>
auto segmented(R &&r, Seg &&seg) {
Definition: segmented.hpp:12
Definition: segmented.hpp:59
Definition: remote_subrange.hpp:15