58 m_head.m_next = &m_head;
59 m_head.m_prev = &m_head;
60 assertHeadConsistent();
65 assertHeadConsistent();
67 m_head.m_next->remove();
68 assertHeadConsistent();
73 assertHeadConsistent();
74 return m_head.m_next == &m_head;
79 assertHeadConsistent();
80 QInheritedListNode *nnode = n;
83 nnode->m_next = m_head.m_next ? m_head.m_next : &m_head;
84 nnode->m_next->m_prev = nnode;
86 m_head.m_next = nnode;
87 nnode->m_prev = &m_head;
88 assertHeadConsistent();
93 assertHeadConsistent();
94 QInheritedListNode *nnode = n;
97 nnode->m_prev = m_head.m_prev ? m_head.m_prev : &m_head;
98 nnode->m_prev->m_next = nnode;
100 m_head.m_prev = nnode;
101 nnode->m_next = &m_head;
102 assertHeadConsistent();
107 QInheritedListNode *nnode = n;
109 assertHeadConsistent();
114 assertHeadConsistent();
115 for (
const QInheritedListNode *nnode = m_head.m_next;
116 nnode != &m_head; nnode = nnode->m_next) {
124 template<
typename T,
typename Node>
135 m_node = m_node->m_next;
142 m_node = m_node->m_next;
149 base_iterator(Node *node) : m_node(node)
151 Q_ASSERT(m_node !=
nullptr);
154 Node *m_node =
nullptr;
160 const N *
first()
const {
return checkedNodeToN(m_head.m_next); }
161 N *
first() {
return checkedNodeToN(m_head.m_next); }
163 const N *
last()
const {
return checkedNodeToN(m_head.m_prev); }
164 N *
last() {
return checkedNodeToN(m_head.m_prev); }
166 const N *
next(
const N *current)
const
169 const QInheritedListNode *nnode = current;
170 return checkedNodeToN(nnode->m_next);
176 const QInheritedListNode *nnode = current;
177 return checkedNodeToN(nnode->m_next);
180 const N *
prev(
const N *current)
const
183 const QInheritedListNode *nnode = current;
184 return checkedNodeToN(nnode->m_prev);
190 const QInheritedListNode *nnode = current;
191 return checkedNodeToN(nnode->m_prev);
196 assertHeadConsistent();
202 assertHeadConsistent();
208 assertHeadConsistent();
214 assertHeadConsistent();
220 assertHeadConsistent();
221 qsizetype result = 0;
222 for (
const auto *node = m_head.m_next; node != &m_head; node = node->m_next)
228 static N *nodeToN(QInheritedListNode *node)
230 return static_cast<N *>(node);
233 static const N *nodeToN(
const QInheritedListNode *node)
235 return static_cast<
const N *>(node);
238 N *checkedNodeToN(QInheritedListNode *node)
const
240 assertHeadConsistent();
241 return (!node || node == &m_head) ?
nullptr : nodeToN(node);
244 void assertHeadConsistent()
const
246 Q_ASSERT(m_head.m_next !=
nullptr);
247 Q_ASSERT(m_head.m_prev !=
nullptr);
248 Q_ASSERT(m_head.m_next != &m_head || m_head.m_prev == &m_head);
251 QInheritedListNode m_head;