118class list_iterator_node :
119 public BASE_ITERATOR_TYPE
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 >;
129 using ITEM =
typename BASE_ITERATOR_TYPE::ITEM;
130 using node = BASE_ITERATOR_TYPE;
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;
138 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
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) {}
146 auto & topic() {
return BASE_ITERATOR_TYPE::topic(); }
147 auto & topic()
const {
return BASE_ITERATOR_TYPE::topic(); }
149 auto & item() {
return BASE_ITERATOR_TYPE::item(); }
150 auto & item()
const {
return BASE_ITERATOR_TYPE::item(); }
152 auto transfer_topic() { return ::transfer(BASE_ITERATOR_TYPE::transfer_topic()); }
154 auto transfer() { return ::transfer(*
this); }
161class list_iterator_element1 :
162 public BASE_ITERATOR_TYPE
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 >;
172 using ITEM =
typename BASE_ITERATOR_TYPE::ITEM::ELEMENT1;
176 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
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) {}
183 auto & topic() {
return this->m_p->key(); }
184 auto & topic()
const {
return this->m_p->key(); }
186 auto & item() {
return this->m_p->key(); }
187 auto & item()
const {
return this->m_p->key(); }
189 auto transfer_topic() { return ::transfer(this->m_p->transfer_item()); }
196class list_iterator_element2 :
197 public BASE_ITERATOR_TYPE
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 >;
208 using ITEM =
typename BASE_ITERATOR_TYPE::ITEM::ELEMENT2;
212 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
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) {}
219 auto & topic() {
return this->m_p->payload(); }
220 auto & topic()
const {
return this->m_p->payload(); }
222 auto & item() {
return this->m_p->payload(); }
223 auto & item()
const {
return this->m_p->payload(); }
225 auto transfer_topic() { return ::transfer(this->m_p->transfer_payload()); }
231class make_list_iterator :
232 public BASE_ITERATOR_TYPE
237 using ITERATOR_TYPE = BASE_ITERATOR_TYPE;
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;
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;
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 >;
255 using node =
typename BASE_ITERATOR_TYPE::node;
256 using const_node =
const node;
259 using ITEM =
typename BASE_ITERATOR_TYPE::ITEM;
260 using CONST_ITEM =
const ITEM;
263 using BASE_ITERATOR_TYPE::BASE_ITERATOR_TYPE;
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) {}
271 constexpr ::collection::index index()
const
274 ::collection::index i = -1;
276 auto iterator = *
this;
278 while (iterator.is_set())
292 static constexpr bool difference(::collection::count & c, const_iterator a, const_iterator b)
297 while (::is_set(b) && b != a)
311 template < prototype_
integral INTEGRAL >
312 THIS_ITERATOR & operator += (INTEGRAL c)
328 template < prototype_
integral INTEGRAL >
329 constexpr THIS_ITERATOR operator + (INTEGRAL c)
const
332 auto iterator = *
this;
341 template < prototype_
integral INTEGRAL >
342 THIS_ITERATOR & operator -= (INTEGRAL c)
357 template < prototype_
integral INTEGRAL >
358 constexpr THIS_ITERATOR operator - (INTEGRAL c)
const
361 auto iterator = *
this;
370 constexpr ::collection::count operator - (THIS_ITERATOR iterator)
const
377 ::collection::count c = 0;
401 ::collection::count c = 0;
421 throw "iterator is not part of list_base";
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; }
432 template <
typename ITERATOR >
433 constexpr bool operator == (ITERATOR iterator)
const
436 return this->get() == iterator.get();
441 constexpr std::strong_ordering operator <=> (
const THIS_ITERATOR & iterator)
const
444 return this->index() <=> iterator.index();
449 THIS_ITERATOR & operator ++()
452 *
this = this->next();
459 THIS_ITERATOR operator ++(::i32)
462 auto iterator = *
this;
471 THIS_ITERATOR & operator --()
474 *
this = this->back();
481 THIS_ITERATOR operator --(::i32)
484 auto iterator = *
this;
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(); }
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; }
504 auto & operator *() {
return this->
item(); }
505 auto & operator *()
const {
return this->
item(); }
508 auto operator ->() {
return &this->
item(); }
509 auto operator ->()
const {
return &this->
item(); }
512 auto & back() {
return this->get()->back(); }
513 auto & back()
const {
return this->get()->back(); }
515 auto & next() {
return this->get()->next(); }
516 auto & next()
const {
return this->get()->next(); }