summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElijah Thomas <42302100+elijah-thomas774@users.noreply.github.com>2024-05-04 20:36:34 -0400
committerGitHub <noreply@github.com>2024-05-04 20:36:34 -0400
commitf3d89e071332ce13154d0a47e365f548ce4e4f65 (patch)
treedd9c5b72f43f56d7dcf538f5166a2962b8f4fe04 /src
parent1ecdfe9a4dfdd429c04424d77a9c0e6c148832a1 (diff)
parent3b8a4efbfd28d229e0e0e2e013d2a390b2ed217f (diff)
Merge pull request #21 from elijah-thomas774/ut_LinkList
ut_LinkList
Diffstat (limited to 'src')
-rw-r--r--src/nw4r/ut/ut_LinkList.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/nw4r/ut/ut_LinkList.cpp b/src/nw4r/ut/ut_LinkList.cpp
new file mode 100644
index 00000000..5b0d8ee1
--- /dev/null
+++ b/src/nw4r/ut/ut_LinkList.cpp
@@ -0,0 +1,76 @@
+#include <nw4r/ut/ut_LinkList.h>
+
+namespace nw4r {
+namespace ut {
+namespace detail {
+
+/* 8042a850 */
+LinkListImpl::~LinkListImpl() {
+ Clear();
+}
+
+/* 8042a8e0 */
+LinkListImpl::Iterator LinkListImpl::Erase(LinkListImpl::Iterator it) {
+ Iterator copy(it);
+ return Erase(it, ++copy);
+}
+
+/* 8042a930 */
+void LinkListImpl::Clear() {
+ Erase(GetBeginIter(), GetEndIter());
+}
+
+/* 8042a980 */
+LinkListImpl::Iterator LinkListImpl::Insert(Iterator it, LinkListNode *p) {
+ LinkListNode *next = it.mNode;
+ LinkListNode *prev = next->mPrev;
+
+ // prev <- p -> next
+ p->mNext = next;
+ p->mPrev = prev;
+ // prev <-> p <-> next
+ next->mPrev = p;
+ prev->mNext = p;
+
+ mSize++;
+
+ return Iterator(p);
+}
+
+/* 8042a9b0 */
+LinkListImpl::Iterator LinkListImpl::Erase(LinkListNode *p) {
+ LinkListNode *next = p->mNext;
+ LinkListNode *prev = p->mPrev;
+
+ // Remove connections to node
+ next->mPrev = prev;
+ prev->mNext = next;
+
+ mSize--;
+
+ // Isolate node
+ p->mNext = NULL;
+ p->mPrev = NULL;
+
+ return Iterator(next);
+}
+
+/* Not in SS */
+LinkListImpl::Iterator LinkListImpl::Erase(Iterator begin, Iterator end) {
+ LinkListNode *pCur = begin.mNode;
+ LinkListNode *pEnd = end.mNode;
+
+ while (pCur != pEnd) {
+ // Preserve next node before erasing pointers
+ LinkListNode *pNext = pCur->mNext;
+ // Erase current node
+ Erase(pCur);
+ pCur = pNext;
+ }
+
+ return Iterator(pEnd);
+}
+
+} // namespace detail
+} // namespace ut
+} // namespace nw4r