CkPttn 1.2.4
Loading...
Searching...
No Matches
transranger_view.hpp
Go to the documentation of this file.
1
13#ifndef JOAQUINTIDES_TRANSRANGER_VIEW_HPP
14#define JOAQUINTIDES_TRANSRANGER_VIEW_HPP
15
16#if defined(_MSC_VER)
17# pragma once
18#endif
19
20#include <range/v3/range_fwd.hpp>
21#include <range/v3/utility/semiregular_box.hpp>
22#include <type_traits>
23#include <utility>
24
25namespace transrangers {
26
27 /* Ranger -> Range-v3 view adaptors */
28
29 namespace detail::view {
30
31 struct sentinel {};
32
33 template <typename Iterator, typename Ranger> class iterator_base {
34 public:
35 using value_type = std::remove_cv_t<
36 std::remove_reference_t<decltype(*std::declval<typename Ranger::cursor>())>>;
37 using difference_type = std::ptrdiff_t;
38
39 iterator_base() = default;
40 iterator_base(const Ranger& rgr) : rgr{rgr} {} /* invalid till first ++ */
41 iterator_base(const iterator_base&) = default;
42
44 /* Direct assignment fails to compile sometimes (e.g. when
45 * ranges::views::unique is part of the chain), no idea why.
46 */
47 this->rgr = x.rgr.get();
48
49 this->end = x.end;
50 this->p = x.p;
51 return *this;
52 }
53
54 decltype(auto) operator*() const { return *p; }
55 Iterator& operator++() {
56 final().advance();
57 return final();
58 }
59 Iterator operator++(int) {
60 auto x = final();
61 final().advance();
62 return x;
63 }
64
65 friend bool operator==(const iterator_base& x, const sentinel&) { return x.end; }
66 friend bool operator!=(const iterator_base& x, const sentinel& y) { return !(x == y); }
67
68 protected:
69 ranges::semiregular_box<Ranger> rgr;
70 bool end;
71 typename Ranger::cursor p;
72
73 private:
74 Iterator& final() { return static_cast<Iterator&>(*this); }
75 };
76
77 template <typename Ranger> class input_iterator
78 : public iterator_base<input_iterator<Ranger>, Ranger> {
80
81 public:
82 using super::super;
83
84 private:
85 friend super;
86
87 void advance() {
88 this->end = this->rgr([&](auto q) {
89 this->p = q;
90 return false;
91 });
92 }
93 };
94
95 template <typename Ranger> class forward_iterator
96 : public iterator_base<forward_iterator<Ranger>, Ranger> {
98
99 public:
100 using super::super;
101
102 friend bool operator==(const forward_iterator& x, const forward_iterator& y) {
103 return x.n == y.n;
104 }
105 friend bool operator!=(const forward_iterator& x, const forward_iterator& y) {
106 return !(x == y);
107 }
108
109 private:
110 friend super;
111
112 void advance() {
113 this->end = this->rgr([&](auto q) {
114 this->p = q;
115 ++n;
116 return false;
117 });
118 }
119
120 std::size_t n = 0;
121 };
122
123 template <typename Ranger, typename Iterator> class view : public ranges::view_base {
124 public:
125 view() = default;
126 view(Ranger rgr) : rgr{std::move(rgr)} {}
127
128 auto begin() { return ++Iterator{rgr}; } /* note ++ */
129 auto end() { return sentinel{}; }
130
131 private:
132 ranges::semiregular_box<Ranger> rgr;
133 };
134
135 } // namespace detail::view
136
146 template <typename Ranger> auto input_view(Ranger rgr) {
147 using namespace detail::view;
148 return view<Ranger, input_iterator<Ranger>>{std::move(rgr)};
149 }
150
161 template <typename Ranger> auto forward_view(Ranger rgr) {
162 using namespace detail::view;
163 return view<Ranger, forward_iterator<Ranger>>{std::move(rgr)};
164 }
165
166} // namespace transrangers
167
168#endif
Definition transranger_view.hpp:96
friend bool operator==(const forward_iterator &x, const forward_iterator &y)
Definition transranger_view.hpp:102
friend bool operator!=(const forward_iterator &x, const forward_iterator &y)
Definition transranger_view.hpp:105
Definition transranger_view.hpp:78
Definition transranger_view.hpp:33
std::remove_cv_t< std::remove_reference_t< decltype(*std::declval< typename Ranger::cursor >())> > value_type
Definition transranger_view.hpp:36
std::ptrdiff_t difference_type
Definition transranger_view.hpp:37
friend bool operator==(const iterator_base &x, const sentinel &)
Definition transranger_view.hpp:65
friend bool operator!=(const iterator_base &x, const sentinel &y)
Definition transranger_view.hpp:66
Iterator & operator++()
Definition transranger_view.hpp:55
Ranger::cursor p
Definition transranger_view.hpp:71
iterator_base & operator=(const iterator_base &x)
Definition transranger_view.hpp:43
ranges::semiregular_box< Ranger > rgr
Definition transranger_view.hpp:69
iterator_base(const Ranger &rgr)
Definition transranger_view.hpp:40
bool end
Definition transranger_view.hpp:70
iterator_base(const iterator_base &)=default
Iterator operator++(int)
Definition transranger_view.hpp:59
Definition transranger_view.hpp:123
auto end()
Definition transranger_view.hpp:129
view(Ranger rgr)
Definition transranger_view.hpp:126
auto begin()
Definition transranger_view.hpp:128
Definition transranger_view.hpp:25
auto forward_view(Ranger rgr)
Create a forward view from a ranger.
Definition transranger_view.hpp:161
auto input_view(Ranger rgr)
Create an input view from a ranger.
Definition transranger_view.hpp:146
Definition transranger_view.hpp:31