12 template<std::ranges::view V>
13 class PairwiseView :
public std::ranges::view_interface<PairwiseView<V>> {
17 explicit constexpr
PairwiseView(V base) : m_base(std::move(base)) {}
20 auto begin() {
return Iterator{std::ranges::begin(m_base), std::ranges::end(m_base)}; }
29 std::ranges::iterator_t<V>
m_end;
37 std::ranges::iterator_t<V> m_cur;
38 std::ranges::iterator_t<V> m_next;
39 std::ranges::iterator_t<V> m_end;
42 using ValueType = std::pair<decltype(*m_cur), decltype(*m_cur)>;
70 PairwiseView(R&&) -> PairwiseView<std::views::all_t<R>>;
77 template<std::ranges::viewable_range R>
79 return PairwiseView(std::views::all(std::forward<R>(r)));
83 template<std::ranges::viewable_range R>
85 return fn(std::forward<R>(r));
89 inline constexpr PairwiseFn pairwise{};
auto operator()(R &&r) const
Support for pairwise(view)
Definition: Views.h:78
ValueType operator*() const
Dereference this Iterator – obtain the pair.
Definition: Views.h:52
Support struct for PairwiseView.
Definition: Views.h:75
auto begin()
Get the beginning of the range.
Definition: Views.h:20
std::ranges::iterator_t< V > m_end
The actual end of the range.
Definition: Views.h:29
Iterator & operator++()
Pre-increment this Iterator.
Definition: Views.h:55
Mimic c++23's std::views::adjacent<2>
Definition: Views.h:13
std::pair< decltype(*m_cur), decltype(*m_cur)> ValueType
Type of the stored pair in this Iterator.
Definition: Views.h:42
Iterator(std::ranges::iterator_t< V > begin, std::ranges::iterator_t< V > end)
Construct a new Iterator.
Definition: Views.h:45
The Iterator for PairwiseView.
Definition: Views.h:35
bool operator!=(Sentinel s) const
Compare to Sentinel.
Definition: Views.h:62
friend auto operator|(R &&r, const PairwiseFn &fn)
Support for view | pairwise.
Definition: Views.h:84
constexpr PairwiseView(V base)
Construct a new PairwiseView containing base.
Definition: Views.h:17
auto end()
Get the end of the range.
Definition: Views.h:22
The Sentinel for PairwiseView's Iterator.
Definition: Views.h:27