acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
list_iterator.h
1// With iterator.h as base by camilo on 2022-09-12 04:02 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5//#include "_iterator.h"
6//
90 //auto & operator = (const THIS_ITERATOR & iterator) { m_p = iterator.m_p; return *this; }
107//
108//
115
116
117template < typename BASE_ITERATOR_TYPE >
118class list_iterator_node :
119 public BASE_ITERATOR_TYPE
120{
121public:
122
123
124 using iterator = ::list_iterator_node < typename BASE_ITERATOR_TYPE::iterator >;
125 using const_iterator = ::list_iterator_node < typename BASE_ITERATOR_TYPE::const_iterator >;
126 using this_iterator = ::list_iterator_node < BASE_ITERATOR_TYPE >;
127
128
129 using ITEM = typename BASE_ITERATOR_TYPE::ITEM;
130 using node = BASE_ITERATOR_TYPE;
131
132
133 using ITEM_POINTER = typename BASE_ITERATOR_TYPE::ITEM_POINTER;
134 using CONST_ITEM_POINTER = typename BASE_ITERATOR_TYPE::CONST_ITEM_POINTER;
135 using THIS_ITEM_POINTER = typename BASE_ITERATOR_TYPE::THIS_ITEM_POINTER;
136
137
138 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
139
140
141 list_iterator_node(CONST_ITEM_POINTER p) : BASE_ITERATOR_TYPE(p) {}
142 list_iterator_node(const iterator & iterator) : BASE_ITERATOR_TYPE((const BASE_ITERATOR_TYPE &)iterator) {}
143 list_iterator_node(const const_iterator & iterator) : BASE_ITERATOR_TYPE((const BASE_ITERATOR_TYPE&)iterator) {}
144
145
146 auto & topic() { return BASE_ITERATOR_TYPE::topic(); }
147 auto & topic() const { return BASE_ITERATOR_TYPE::topic(); }
148
149 auto & item() { return BASE_ITERATOR_TYPE::item(); }
150 auto & item() const { return BASE_ITERATOR_TYPE::item(); }
151
152 auto transfer_topic() { return ::transfer(BASE_ITERATOR_TYPE::transfer_topic()); }
153
154 auto transfer() { return ::transfer(*this); }
155
156
157};
158
159
160template < typename BASE_ITERATOR_TYPE >
161class list_iterator_element1 :
162 public BASE_ITERATOR_TYPE
163{
164public:
165
166
167 using iterator = ::list_iterator_element1 < typename BASE_ITERATOR_TYPE::iterator >;
168 using const_iterator = ::list_iterator_element1 < typename BASE_ITERATOR_TYPE::const_iterator >;
169 using THIS_ITERATOR = ::list_iterator_element1 < typename BASE_ITERATOR_TYPE::THIS_ITERATOR >;
170
171
172 using ITEM = typename BASE_ITERATOR_TYPE::ITEM::ELEMENT1;
173 using node = ITEM;
174
175
176 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
177
178
179 list_iterator_element1(const iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
180 list_iterator_element1(const const_iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
181
182
183 auto & topic() { return this->m_p->key(); }
184 auto & topic() const { return this->m_p->key(); }
185
186 auto & item() { return this->m_p->key(); }
187 auto & item() const { return this->m_p->key(); }
188
189 auto transfer_topic() { return ::transfer(this->m_p->transfer_item()); }
190
191
192};
193
194
195template < typename BASE_ITERATOR_TYPE >
196class list_iterator_element2 :
197 public BASE_ITERATOR_TYPE
198{
199public:
200
201
202
203 using iterator = ::list_iterator_element2 < typename BASE_ITERATOR_TYPE::iterator >;
204 using const_iterator = ::list_iterator_element2 < typename BASE_ITERATOR_TYPE::const_iterator >;
205 using THIS_ITERATOR = ::list_iterator_element2 < typename BASE_ITERATOR_TYPE::THIS_ITERATOR >;
206
207
208 using ITEM = typename BASE_ITERATOR_TYPE::ITEM::ELEMENT2;
209 using node = ITEM;
210
211
212 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
213
214
215 list_iterator_element2(const iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
216 list_iterator_element2(const const_iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
217
218
219 auto & topic() { return this->m_p->payload(); }
220 auto & topic() const { return this->m_p->payload(); }
221
222 auto & item() { return this->m_p->payload(); }
223 auto & item() const { return this->m_p->payload(); }
224
225 auto transfer_topic() { return ::transfer(this->m_p->transfer_payload()); }
226
227};
228
229
230template < typename BASE_ITERATOR_TYPE >
231class make_list_iterator :
232 public BASE_ITERATOR_TYPE
233{
234public:
235
236
237 using ITERATOR_TYPE = BASE_ITERATOR_TYPE;
238
239
240 using ITEM_POINTER = typename ITERATOR_TYPE::ITEM_POINTER;
241 using CONST_ITEM_POINTER = typename ITERATOR_TYPE::CONST_ITEM_POINTER;
242 using LIST_ITEM_POINTER = typename ITERATOR_TYPE::ITEM_POINTER;
243
244
245 using BASE_ITERATOR = typename BASE_ITERATOR_TYPE::iterator;
246 using BASE_CONST_ITERATOR = typename BASE_ITERATOR_TYPE::const_iterator;
247 using BASE_THIS_ITERATOR = typename BASE_ITERATOR_TYPE::THIS_ITERATOR;
248
249
250 using iterator = ::make_list_iterator < typename BASE_ITERATOR_TYPE::iterator >;
251 using const_iterator = ::make_list_iterator < typename BASE_ITERATOR_TYPE::const_iterator >;
252 using THIS_ITERATOR = ::make_list_iterator < BASE_ITERATOR_TYPE >;
253
254
255 using node = typename BASE_ITERATOR_TYPE::node;
256 using const_node = const node;
257
258
259 using ITEM = typename BASE_ITERATOR_TYPE::ITEM;
260 using CONST_ITEM = const ITEM;
261
262
263 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
264
265
266 make_list_iterator(CONST_ITEM_POINTER itempointer) : BASE_ITERATOR_TYPE(itempointer) {}
267 make_list_iterator(const iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
268 make_list_iterator(const const_iterator & iterator) : BASE_ITERATOR_TYPE(*(BASE_ITERATOR_TYPE *)&iterator) {}
269
270
271 constexpr ::collection::index index() const
272 {
273
274 ::collection::index i = -1;
275
276 auto iterator = *this;
277
278 while (iterator.is_set())
279 {
280
281 i++;
282
283 iterator--;
284
285 }
286
287 return i;
288
289 }
290
291
292 static constexpr bool difference(::collection::count & c, const_iterator a, const_iterator b)
293 {
294
295 c = 0;
296
297 while (::is_set(b) && b != a)
298 {
299
300 c++;
301
302 b++;
303
304 }
305
306 return b.is_set();
307
308 }
309
310
311 template < prototype_integral INTEGRAL >
312 THIS_ITERATOR & operator += (INTEGRAL c)
313 {
314
315 while (c-- > 0)
316 {
317
318 ++ * this;
319
320 }
321
322
323 return *this;
324
325 }
326
327
328 template < prototype_integral INTEGRAL >
329 constexpr THIS_ITERATOR operator + (INTEGRAL c) const
330 {
331
332 auto iterator = *this;
333
334 iterator += c;
335
336 return iterator;
337
338 }
339
340
341 template < prototype_integral INTEGRAL >
342 THIS_ITERATOR & operator -= (INTEGRAL c)
343 {
344
345 while (c-- > 0)
346 {
347
348 --*this;
349
350 }
351
352 return *this;
353
354 }
355
356
357 template < prototype_integral INTEGRAL >
358 constexpr THIS_ITERATOR operator - (INTEGRAL c) const
359 {
360
361 auto iterator = *this;
362
363 iterator += c;
364
365 return iterator;
366
367 }
368
369
370 constexpr ::collection::count operator - (THIS_ITERATOR iterator) const
371 {
372
373 {
374
375 auto i = *this;
376
377 ::collection::count c = 0;
378
379 while (i.is_set())
380 {
381
382 if (i == iterator)
383 {
384
385 return c;
386
387 }
388
389 i--;
390
391 c++;
392
393 }
394
395 }
396
397 {
398
399 auto i = iterator;
400
401 ::collection::count c = 0;
402
403 while (i.is_set())
404 {
405
406 if (i == *this)
407 {
408
409 return -c;
410
411 }
412
413 i--;
414
415 c++;
416
417 }
418
419 }
420
421 throw "iterator is not part of list_base";
422
423 }
424
425
426 THIS_ITERATOR & operator =(ITEM_POINTER p) { this->m_p = p; return *this; }
427 THIS_ITERATOR & operator =(const iterator & iterator) { this->m_p = (ITEM_POINTER) iterator.get(); return *this;}
428 THIS_ITERATOR & operator =(const const_iterator & iterator) { this->m_p = (ITEM_POINTER) iterator.get(); return *this; }
429 THIS_ITERATOR & operator =(nullptr_t) { this->m_p = nullptr; return *this; }
430
431
432 template < typename ITERATOR >
433 constexpr bool operator == (ITERATOR iterator) const
434 {
435
436 return this->get() == iterator.get();
437
438 }
439
440
441 constexpr std::strong_ordering operator <=> (const THIS_ITERATOR & iterator) const
442 {
443
444 return this->index() <=> iterator.index();
445
446 }
447
448
449 THIS_ITERATOR & operator ++()
450 {
451
452 *this = this->next();
453
454 return *this;
455
456 }
457
458
459 THIS_ITERATOR operator ++(::i32)
460 {
461
462 auto iterator = *this;
463
464 ++ * this;
465
466 return iterator;
467
468 }
469
470
471 THIS_ITERATOR & operator --()
472 {
473
474 *this = this->back();
475
476 return *this;
477
478 }
479
480
481 THIS_ITERATOR operator --(::i32)
482 {
483
484 auto iterator = *this;
485
486 -- * this;
487
488 return iterator;
489
490 }
491
492 constexpr bool is_set() const { return ::is_set(this) && ::is_set(this->get()); }
493 constexpr bool is_null() const { return !is_set(); }
494 constexpr bool is_ok() const { return is_set(); }
495 constexpr bool operator !() const { return this->is_null(); }
496 //https://www.artima.com/articles/the-safe-bool-idiom BEGIN
497 typedef void (const_iterator:: * bool_type)() const;
498 constexpr void this_type_does_not_support_comparisons() const {}
499 constexpr operator bool_type() const { return this->is_set() ? &const_iterator::this_type_does_not_support_comparisons : 0; }
500 //https://www.artima.com/articles/the-safe-bool-idiom END
501
502
503
504 auto & operator *() { return this->item(); }
505 auto & operator *() const { return this->item(); }
506
507
508 auto operator ->() { return &this->item(); }
509 auto operator ->() const { return &this->item(); }
510
511
512 auto & back() { return this->get()->back(); }
513 auto & back() const { return this->get()->back(); }
514
515 auto & next() { return this->get()->next(); }
516 auto & next() const { return this->get()->next(); }
517
518
519};
520
521
522template < typename ITERATOR_TYPE >
523::collection::index index_as_of_iterator(::make_list_iterator < ITERATOR_TYPE > iterator)
524{
525
526 return iterator.index();
527
528}
529
530
531template < typename BASE_ITERATOR_TYPE >
532inline auto & get(make_list_iterator<BASE_ITERATOR_TYPE> & p)
533{
534
535 return p.topic();
536
537}
538
539
540template < typename BASE_ITERATOR_TYPE >
541inline auto & get(const make_list_iterator<BASE_ITERATOR_TYPE> & p)
542{
543
544 return p.topic();
545
546}
547//template < typename LIST_ITEM >
548//using list_iterator = ::make_list_iterator < ::list_iterator_item < ::iterator_base < LIST_ITEM > > >;
549
550//template < typename LIST_ITEM >
551//using const_list_iterator = ::make_list_iterator < ::list_iterator_item < ::const_iterator_base < LIST_ITEM > > >;
552
553
554template < typename LIST_ITEM >
555using list_iterator = ::make_list_iterator < ::list_iterator_node < ::iterator_base < LIST_ITEM > > >;
556
557template < typename LIST_ITEM >
558using const_list_iterator = ::make_list_iterator < ::list_iterator_node < ::const_iterator_base < LIST_ITEM > > >;
559
560
561
562template < typename LIST_ITEM >
563using element1_list_iterator = ::make_list_iterator < ::list_iterator_element1 < ::iterator_base < LIST_ITEM > > >;
564
565template < typename LIST_ITEM >
566using const_element1_list_iterator = ::make_list_iterator < ::list_iterator_element1 < ::const_iterator_base < LIST_ITEM > > >;
567
568
569
570template < typename LIST_ITEM >
571using element2_list_iterator = ::make_list_iterator < ::list_iterator_element2 < ::iterator_base < LIST_ITEM > > >;
572
573template < typename LIST_ITEM >
574using const_element2_list_iterator = ::make_list_iterator < ::list_iterator_element2 < ::const_iterator_base < LIST_ITEM > > >;
575
576
577
Definition item.h:93
Definition list_iterator.h:233
Definition _initial_concepts.h:851
Definition std_iterator.h:49