Files
2023-04-29 14:18:06 +02:00

169 lines
3.3 KiB
C++

#include <JSystem/JSupport/JSUList.h>
// from pikmin decomp
JSUPtrLink::JSUPtrLink(void *pData) {
mPtrList = 0;
mData = pData;
mPrev = 0;
mNext = 0;
}
JSUPtrLink::~JSUPtrLink() {
if (mPtrList) {
mPtrList->remove(this);
}
}
JSUPtrList::JSUPtrList(bool doInitialize) {
if (doInitialize) {
initiate();
}
}
JSUPtrList::~JSUPtrList() {
JSUPtrLink* curHead = mHead;
for (int i = 0; i < mLinkCount; i++) {
curHead->mPtrList = 0;
curHead = curHead->mNext;
}
}
void JSUPtrList::initiate() {
mHead = 0;
mTail = 0;
mLinkCount = 0;
}
void JSUPtrList::setFirst(JSUPtrLink *pLink) {
pLink->mPtrList = this;
pLink->mPrev = 0;
pLink->mNext = 0;
mTail = pLink;
mHead = pLink;
mLinkCount = 1;
}
bool JSUPtrList::append(JSUPtrLink *pLink) {
bool validity = (pLink->mPtrList == 0);
if (!validity) {
validity = pLink->mPtrList->remove(pLink);
}
if (validity) {
if (!mLinkCount) {
setFirst(pLink);
}
else {
pLink->mPtrList = this;
pLink->mPrev = mTail;
pLink->mNext = 0;
mTail->mNext = pLink;
mTail = pLink;
mLinkCount = mLinkCount + 1;
}
}
return validity;
}
bool JSUPtrList::prepend(JSUPtrLink *pLink) {
bool validity = (pLink->mPtrList == 0);
if (!validity) {
validity = pLink->mPtrList->remove(pLink);
}
if (validity) {
if (!mLinkCount) {
setFirst(pLink);
}
else {
pLink->mPtrList = this;
pLink->mPrev = 0;
pLink->mNext = mHead;
mHead->mPrev = pLink;
mHead = pLink;
mLinkCount = mLinkCount + 1;
}
}
return validity;
}
bool JSUPtrList::insert(JSUPtrLink *pLink_1, JSUPtrLink *pLink_2) {
if (pLink_1 == mHead) {
return prepend(pLink_2);
}
if (!pLink_1) {
return append(pLink_2);
}
if (pLink_1->mPtrList != this) {
return false;
}
JSUPtrList* link2PtrList = pLink_2->mPtrList;
bool validity = (link2PtrList == 0);
if (!validity) {
validity = link2PtrList->remove(pLink_2);
}
if (validity) {
JSUPtrLink* prev = pLink_1->mPrev;
pLink_2->mPtrList = this;
pLink_2->mPrev = prev;
pLink_2->mNext = pLink_1;
prev->mNext = pLink_2;
pLink_1->mPrev = pLink_2;
mLinkCount++;
}
return validity;
}
bool JSUPtrList::remove(JSUPtrLink *pLink) {
bool isSameList = (pLink->mPtrList == this);
if (isSameList) {
if (mLinkCount == 1) {
mHead = 0;
mTail = 0;
}
else if (pLink == mHead) {
pLink->mNext->mPrev = 0;
mHead = pLink->mNext;
}
else if (pLink == mTail) {
pLink->mPrev->mNext = 0;
mTail = pLink->mPrev;
}
else {
pLink->mPrev->mNext = pLink->mNext;
pLink->mNext->mPrev = pLink->mPrev;
}
pLink->mPtrList = 0;
mLinkCount--;
}
return isSameList;
}
JSUPtrLink *JSUPtrList::getNthLink(u32 n) const
{
if (n >= mLinkCount)
{
return nullptr;
}
JSUPtrLink *curHead = mHead;
for (int i = 0; i < n; i++)
{
curHead = curHead->mNext;
}
return curHead;
}