#ifndef JSULIST_H #define JSULIST_H #include "types.h" 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*)this->getFirstLink(); } JSUTree* getLastChild() const { return (JSUTree*)this->getLast(); } JSUTree* getNextChild() const { return (JSUTree*)this->mNext; } JSUTree* getPrevChild() const { return (JSUTree*)this->getPrev(); } u32 getNumChildren() const { return this->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 /* JSULIST_H */