di 0.1.0
Loading...
Searching...
No Matches
iterator_base.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/core.h"
9#include "di/types/prelude.h"
10#include "di/util/declval.h"
11
12namespace di::container {
13template<typename Self, typename Category, typename ValueType, typename SSizeType>
15private:
16 constexpr auto self() -> Self& { return static_cast<Self&>(*this); }
17 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
18
19public:
20 IteratorBase() = default;
21 IteratorBase(IteratorBase const&) = default;
23
24 auto operator=(IteratorBase const&) -> IteratorBase& = default;
25 auto operator=(IteratorBase&&) -> IteratorBase& = default;
26
29 = delete;
32 = delete;
33
34 constexpr auto operator++() -> Self& {
35 self().advance_one();
36 return self();
37 }
38 constexpr void operator++(int) { self().advance_one(); }
39
40 constexpr auto operator++(int) -> Self
42 {
43 auto temp = self();
44 self().advance_one();
45 return temp;
46 }
47
48 constexpr auto operator--() -> Self&
50 {
51 self().back_one();
52 return self();
53 }
54
55 constexpr auto operator--(int) -> Self
57 {
58 auto temp = self();
59 self().back_one();
60 return temp;
61 }
62
63 constexpr auto operator[](SSizeType n) const -> decltype(auto)
65 {
66 auto copy = self();
67 copy.advance_n(n);
68 return *copy;
69 }
70
71 constexpr auto operator+=(SSizeType n) -> Self&
73 {
74 self().advance_n(n);
75 return self();
76 }
77
78 constexpr auto operator-=(SSizeType n) -> Self&
80 {
81 self().advance_n(-n);
82 return self();
83 }
84
85private:
86 constexpr friend auto operator+(Self const& self, SSizeType n) -> Self
88 {
89 auto temp = self;
90 temp.advance_n(n);
91 return temp;
92 }
93
94 constexpr friend auto operator+(SSizeType n, Self const& self) -> Self
96 {
97 auto temp = self;
98 temp.advance_n(n);
99 return temp;
100 }
101
102 constexpr friend auto operator-(Self const& self, SSizeType n) -> Self
104 {
105 auto temp = self;
106 temp.advance_n(-n);
107 return temp;
108 }
109
119};
120}
Definition operations.h:114
Definition core.h:114
Definition sequence.h:12
constexpr auto copy
Definition copy.h:30
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto in_place_type
Definition in_place_type.h:12
friend auto tag_invoke(types::Tag< iterator_category >, InPlaceType< Self >) -> Category
Definition iterator_base.h:116
auto operator=(IteratorBase const &) -> IteratorBase &requires(concepts::SameAs< Category, InputIteratorTag >)=delete
constexpr auto operator-=(SSizeType n) -> Self &requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:78
constexpr auto operator--(int) -> Self requires(concepts::DerivedFrom< Category, BidirectionalIteratorTag >)
Definition iterator_base.h:55
constexpr friend auto operator+(SSizeType n, Self const &self) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:94
IteratorBase(IteratorBase const &)=delete
auto operator=(IteratorBase const &) -> IteratorBase &=default
constexpr auto operator[](SSizeType n) const -> decltype(auto) requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:63
constexpr auto operator--() -> Self &requires(concepts::DerivedFrom< Category, BidirectionalIteratorTag >)
Definition iterator_base.h:48
constexpr void operator++(int)
Definition iterator_base.h:38
friend auto tag_invoke(types::Tag< iterator_value >, InPlaceType< Self >) -> InPlaceType< ValueType >
Definition iterator_base.h:113
IteratorBase(IteratorBase const &)=default
constexpr friend auto operator-(Self const &self, SSizeType n) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:102
constexpr auto operator+=(SSizeType n) -> Self &requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:71
friend auto tag_invoke(types::Tag< iterator_ssize_type >, InPlaceType< Self >) -> SSizeType
Definition iterator_base.h:110
constexpr auto operator++() -> Self &
Definition iterator_base.h:34
IteratorBase(IteratorBase &&)=default
auto operator=(IteratorBase &&) -> IteratorBase &=default
constexpr auto operator++(int) -> Self requires(concepts::DerivedFrom< Category, ForwardIteratorTag >)
Definition iterator_base.h:40
constexpr friend auto operator+(Self const &self, SSizeType n) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:86
Definition in_place_type.h:5