20#define LIST_HEAD_MARKER 0
27template <
typename T, List_member<T> T::*member>
class List;
120 return _prev != LIST_HEAD_MARKER ? _prev : 0;
124 return _prev != LIST_HEAD_MARKER ? _prev : 0;
134 template <
typename X, List_member<X> X::*member>
friend class List;
138template <
typename T, List_member<T> T::*member>
142 typedef const T *const_pointer;
145 typedef size_t size_type;
149 : _head(0), _tail(0) {
182 for (T *x = _head; x; x = (x->*member)._next)
215 if (((x->*member)._next = _head))
216 (_head->*member)._prev = x;
220 (_head->*member)._prev = LIST_HEAD_MARKER;
227 assert(x && !(x->*member)._next && !(x->*member)._prev);
228 if (((x->*member)._prev = _tail))
229 (_tail->*member)._next = x;
232 (_head->*member)._prev = LIST_HEAD_MARKER;
242 if ((_head = (x->*member)._next) != LIST_HEAD_MARKER)
243 (_head->*member)._prev = LIST_HEAD_MARKER;
246 (x->*member)._next = (x->*member)._prev = 0;
254 if ((_tail = (x->*member)._prev) != LIST_HEAD_MARKER)
255 (_tail->*member)._next = 0;
258 (x->*member)._next = (x->*member)._prev = 0;
268 T **pprev = (pos ? &(pos->*member)._prev : &_tail);
269 if (((x->*member)._prev = *pprev) != LIST_HEAD_MARKER)
270 ((x->*member)._prev->*member)._next = x;
274 (x->*member)._next = pos;
292 template <
typename InputIterator>
294 while (first != last) {
306 T *n = (x->*member)._next, *p = (x->*member)._prev;
308 (n->*member)._prev = p;
310 _tail = (p != LIST_HEAD_MARKER ? p : 0);
311 if (p != LIST_HEAD_MARKER)
312 (p->*member)._next = n;
315 (x->*member)._next = (x->*member)._prev = 0;
334 while (first != last)
335 first =
erase(first);
342 while (T *x = _head) {
343 _head = (x->*member)._next;
344 (x->*member)._next = (x->*member)._prev = 0;
361 T *h = x._head, *t = x._tail;
362 x._head = _head, x._tail = _tail;
363 _head = h, _tail = t;
371 return !(x->*member)._next && !(x->*member)._prev && x != _head;
377 for (const_pointer *it = _head; it; it = (it->*member).next())
393 : _x(const_cast<T *>(x)), _list() {
397 : _x(), _list(list) {
401 : _x(const_cast<T *>(x)), _list(list) {
405 operator unspecified_bool_type()
const {
427 _x = (_x->*member).next();
435 assert(_x ? (
bool) (_x->*member).prev() : _list && _list->back());
437 _x = (_x->*member).prev();
439 _x =
const_cast<T *
>(_list->back());
562#undef LIST_HEAD_MARKER
Const iterator type for List.
Definition list.hh:386
const_iterator & operator+=(int x)
Move this iterator forward by x positions.
Definition list.hh:448
void operator++(int)
Advance this iterator to the next element.
Definition list.hh:430
const_iterator & operator-=(int x)
Move this iterator backward by x positions.
Definition list.hh:458
const T & operator*() const
Return the current list element.
Definition list.hh:421
void operator--()
Advance this iterator to the previous element.
Definition list.hh:434
const_iterator()
Construct an invalid iterator.
Definition list.hh:388
const_iterator(const T *x, const List< T, member > *list)
Construct an iterator pointing at x in list.
Definition list.hh:400
const T * get() const
Return the current list element or null.
Definition list.hh:413
const T * operator->() const
Return the current list element or null.
Definition list.hh:417
bool operator!=(const_iterator x) const
Test if this iterator does not equal x.
Definition list.hh:480
const_iterator operator-(int x) const
Return an iterator x positions behind.
Definition list.hh:471
bool live() const
Test if this iterator points to a valid list element.
Definition list.hh:409
bool operator==(const_iterator x) const
Test if this iterator equals x.
Definition list.hh:476
void operator++()
Advance this iterator to the next element.
Definition list.hh:425
const_iterator(const T *x)
Construct an iterator pointing at x.
Definition list.hh:392
const_iterator(const List< T, member > *list)
Construct an end iterator for list.
Definition list.hh:396
const_iterator operator+(int x) const
Return an iterator x positions ahead.
Definition list.hh:466
void operator--(int)
Advance this iterator to the previous element.
Definition list.hh:442
Iterator type for List.
Definition list.hh:491
iterator operator-(int x) const
Return an iterator x positions behind.
Definition list.hh:546
iterator(T *x, List< T, member > *list)
Construct an iterator pointing at x in list.
Definition list.hh:505
T & operator*() const
Return the current list element.
Definition list.hh:517
iterator()
Construct an invalid iterator.
Definition list.hh:493
T * get() const
Return the current list element or null.
Definition list.hh:509
iterator(List< T, member > *list)
Construct an end iterator for list.
Definition list.hh:501
iterator(T *x)
Construct an iterator pointing at x.
Definition list.hh:497
iterator & operator+=(int x)
Move this iterator forward by x positions.
Definition list.hh:523
iterator & operator-=(int x)
Move this iterator backward by x positions.
Definition list.hh:533
T * operator->() const
Return the current list element or null.
Definition list.hh:513
iterator operator+(int x) const
Return an iterator x positions ahead.
Definition list.hh:541
Member of classes to be placed on a List.
Definition list.hh:102
const T * prev() const
Definition list.hh:123
T * next()
Return the next element in the list.
Definition list.hh:110
const T * next() const
Definition list.hh:114
T * prev()
Return the previous element in the list.
Definition list.hh:119
List_member()
Construct an isolated List_member.
Definition list.hh:105
Doubly-linked list template.
Definition list.hh:139
iterator end()
Return an iterator for the end of the list.
Definition list.hh:163
void pop_back()
Remove the element at the end of the list.
Definition list.hh:251
iterator insert(iterator it, pointer x)
Insert an element before it.
Definition list.hh:282
void push_front(pointer x)
Insert a new element at the beginning of the list.
Definition list.hh:213
const_iterator end() const
Definition list.hh:167
void push_back(pointer x)
Insert a new element at the end of the list.
Definition list.hh:226
void insert(pointer pos, pointer x)
Insert an element before pos.
Definition list.hh:266
bool contains(const_pointer x) const
Check if x is a member of this list.
Definition list.hh:375
void insert(iterator it, InputIterator first, InputIterator last)
Insert the elements in [first, last) before it.
Definition list.hh:293
void erase(pointer x)
Remove x from the list.
Definition list.hh:304
void pop_front()
Remove the element at the beginning of the list.
Definition list.hh:239
iterator erase(iterator first, iterator last)
Remove the elements in [first, last) from the list.
Definition list.hh:333
iterator erase(iterator it)
Remove the element pointed to by it from the list.
Definition list.hh:322
iterator begin()
Return an iterator for the first element in the list.
Definition list.hh:154
const_iterator begin() const
Definition list.hh:158
size_type size() const
Return the number of elements in the list.
Definition list.hh:180
bool isolated(const_pointer x)
Check if x is isolated.
Definition list.hh:370
void swap(List< T, member > &x)
Exchange list contents with list x.
Definition list.hh:360
pointer back()
Return the last element in the list.
Definition list.hh:201
void __clear()
Remove all elements from the list.
Definition list.hh:354
bool empty() const
Return true iff size() == 0.
Definition list.hh:174
List()
Construct an empty list.
Definition list.hh:148
void clear()
Remove all elements from the list.
Definition list.hh:341
const_pointer front() const
Definition list.hh:195
const_pointer back() const
Definition list.hh:205
pointer front()
Return the first element in the list.
Definition list.hh:191