29 #ifndef NVBLASTDLINK_H 30 #define NVBLASTDLINK_H 42 template<
typename IndexType>
49 template<
typename IndexType>
55 for (IndexType i = 0; i < linkCount; ++i)
57 links[i].
m_adj[0] = invalidIndex<IndexType>();
58 links[i].
m_adj[1] = invalidIndex<IndexType>();
66 links[0].
m_adj[0] = invalidIndex<IndexType>();
67 for (IndexType i = 1; i < linkCount; ++i)
69 links[i - 1].
m_adj[1] = i;
70 links[i].
m_adj[0] = i - 1;
72 links[linkCount - 1].
m_adj[1] = invalidIndex<IndexType>();
78 return links[linkIndex].
m_adj[which & 1];
84 const IndexType adj0 = link.
m_adj[0];
85 const IndexType adj1 = link.
m_adj[1];
88 links[adj1].m_adj[0] = adj0;
89 link.
m_adj[1] = invalidIndex<IndexType>();
93 links[adj0].m_adj[1] = adj1;
94 link.
m_adj[0] = invalidIndex<IndexType>();
109 links[listHead].
m_adj[0] = linkIndex;
111 links[linkIndex].
m_adj[1] = listHead;
112 listHead = linkIndex;
117 const IndexType linkIndex = listHead;
120 listHead = links[linkIndex].
m_adj[1];
123 links[listHead].
m_adj[0] = invalidIndex<IndexType>();
125 links[linkIndex].
m_adj[1] = invalidIndex<IndexType>();
133 if (listHead == linkIndex)
135 listHead = links[linkIndex].
m_adj[1];
137 remove(links, linkIndex);
144 DLink() : m_prev(nullptr), m_next(nullptr) {}
167 DList() : m_head(nullptr), m_tail(nullptr) {}
172 return m_head ==
nullptr;
177 return link.m_prev ==
nullptr && link.m_next ==
nullptr && m_head != &link;
193 if (!isSolitary(link))
198 link.m_next = m_head;
199 if (m_head !=
nullptr)
201 m_head->m_prev = &link;
204 if (m_tail ==
nullptr)
215 if (!isSolitary(link))
220 link.m_prev = m_tail;
221 if (m_tail !=
nullptr)
223 m_tail->m_next = &link;
226 if (m_head ==
nullptr)
236 if (link.m_prev !=
nullptr)
238 link.m_prev->m_next = link.m_next;
243 m_head = link.m_next;
246 if (link.m_next !=
nullptr)
248 link.m_next->m_prev = link.m_prev;
253 m_tail = link.m_prev;
256 link.m_next = link.m_prev =
nullptr;
264 It(
const DList& list,
Direction dir = Forward) : m_curr(dir == Forward ? list.getHead() : list.getTail()) {}
267 operator bool()
const 269 return m_curr !=
nullptr;
281 return m_curr = m_curr->
getNext();
287 return m_curr = m_curr->
getPrev();
303 #endif // #ifndef NVBLASTDLINK_H DList()
Definition: NvBlastDLink.h:167
bool insertTail(DLink &link)
Definition: NvBlastDLink.h:212
IndexType m_adj[2]
Definition: NvBlastDLink.h:45
DLink * getNext() const
Definition: NvBlastDLink.h:151
Definition: NvBlastDLink.h:262
NV_INLINE bool isInvalidIndex(T index)
Definition: NvBlastIndexFns.h:57
Definition: NvBlastDLink.h:142
DLink * getPrev() const
Definition: NvBlastDLink.h:146
#define NVBLAST_ASSERT(exp)
Definition: NvBlastAssert.h:37
void initLinksSolitary(IndexDLink< IndexType > *links, IndexType linkCount)
Definition: NvBlastDLink.h:53
void initLinksChain(IndexDLink< IndexType > *links, IndexType linkCount)
Definition: NvBlastDLink.h:62
bool isSolitary(const DLink &link) const
Definition: NvBlastDLink.h:175
bool isSolitary(IndexDLink< IndexType > *links, IndexType linkIndex)
Definition: NvBlastDLink.h:98
IndexType removeListHead(IndexType &listHead, IndexDLink< IndexType > *links)
Definition: NvBlastDLink.h:115
bool insertHead(DLink &link)
Definition: NvBlastDLink.h:190
bool isEmpty() const
Definition: NvBlastDLink.h:169
IndexType getAdj(IndexDLink< IndexType > *links, IndexType linkIndex, int which)
Definition: NvBlastDLink.h:76
Definition: NvBlastDLink.h:50
Direction
Definition: NvBlastDLink.h:262
void insertListHead(IndexType &listHead, IndexDLink< IndexType > *links, IndexType linkIndex)
Definition: NvBlastDLink.h:104
Definition: NvBlastDLink.h:164
It(const DList &list, Direction dir=Forward)
Definition: NvBlastDLink.h:264
Definition: NvBlastDLink.h:259
DLink()
Definition: NvBlastDLink.h:144
Definition: NvBlastDLink.h:43
DLink * getHead() const
Definition: NvBlastDLink.h:180
Definition: NvBlastArray.h:37
void removeFromList(IndexType &listHead, IndexDLink< IndexType > *links, IndexType linkIndex)
Definition: NvBlastDLink.h:130
DLink * getTail() const
Definition: NvBlastDLink.h:185