diff options
Diffstat (limited to 'src/JSystem/JSupport')
| -rw-r--r-- | src/JSystem/JSupport/JSUList.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/JSystem/JSupport/JSUList.cpp b/src/JSystem/JSupport/JSUList.cpp new file mode 100644 index 00000000..eb906508 --- /dev/null +++ b/src/JSystem/JSupport/JSUList.cpp @@ -0,0 +1,162 @@ +// +// Generated By: dol2asm +// Translation Unit: JSUList +// + +#include "JSystem/JSupport/JSUList.h" + +JSUPtrLink::JSUPtrLink(void* object) { + mList = NULL; + mObject = object; + mPrev = NULL; + mNext = NULL; +} + +JSUPtrLink::~JSUPtrLink() { + if (mList != NULL) { + mList->remove(this); + } +} + +JSUPtrList::JSUPtrList(bool init) { + if (init) { + initiate(); + } +} + +JSUPtrList::~JSUPtrList() { + JSUPtrLink* node = mHead; + s32 removed = 0; + while (mLength > removed) { + node->mList = NULL; + node = node->getNext(); + removed += 1; + } +} + +void JSUPtrList::initiate() { + mHead = NULL; + mTail = NULL; + mLength = 0; +} + +void JSUPtrList::setFirst(JSUPtrLink* first) { + first->mList = this; + first->mPrev = NULL; + first->mNext = NULL; + mTail = first; + mHead = first; + mLength = 1; +} + +bool JSUPtrList::append(JSUPtrLink* ptr) { + JSUPtrList* list = ptr->mList; + bool result = (NULL == list); + if (!result) { + result = list->remove(ptr); + } + + if (result) { + if (mLength == 0) { + setFirst(ptr); + } else { + ptr->mList = this; + ptr->mPrev = mTail; + ptr->mNext = NULL; + mTail->mNext = ptr; + mTail = ptr; + mLength++; + } + } + + return result; +} + +bool JSUPtrList::prepend(JSUPtrLink* ptr) { + JSUPtrList* list = ptr->mList; + bool result = (NULL == list); + if (!result) { + result = list->remove(ptr); + } + + if (result) { + if (mLength == 0) { + setFirst(ptr); + } else { + ptr->mList = this; + ptr->mPrev = NULL; + ptr->mNext = mHead; + mHead->mPrev = ptr; + mHead = ptr; + mLength++; + } + } + + return result; +} + +bool JSUPtrList::insert(JSUPtrLink* before, JSUPtrLink* ptr) { + if (before == mHead) { + return prepend(ptr); + } else if (before == NULL) { + return append(ptr); + } + + if (before->mList != this) { + return false; + } + + bool result = (NULL == ptr->mList); + if (!result) { + result = ptr->mList->remove(ptr); + } + + if (result) { + JSUPtrLink* prev = before->mPrev; + ptr->mList = this; + ptr->mPrev = prev; + ptr->mNext = before; + prev->mNext = ptr; + before->mPrev = ptr; + mLength++; + } + + return result; +} + +bool JSUPtrList::remove(JSUPtrLink* ptr) { + bool is_parent = (ptr->mList == this); + if (is_parent) { + if (mLength == 1) { + mHead = NULL; + mTail = NULL; + } else if (ptr == mHead) { + ptr->mNext->mPrev = NULL; + mHead = ptr->mNext; + } else if (ptr == mTail) { + ptr->mPrev->mNext = NULL; + mTail = ptr->mPrev; + } else { + ptr->mPrev->mNext = ptr->mNext; + ptr->mNext->mPrev = ptr->mPrev; + } + + ptr->mList = NULL; + mLength--; + } + + return is_parent; +} + +JSUPtrLink* JSUPtrList::getNthLink(u32 index) const { + if (index >= mLength) { + return NULL; + } + + JSUPtrLink* node = mHead; + for (u32 i = 0; i < index; i++) { + node = node->getNext(); + } + + return node; +}
\ No newline at end of file |
