summaryrefslogtreecommitdiff
path: root/src/JSystem/JSupport
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSystem/JSupport')
-rw-r--r--src/JSystem/JSupport/JSUList.cpp162
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