#ifndef JSULIST_H #define JSULIST_H #include "types.h" #ifdef __cplusplus extern "C" { class JSUPtrLink; class JSUPtrList { public: JSUPtrList() { initiate(); } JSUPtrList(bool); ~JSUPtrList(); void initiate(); void setFirst(JSUPtrLink *); bool append(JSUPtrLink *); bool prepend(JSUPtrLink *); bool insert(JSUPtrLink *, JSUPtrLink *); bool remove(JSUPtrLink *); JSUPtrLink *getNthLink(u32 idx) const; JSUPtrLink *getFirstLink() const { return mHead; } JSUPtrLink *getLastLink() const { return mTail; } u32 getNumLinks() const { return mLinkCount; } JSUPtrLink *mHead; // _0 JSUPtrLink *mTail; // _4 u32 mLinkCount; // _8 }; class JSUPtrLink { public: JSUPtrLink(void *); ~JSUPtrLink(); void *getObjectPtr() const { return mData; } JSUPtrList *getList() const { return mPtrList; } JSUPtrLink *getNext() const { return mNext; } JSUPtrLink *getPrev() const { return mPrev; } void *mData; // _0 JSUPtrList *mPtrList; // _4 JSUPtrLink *mPrev; // _8 JSUPtrLink *mNext; // _C }; template class JSULink; // friend class? i'm C++ noob template class JSUList : public JSUPtrList { public: JSUList(bool thing) : JSUPtrList(thing) { } JSUList() : JSUPtrList() { } bool append(JSULink *link) { return JSUPtrList::append((JSUPtrLink *)link); } bool prepend(JSULink *link) { return JSUPtrList::prepend((JSUPtrLink *)link); } bool insert(JSULink *before, JSULink *link) { return JSUPtrList::insert((JSUPtrLink *)before, (JSUPtrLink *)link); } bool remove(JSULink *link) { return JSUPtrList::remove((JSUPtrLink *)link); } JSULink *getFirst() const { return (JSULink *)getFirstLink(); } JSULink *getLast() const { return (JSULink *)getLastLink(); } JSULink *getEnd() const { return nullptr; } u32 getNumLinks() const { return mLinkCount; } }; template class JSUListIterator { public: JSUListIterator() : mLink(nullptr) { } JSUListIterator(JSULink *link) : mLink(link) { } JSUListIterator(JSUList *list) : mLink(list->getFirst()) { } JSUListIterator &operator=(JSULink *link) { this->mLink = link; return *this; } T *getObject() { return this->mLink->getObject(); } bool operator==(JSULink const *other) const { return this->mLink == other; } bool operator!=(JSULink const *other) const { return this->mLink != other; } bool operator==(JSUListIterator const &other) const { return this->mLink == other.mLink; } bool operator!=(JSUListIterator const &other) const { return this->mLink != other.mLink; } JSUListIterator operator++(int) { JSUListIterator prev = *this; this->mLink = this->mLink->getNext(); return prev; } JSUListIterator &operator++() { this->mLink = this->mLink->getNext(); return *this; } JSUListIterator operator--(int) { JSUListIterator prev = *this; this->mLink = this->mLink->getPrev(); return prev; } JSUListIterator &operator--() { this->mLink = this->mLink->getPrev(); return *this; } T &operator*() { return *this->getObject(); } T *operator->() { return this->getObject(); } // private: JSULink *mLink; }; template class JSULink : public JSUPtrLink { public: JSULink(void *pData) : JSUPtrLink(pData) { } T *getObject() const { return (T *)mData; } JSUList *getList() const { return (JSUList *)JSUPtrLink::getList(); } // fabricated, offcial name: getSupervisor JSULink *getNext() const { return (JSULink *)JSUPtrLink::getNext(); } JSULink *getPrev() const { return (JSULink *)JSUPtrLink::getPrev(); } ~JSULink() { } }; template // TODO: most of these inlines are probably wrong: rework class JSUTree : public JSUList, public JSULink { public: JSUTree(T *owner) : JSUList(), JSULink(owner) {} ~JSUTree() {} bool appendChild(JSUTree *child) { return this->append(child); } bool prependChild(JSUTree *child) { return this->prepend(child); } bool removeChild(JSUTree *child) { return this->remove(child); } bool insertChild(JSUTree *before, JSUTree *child) { return this->insert(before, child); } JSUTree *getEndChild() const { return nullptr; } JSUTree *getFirstChild() const { return (JSUTree *)getFirstLink(); } JSUTree *getLastChild() const { return (JSUTree *)this->getLast(); } JSUTree *getNextChild() const { return (JSUTree *)mNext; } JSUTree *getPrevChild() const { return (JSUTree *)this->getPrev(); } u32 getNumChildren() const { return mLinkCount; } T *getObject() const { return (T *)this->mData; } JSUTree *getParent() const { return (JSUTree *)this->mPtrList; } }; template class JSUTreeIterator { public: JSUTreeIterator() : mTree(nullptr) {} JSUTreeIterator(JSUTree *tree) : mTree(tree) {} JSUTreeIterator &operator=(JSUTree *tree) { this->mTree = tree; return *this; } T *getObject() const { return mTree->getObject(); } bool operator==(JSUTree *other) { return this->mTree == other; } bool operator!=(const JSUTree *other) const { return this->mTree != other; } JSUTreeIterator operator++(int) { JSUTreeIterator prev = *this; this->mTree = this->mTree->getNextChild(); return prev; } JSUTreeIterator &operator++() { this->mTree = this->mTree->getNextChild(); return *this; } T &operator*() { return *this->getObject(); } T *operator->() const { return mTree->getObject(); } private: JSUTree *mTree; }; } #endif #endif /* JSULIST_H */