acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
iterator.h
1// Created by camilo on 2022-12-07 16:42 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5#include "acme/memory/quantum.h"
6
7
8template < typename TYPE >
9::collection::index index_as_of_iterator(const TYPE * p)
10{
11
12 return (::iptr)p;
13
14}
15
16
17template < typename TYPE >
18TYPE * next_as_of_iterator(const TYPE * p)
19{
20
21 return p + 1;
22
23}
24
25
26template < typename TYPE >
27::collection::count count_as_of_iterator(const TYPE * p, const TYPE * pBegin)
28{
29
30 return ::index_as_of_iterator(p) - ::index_as_of_iterator(pBegin);
31
32}
33
34
35
36template < typename TYPE >
38
39
40template < typename ITERATOR_TYPE >
41class iterator_base :
42 public memory_quantum
43{
44public:
45
46
47 using TYPE_TAG = ITERATOR_TYPE_TAG;
48
49
50 using ITEM_POINTER = non_const < ITERATOR_TYPE >;
51 using CONST_ITEM_POINTER = const_of < ITERATOR_TYPE >;
52 using THIS_ITEM_POINTER = ITERATOR_TYPE;
53
54
55 using ITEM = dereference < ITEM_POINTER >;
56
57
58 using TYPE = ITERATOR_TYPE;
59
60
61 using iterator = ::iterator_base < ITEM_POINTER >;
62 using const_iterator = ::const_iterator_base < ITEM_POINTER >;
63 using THIS_ITERATOR = ::iterator_base < ITERATOR_TYPE >;
64
65
66 ITEM_POINTER m_p;
67
68
69 iterator_base(no_initialize_t) {}
70 iterator_base(nullptr_t) { m_p = nullptr; }
71 iterator_base() { m_p = nullptr; }
72 iterator_base(CONST_ITEM_POINTER p) : m_p((THIS_ITEM_POINTER)p) {}
73 iterator_base(const const_iterator & iterator) : m_p((ITEM_POINTER)iterator.get()) {}
74
75
76 auto & get() { return m_p; }
77 auto & get() const { return m_p; }
78
79
80 auto & topic() { return this->m_p->topic(); }
81 auto & topic() const { return this->m_p->topic(); }
82
83 auto & item() { return this->m_p->item(); }
84 auto & item() const { return this->m_p->item(); }
85
86 auto & operator= (TYPE * p) { m_p = p; return *this; }
87 auto & operator= (iterator p) { m_p = p.get(); return *this; }
88
89
90 auto transfer() { auto p = m_p; m_p = nullptr; return ::transfer(*p); }
91
92
93 auto transfer_topic() { return ::transfer(this->m_p->transfer_topic()); }
94
95
96 auto & operator *() { return this->item(); }
97 auto & operator *() const { return this->item(); }
98
99
100 auto operator ->() { return &this->item(); }
101 auto operator ->() const { return &this->item(); }
102
103
104};
105
106
107template < typename ITERATOR_TYPE >
108class const_iterator_base
109{
110public:
111
112
113 using TYPE_TAG = ITERATOR_TYPE_TAG;
114
115
116 using ITEM_POINTER = non_const < ITERATOR_TYPE >;
117 using CONST_ITEM_POINTER = const_of < ITERATOR_TYPE >;
118 using THIS_ITEM_POINTER = ITERATOR_TYPE;
119
120
121 using ITEM = dereference < ITEM_POINTER >;
122
123
124 using iterator = ::iterator_base < ITEM_POINTER >;
125 using const_iterator = ::const_iterator_base < ITEM_POINTER >;
126 using THIS_ITERATOR = ::const_iterator_base < ITERATOR_TYPE >;
127
128
129 CONST_ITEM_POINTER m_p;
130
131
132 const_iterator_base(no_initialize_t) {};
133 const_iterator_base(nullptr_t) { m_p = nullptr; }
134 const_iterator_base() { m_p = nullptr; }
135 const_iterator_base(CONST_ITEM_POINTER p) : m_p((THIS_ITEM_POINTER)p) {}
136 const_iterator_base(const const_iterator & iterator) : m_p(iterator.m_p) {}
137
138 auto & get() { return m_p; }
139 auto & get() const { return m_p; }
140
141
142 auto & topic() { return this->m_p->topic(); }
143 auto & topic() const { return this->m_p->topic(); }
144
145 auto & item() { return this->m_p->item(); }
146 auto & item() const { return this->m_p->item(); }
147
148 auto & operator = (const ITEM_POINTER p) { m_p = p; return *this; }
149 auto & operator = (const iterator & p) { m_p = p.get(); return *this; }
150 auto & operator = (const const_iterator & p) { m_p = p.get(); return *this; }
151
152
153 auto & operator *() { return this->item(); }
154 auto & operator *() const { return this->item(); }
155
156
157 auto operator ->() { return &this->item(); }
158 auto operator ->() const { return &this->item(); }
159
160
161};
162
163
164template < typename ITERATOR_TYPE >
165constexpr bool is_ok(iterator_base < ITERATOR_TYPE > p) { return ::is_set(p.get()); }
166template < typename ITERATOR_TYPE >
167constexpr bool is_ok(const_iterator_base < ITERATOR_TYPE > p) { return ::is_set(p.get()); }
168template < typename ITERATOR_TYPE >
169constexpr bool is_end(iterator_base < ITERATOR_TYPE > p) { return !is_ok(p); }
170template < typename ITERATOR_TYPE >
171constexpr bool is_end(const_iterator_base < ITERATOR_TYPE > p) { return !is_ok(p); }
172
173
174template < typename TYPE >
175constexpr bool is_ok(TYPE* p, TYPE * end) { return ::is_set(p) && p < end; }
176template < typename TYPE >
177constexpr bool is_end(TYPE* p, TYPE* end) { return !is_ok(p, end); }
178
179
180
181//template < typename TYPE >
182//using iterator_selector =
183// ::if_else <
184// ::is_const < TYPE >,
185// const_iterator_base < non_const < TYPE > >,
186// iterator_base < non_const < TYPE > > >;
187
188
189
190//template < typename TYPE >
191//using iterator = make_iterator < iterator_base < TYPE > >;
192//
193//
194//template < typename TYPE >
195//using const_iterator = make_iterator < const_iterator_base < TYPE > >;
196
197
198
199//template < typename ITERATOR_TYPE >
200//::collection::index iterator_offset_of(::make_iterator < ITERATOR_TYPE > a, ::make_iterator < ITERATOR_TYPE > b)
201//{
202//
203// return a - b;
204//
205//}
206
207
208template < prototype_iterator ITERATOR >
209constexpr bool is_set(const ITERATOR & iterator)
210{
211
212 return ::is_set(iterator.m_p);
213
214}
215
216
217
Definition iterator.h:109
Definition _initial_concepts.h:390
Definition std_iterator.h:49
Definition _tags.h:5