acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
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
8
template
<
typename
TYPE >
9
::collection::index index_as_of_iterator(
const
TYPE * p)
10
{
11
12
return
(::iptr)p;
13
14
}
15
16
17
template
<
typename
TYPE >
18
TYPE * next_as_of_iterator(
const
TYPE * p)
19
{
20
21
return
p + 1;
22
23
}
24
25
26
template
<
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
36
template
<
typename
TYPE >
37
class
const_iterator_base
;
38
39
40
template
<
typename
ITERATOR_TYPE >
41
class
iterator_base :
42
public
memory_quantum
43
{
44
public
:
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
107
template
<
typename
ITERATOR_TYPE >
108
class
const_iterator_base
109
{
110
public
:
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
164
template
<
typename
ITERATOR_TYPE >
165
constexpr
bool
is_ok(iterator_base < ITERATOR_TYPE > p) { return ::is_set(p.get()); }
166
template
<
typename
ITERATOR_TYPE >
167
constexpr
bool
is_ok(const_iterator_base < ITERATOR_TYPE > p) { return ::is_set(p.get()); }
168
template
<
typename
ITERATOR_TYPE >
169
constexpr
bool
is_end(iterator_base < ITERATOR_TYPE > p) {
return
!is_ok(p); }
170
template
<
typename
ITERATOR_TYPE >
171
constexpr
bool
is_end(const_iterator_base < ITERATOR_TYPE > p) {
return
!is_ok(p); }
172
173
174
template
<
typename
TYPE >
175
constexpr
bool
is_ok(TYPE* p, TYPE * end) { return ::is_set(p) && p < end; }
176
template
<
typename
TYPE >
177
constexpr
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
208
template
< prototype_iterator ITERATOR >
209
constexpr
bool
is_set(
const
ITERATOR &
iterator
)
210
{
211
212
return ::is_set(
iterator
.m_p);
213
214
}
215
216
217
const_iterator_base
Definition
iterator.h:109
ITERATOR_TYPE_TAG
Definition
_initial_concepts.h:390
iterator
Definition
std_iterator.h:49
no_initialize_t
Definition
_tags.h:5
prototype
collection
iterator.h
Generated by
1.17.0