Iros
 
Loading...
Searching...
No Matches
iterator_extension.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/compare.h"
8#include "di/util/move.h"
9
10namespace di::container {
11template<typename Self, concepts::Iterator Iter, typename Value>
13 : public IteratorBase<
14 Self,
15 meta::Conditional<concepts::RandomAccessIterator<Iter>, RandomAccessIteratorTag,
16 meta::Conditional<concepts::BidirectionalIterator<Iter>, BidirectionalIteratorTag,
17 meta::Conditional<concepts::ForwardIterator<Iter>, ForwardIteratorTag,
18 InputIteratorTag>>>,
19 Value, meta::IteratorSSizeType<Iter>> {
20private:
21 using SSizeType = meta::IteratorSSizeType<Iter>;
22
23public:
26 = default;
27
28 constexpr explicit IteratorExtension(Iter base) : m_base(util::move(base)) {}
29
30 constexpr auto base() const& -> Iter const& { return m_base; }
31 constexpr auto base() && -> Iter { return util::move(m_base); }
32
33 constexpr void advance_one() { ++m_base; }
34
35 constexpr void back_one()
37 {
38 --m_base;
39 }
40
41 constexpr void advance_n(SSizeType n)
43 {
44 m_base += n;
45 }
46
47private:
48 constexpr friend auto operator-(Self const& a, Self const& b) -> SSizeType
50 {
51 return a.base() - b.base();
52 }
53
54 constexpr friend auto operator==(Self const& a, Self const& b) -> bool
56 {
57 return a.base() == b.base();
58 }
59
60 constexpr friend auto operator<=>(Self const& a, Self const& b)
62 {
63 return a.base() <=> b.base();
64 }
65
66 Iter m_base;
67};
68}
constexpr friend auto operator-(Self const &a, Self const &b) -> SSizeType requires(concepts::RandomAccessIterator< Iter >)
Definition iterator_extension.h:48
constexpr auto base() const &-> Iter const &
Definition iterator_extension.h:30
constexpr friend auto operator<=>(Self const &a, Self const &b)
Definition iterator_extension.h:60
constexpr auto base() &&-> Iter
Definition iterator_extension.h:31
constexpr IteratorExtension(Iter base)
Definition iterator_extension.h:28
constexpr void advance_one()
Definition iterator_extension.h:33
constexpr void back_one()
Definition iterator_extension.h:35
constexpr void advance_n(SSizeType n)
Definition iterator_extension.h:41
constexpr friend auto operator==(Self const &a, Self const &b) -> bool requires(concepts::EqualityComparable< Iter >)
Definition iterator_extension.h:54
Definition bidirectional_iterator.h:8
Definition operations.h:27
Definition compare.h:82
Definition random_access_iterator.h:12
Definition compare.h:91
Definition sequence.h:12
constexpr auto move
Definition move.h:38
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
Definition vocab.h:96