23 template <
typename T,
typename Tag>
24 class INSPIRCD_INTRUSIVE_LIST_NAME
27 class iterator :
public std::iterator<std::bidirectional_iterator_tag, T*>
39 curr = curr->intrusive_list_node<T, Tag>::ptr_next;
52 curr = curr->intrusive_list_node<T, Tag>::ptr_prev;
63 bool operator==(
const iterator& other)
const {
return (curr == other.curr); }
64 bool operator!=(
const iterator& other)
const {
return (curr != other.curr); }
65 T* operator*()
const {
return curr; }
70 INSPIRCD_INTRUSIVE_LIST_NAME()
72 #ifdef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL
89 iterator begin()
const
91 return iterator(listhead);
109 void push_front(T* x)
113 x->intrusive_list_node<T, Tag>::ptr_next = listhead;
114 listhead->intrusive_list_node<T, Tag>::ptr_prev = x;
116 #ifdef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL
123 #ifdef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL
133 x->intrusive_list_node<T, Tag>::ptr_prev = listtail;
134 listtail->intrusive_list_node<T, Tag>::ptr_next = x;
147 void erase(
const iterator& it)
155 listhead = x->intrusive_list_node<T, Tag>::ptr_next;
156 #ifdef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL
158 listtail = x->intrusive_list_node<T, Tag>::ptr_prev;
160 x->intrusive_list_node<T, Tag>::unlink();
166 #ifdef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL