Iros
 
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
33 constexpr auto operator++() -> Self& {
34 self().advance_one();
35 return self();
36 }
37 constexpr void operator++(int) { self().advance_one(); }
38
39 constexpr auto operator++(int) -> Self
41 {
42 auto temp = self();
43 self().advance_one();
44 return temp;
45 }
46
48 self().back_one();
49 return self();
50 }
51
52 constexpr auto operator--(int) -> Self
54 {
55 auto temp = self();
56 self().back_one();
57 return temp;
58 }
59
60 constexpr auto operator[](SSizeType n) const -> decltype(auto)
62 {
63 auto copy = self();
64 copy.advance_n(n);
65 return *copy;
66 }
67
68constexpr auto operator+=(SSizeType n) -> Self& requires(concepts::DerivedFrom<Category, RandomAccessIteratorTag>) {
69 self().advance_n(n);
70 return self();
71}
72
73constexpr auto operator-=(SSizeType n) -> Self& requires(concepts::DerivedFrom<Category, RandomAccessIteratorTag>) {
74 self().advance_n(-n);
75 return self();
76}
77
78private
79 : constexpr friend auto operator+(Self const& self, SSizeType n) -> Self
81{
82 auto temp = self;
83 temp.advance_n(n);
84 return temp;
85 }
86
87 constexpr friend auto operator+(SSizeType n, Self const& self) -> Self
89 {
90 auto temp = self;
91 temp.advance_n(n);
92 return temp;
93 }
94
95 constexpr friend auto operator-(Self const& self, SSizeType n) -> Self
97 {
98 auto temp = self;
99 temp.advance_n(-n);
100 return temp;
101 }
102
112};
113}
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:109
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:73
constexpr auto operator--(int) -> Self requires(concepts::DerivedFrom< Category, BidirectionalIteratorTag >)
Definition iterator_base.h:52
constexpr friend auto operator+(SSizeType n, Self const &self) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:87
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:60
constexpr auto operator--() -> Self &requires(concepts::DerivedFrom< Category, BidirectionalIteratorTag >)
Definition iterator_base.h:47
constexpr void operator++(int)
Definition iterator_base.h:37
friend auto tag_invoke(types::Tag< iterator_value >, InPlaceType< Self >) -> InPlaceType< ValueType >
Definition iterator_base.h:106
IteratorBase(IteratorBase const &)=default
constexpr friend auto operator-(Self const &self, SSizeType n) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:95
constexpr auto operator+=(SSizeType n) -> Self &requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:68
friend auto tag_invoke(types::Tag< iterator_ssize_type >, InPlaceType< Self >) -> SSizeType
Definition iterator_base.h:103
constexpr auto operator++() -> Self &
Definition iterator_base.h:33
IteratorBase(IteratorBase &&)=default
auto operator=(IteratorBase &&) -> IteratorBase &=default
constexpr auto operator++(int) -> Self requires(concepts::DerivedFrom< Category, ForwardIteratorTag >)
Definition iterator_base.h:39
constexpr friend auto operator+(Self const &self, SSizeType n) -> Self requires(concepts::DerivedFrom< Category, RandomAccessIteratorTag >)
Definition iterator_base.h:79
Definition in_place_type.h:5