Iros
 
Loading...
Searching...
No Matches
const_iterator_impl.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/common.h"
11#include "di/meta/compare.h"
12#include "di/util/move.h"
13#include "di/util/to_address.h"
14
15namespace di::container {
16template<typename Iter>
18 : public IteratorBase<ConstIteratorImpl<Iter>, meta::IteratorCategory<Iter>, meta::IteratorValue<Iter>,
19 meta::IteratorSSizeType<Iter>> {
20private:
21 using Self = ConstIteratorImpl;
22 using SSizeType = meta::IteratorSSizeType<Iter>;
23 using Value = meta::IteratorValue<Iter>;
24
25public:
28 = default;
29 constexpr ConstIteratorImpl(Iter iter) : m_base(util::move(iter)) {}
30
31 template<concepts::ConvertibleTo<Iter> Jt>
32 constexpr ConstIteratorImpl(ConstIteratorImpl<Jt> other) : m_base(util::move(other.base())) {}
33
34 template<concepts::ConvertibleTo<Iter> T>
35 constexpr ConstIteratorImpl(T&& other) : m_base(util::forward<T>(other)) {}
36
37 constexpr auto base() const& -> Iter const& { return m_base; }
38 constexpr auto base() && -> Iter { return util::move(m_base); }
39
40 constexpr auto operator*() const -> meta::IteratorConstReference<Iter> { return *m_base; }
41
42 constexpr auto operator->() const
43 -> Value const* requires(concepts::ContiguousIterator<Iter>) { return util::to_address(m_base); }
44
45 constexpr void advance_one() {
46 ++m_base;
47 }
48 constexpr void back_one()
50 {
51 --m_base;
52 }
53
54 constexpr void advance_n(SSizeType n)
56 {
57 m_base += n;
58 }
59
60private:
61 constexpr friend auto operator==(Self const& a, Self const& b) -> bool
63 {
64 return a.base() == b.base();
65 }
66
67 template<typename Sent>
69 constexpr friend auto operator==(Self const& a, Sent const& b) -> bool {
70 return a.base() == b;
71 }
72
73 constexpr friend auto operator<=>(Self const& a, Self const& b)
75 {
76 return a.base() <=> b.base();
77 }
78
79 template<typename Other>
82 constexpr friend auto operator<=>(Self const& a, Other const& b) {
83 return a.base() <=> b;
84 }
85
86 constexpr friend auto operator-(Self const& a, Self const& b) -> SSizeType
88 {
89 return a.base() - b.base();
90 }
91
92 template<typename Sent>
94 constexpr auto operator-(Sent const& b) -> SSizeType {
95 return this->base() - b;
96 }
97
98 template<typename Sent>
100 constexpr friend auto operator-(Sent const& a, Self const& b) -> SSizeType {
101 return a - b.base();
102 }
103
104 Iter m_base;
105};
106}
107
108template<typename T, di::concepts::CommonWith<T> U>
112
113template<typename T, di::concepts::CommonWith<T> U>
117
118template<typename T, di::concepts::CommonWith<T> U>
Definition const_iterator_impl.h:19
constexpr friend auto operator-(Self const &a, Self const &b) -> SSizeType requires(concepts::RandomAccessIterator< Iter >)
Definition const_iterator_impl.h:86
constexpr auto base() const &-> Iter const &
Definition const_iterator_impl.h:37
constexpr void advance_n(SSizeType n)
Definition const_iterator_impl.h:54
constexpr ConstIteratorImpl(Iter iter)
Definition const_iterator_impl.h:29
constexpr void back_one()
Definition const_iterator_impl.h:48
constexpr friend auto operator<=>(Self const &a, Self const &b)
Definition const_iterator_impl.h:73
constexpr void advance_one()
Definition const_iterator_impl.h:45
constexpr auto operator->() const -> Value const *requires(concepts::ContiguousIterator< Iter >)
Definition const_iterator_impl.h:42
constexpr friend auto operator==(Self const &a, Self const &b) -> bool requires(concepts::SentinelFor< Iter, Iter >)
Definition const_iterator_impl.h:61
constexpr auto base() &&-> Iter
Definition const_iterator_impl.h:38
constexpr auto operator*() const -> meta::IteratorConstReference< Iter >
Definition const_iterator_impl.h:40
constexpr ConstIteratorImpl(ConstIteratorImpl< Jt > other)
Definition const_iterator_impl.h:32
constexpr ConstIteratorImpl(T &&other)
Definition const_iterator_impl.h:35
Definition bidirectional_iterator.h:8
Definition operations.h:27
Definition random_access_iterator.h:12
Definition core.h:114
Definition sentinel_for.h:9
Definition sized_sentinel_for.h:9
Definition compare.h:106
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto move
Definition move.h:38
Definition merge_interfaces.h:6
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
meta::Type< decltype(container::iterator_value(types::in_place_type< meta::RemoveCVRef< T > >))> IteratorValue
Definition iterator_value.h:8
Definition vocab.h:96
constexpr auto to_address
Definition to_address.h:22
Definition zstring_parser.h:9
Definition common.h:13
di::container::ConstIteratorImpl< di::meta::CommonType< T, U > > Type
Definition const_iterator_impl.h:120
di::container::ConstIteratorImpl< di::meta::CommonType< T, U > > Type
Definition const_iterator_impl.h:115
di::container::ConstIteratorImpl< di::meta::CommonType< T, U > > Type
Definition const_iterator_impl.h:110