From bc30d007e11458a198c5725626a10bb06a5da536 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Mon, 11 Jul 2022 12:44:01 -0700 Subject: [PATCH] TNodeLinkList (#207) --- ...TNodeLinkListFPQ27JGadget13TLinkListNode.s | 10 -- asm/JSystem/JGadget/linklist/func_802DCAA0.s | 29 ------ asm/JSystem/JGadget/linklist/func_802DCBA8.s | 12 --- include/JSystem/JGadget/linklist.h | 10 +- libs/JSystem/JGadget/linklist.cpp | 94 ++++++++++++++----- 5 files changed, 74 insertions(+), 81 deletions(-) delete mode 100644 asm/JSystem/JGadget/linklist/Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s delete mode 100644 asm/JSystem/JGadget/linklist/func_802DCAA0.s delete mode 100644 asm/JSystem/JGadget/linklist/func_802DCBA8.s diff --git a/asm/JSystem/JGadget/linklist/Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s b/asm/JSystem/JGadget/linklist/Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s deleted file mode 100644 index 481fd5b5741..00000000000 --- a/asm/JSystem/JGadget/linklist/Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s +++ /dev/null @@ -1,10 +0,0 @@ -lbl_802DCBD4: -/* 802DCBD4 80 C5 00 00 */ lwz r6, 0(r5) -/* 802DCBD8 80 A5 00 04 */ lwz r5, 4(r5) -/* 802DCBDC 90 A6 00 04 */ stw r5, 4(r6) -/* 802DCBE0 90 C5 00 00 */ stw r6, 0(r5) -/* 802DCBE4 80 A4 00 00 */ lwz r5, 0(r4) -/* 802DCBE8 38 05 FF FF */ addi r0, r5, -1 -/* 802DCBEC 90 04 00 00 */ stw r0, 0(r4) -/* 802DCBF0 90 C3 00 00 */ stw r6, 0(r3) -/* 802DCBF4 4E 80 00 20 */ blr diff --git a/asm/JSystem/JGadget/linklist/func_802DCAA0.s b/asm/JSystem/JGadget/linklist/func_802DCAA0.s deleted file mode 100644 index acf2948a624..00000000000 --- a/asm/JSystem/JGadget/linklist/func_802DCAA0.s +++ /dev/null @@ -1,29 +0,0 @@ -lbl_802DCAA0: -/* 802DCAA0 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 802DCAA4 7C 08 02 A6 */ mflr r0 -/* 802DCAA8 90 01 00 34 */ stw r0, 0x34(r1) -/* 802DCAAC 39 61 00 30 */ addi r11, r1, 0x30 -/* 802DCAB0 48 08 57 25 */ bl _savegpr_27 -/* 802DCAB4 7C 7B 1B 78 */ mr r27, r3 -/* 802DCAB8 7C 9C 23 78 */ mr r28, r4 -/* 802DCABC 7C DD 33 78 */ mr r29, r6 -/* 802DCAC0 80 A5 00 00 */ lwz r5, 0(r5) -/* 802DCAC4 83 E6 00 00 */ lwz r31, 0(r6) -/* 802DCAC8 48 00 00 18 */ b lbl_802DCAE0 -lbl_802DCACC: -/* 802DCACC 83 C5 00 00 */ lwz r30, 0(r5) -/* 802DCAD0 38 61 00 08 */ addi r3, r1, 8 -/* 802DCAD4 7F 84 E3 78 */ mr r4, r28 -/* 802DCAD8 48 00 00 FD */ bl Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode -/* 802DCADC 7F C5 F3 78 */ mr r5, r30 -lbl_802DCAE0: -/* 802DCAE0 7C 05 F8 40 */ cmplw r5, r31 -/* 802DCAE4 40 82 FF E8 */ bne lbl_802DCACC -/* 802DCAE8 80 1D 00 00 */ lwz r0, 0(r29) -/* 802DCAEC 90 1B 00 00 */ stw r0, 0(r27) -/* 802DCAF0 39 61 00 30 */ addi r11, r1, 0x30 -/* 802DCAF4 48 08 57 2D */ bl _restgpr_27 -/* 802DCAF8 80 01 00 34 */ lwz r0, 0x34(r1) -/* 802DCAFC 7C 08 03 A6 */ mtlr r0 -/* 802DCB00 38 21 00 30 */ addi r1, r1, 0x30 -/* 802DCB04 4E 80 00 20 */ blr diff --git a/asm/JSystem/JGadget/linklist/func_802DCBA8.s b/asm/JSystem/JGadget/linklist/func_802DCBA8.s deleted file mode 100644 index 3dd292f2540..00000000000 --- a/asm/JSystem/JGadget/linklist/func_802DCBA8.s +++ /dev/null @@ -1,12 +0,0 @@ -lbl_802DCBA8: -/* 802DCBA8 80 A5 00 00 */ lwz r5, 0(r5) -/* 802DCBAC 80 E5 00 04 */ lwz r7, 4(r5) -/* 802DCBB0 90 A6 00 00 */ stw r5, 0(r6) -/* 802DCBB4 90 E6 00 04 */ stw r7, 4(r6) -/* 802DCBB8 90 C5 00 04 */ stw r6, 4(r5) -/* 802DCBBC 90 C7 00 00 */ stw r6, 0(r7) -/* 802DCBC0 80 A4 00 00 */ lwz r5, 0(r4) -/* 802DCBC4 38 05 00 01 */ addi r0, r5, 1 -/* 802DCBC8 90 04 00 00 */ stw r0, 0(r4) -/* 802DCBCC 90 C3 00 00 */ stw r6, 0(r3) -/* 802DCBD0 4E 80 00 20 */ blr diff --git a/include/JSystem/JGadget/linklist.h b/include/JSystem/JGadget/linklist.h index d71734e8f94..f1f92f4fe1c 100644 --- a/include/JSystem/JGadget/linklist.h +++ b/include/JSystem/JGadget/linklist.h @@ -24,7 +24,7 @@ struct TNodeLinkList { TNodeLinkList() : ocObject_() { Initialize_(); } void Initialize_() { - ptr = NULL; + count = 0; ocObject_.mNext = &ocObject_; ocObject_.mPrev = &ocObject_; } @@ -35,15 +35,15 @@ struct TNodeLinkList { } /* 802DCA1C */ ~TNodeLinkList(); - /* 802DCAA0 */ void erase(JGadget::TNodeLinkList::iterator, JGadget::TNodeLinkList::iterator); - /* 802DCA58 */ void erase(JGadget::TNodeLinkList::iterator); + /* 802DCAA0 */ iterator erase(JGadget::TNodeLinkList::iterator, JGadget::TNodeLinkList::iterator); + /* 802DCA58 */ iterator erase(JGadget::TNodeLinkList::iterator); /* 802DCB08 */ void splice(JGadget::TNodeLinkList::iterator, JGadget::TNodeLinkList&, JGadget::TNodeLinkList::iterator); - /* 802DCBA8 */ void Insert(JGadget::TNodeLinkList::iterator, JGadget::TLinkListNode*); + /* 802DCBA8 */ iterator Insert(JGadget::TNodeLinkList::iterator, JGadget::TLinkListNode*); /* 802DCBD4 */ iterator Erase(JGadget::TLinkListNode*); /* 802DCBF8 */ void Remove(JGadget::TLinkListNode*); - /* 0x00 */ TNodeLinkList* ptr; + /* 0x00 */ int count; /* 0x04 */ TLinkListNode ocObject_; }; // Size: 0xC diff --git a/libs/JSystem/JGadget/linklist.cpp b/libs/JSystem/JGadget/linklist.cpp index 353892eddf8..e9af49c67fa 100644 --- a/libs/JSystem/JGadget/linklist.cpp +++ b/libs/JSystem/JGadget/linklist.cpp @@ -51,31 +51,58 @@ asm JGadget::TNodeLinkList::~TNodeLinkList() { /* 802DCA58-802DCAA0 2D7398 0048+00 0/0 2/2 0/0 .text * erase__Q27JGadget13TNodeLinkListFQ37JGadget13TNodeLinkList8iterator */ +#if NONMATCHING +JGadget::TNodeLinkList::iterator +JGadget::TNodeLinkList::erase(JGadget::TNodeLinkList::iterator it) { + TLinkListNode* node = it.node; + TLinkListNode* next = node->mNext; + iterator start(node); + iterator end(next); + return erase(start, end); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JGadget::TNodeLinkList::erase(JGadget::TNodeLinkList::iterator param_0) { +asm JGadget::TNodeLinkList::iterator +JGadget::TNodeLinkList::erase(JGadget::TNodeLinkList::iterator param_0) { nofralloc #include "asm/JSystem/JGadget/linklist/erase__Q27JGadget13TNodeLinkListFQ37JGadget13TNodeLinkList8iterator.s" } #pragma pop +#endif /* 802DCAA0-802DCB08 2D73E0 0068+00 1/1 0/0 0/0 .text * erase__Q27JGadget13TNodeLinkListFQ37JGadget13TNodeLinkList8iteratorQ37JGadget13TNodeLinkList8iterator */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JGadget::TNodeLinkList::erase(JGadget::TNodeLinkList::iterator param_0, - JGadget::TNodeLinkList::iterator param_1) { - nofralloc -#include "asm/JSystem/JGadget/linklist/func_802DCAA0.s" +JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::erase(iterator start, iterator end) { + TLinkListNode* startNode = start.node; + TLinkListNode* endNode = end.node; + while (startNode != endNode) { + TLinkListNode* nextNode = startNode->mNext; + Erase(startNode); + startNode = nextNode; + } + return iterator(end.node); } -#pragma pop /* 802DCB08-802DCBA8 2D7448 00A0+00 1/1 0/0 0/0 .text * splice__Q27JGadget13TNodeLinkListFQ37JGadget13TNodeLinkList8iteratorRQ27JGadget13TNodeLinkListQ37JGadget13TNodeLinkList8iterator */ +#if NONMATCHING +void JGadget::TNodeLinkList::splice(iterator myIt, TNodeLinkList& otherList, iterator otherIt) { + TLinkListNode* otherNode = otherIt; + TLinkListNode* otherNextNode = otherNode->mNext; + + if (myIt == otherIt) { + return; + } + if (myIt.node != otherNextNode) { + otherList.Erase(otherNode); + Insert(myIt, otherNode); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -86,33 +113,49 @@ asm void JGadget::TNodeLinkList::splice(JGadget::TNodeLinkList::iterator param_0 #include "asm/JSystem/JGadget/linklist/func_802DCB08.s" } #pragma pop +#endif /* 802DCBA8-802DCBD4 2D74E8 002C+00 1/1 7/7 0/0 .text * Insert__Q27JGadget13TNodeLinkListFQ37JGadget13TNodeLinkList8iteratorPQ27JGadget13TLinkListNode */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JGadget::TNodeLinkList::Insert(JGadget::TNodeLinkList::iterator param_0, - JGadget::TLinkListNode* param_1) { - nofralloc -#include "asm/JSystem/JGadget/linklist/func_802DCBA8.s" +JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Insert(iterator it, TLinkListNode* node) { + TLinkListNode* itNode = it.node; + TLinkListNode* prev = itNode->mPrev; + node->mNext = itNode; + node->mPrev = prev; + itNode->mPrev = node; + prev->mNext = node; + this->count++; + return iterator(node); } -#pragma pop /* 802DCBD4-802DCBF8 2D7514 0024+00 2/2 4/4 0/0 .text * Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JGadget::TNodeLinkList::iterator -JGadget::TNodeLinkList::Erase(JGadget::TLinkListNode* param_0) { - nofralloc -#include "asm/JSystem/JGadget/linklist/Erase__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s" +JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Erase(TLinkListNode* node) { + TLinkListNode* next = node->mNext; + TLinkListNode* prev = node->mPrev; + next->mPrev = prev; + prev->mNext = next; + this->count--; + return iterator(next); } -#pragma pop /* 802DCBF8-802DCCC8 2D7538 00D0+00 0/0 2/2 0/0 .text * Remove__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode */ +#if NONMATCHING +void JGadget::TNodeLinkList::Remove(TLinkListNode* node) { + TNodeLinkList trashList; + TLinkListNode* myNode = this->ocObject_.mNext; + while (myNode != end().node) { + if (myNode == node) { + TLinkListNode* next = myNode->mNext; + trashList.splice(&trashList.ocObject_, *this, myNode); + myNode = next; + } else { + myNode = myNode->mNext; + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -121,3 +164,4 @@ asm void JGadget::TNodeLinkList::Remove(JGadget::TLinkListNode* param_0) { #include "asm/JSystem/JGadget/linklist/Remove__Q27JGadget13TNodeLinkListFPQ27JGadget13TLinkListNode.s" } #pragma pop +#endif