#ifndef JSULIST_H #define JSULIST_H #include "dolphin/types.h" template class JSUList; // // Link // class JSUPtrList; /** * @ingroup jsystem-jsupport * */ class JSUPtrLink { public: JSUPtrLink(void* object); ~JSUPtrLink(); void* getObjectPtr() const { return mObject; } JSUPtrList* getList() const { return mList; } JSUPtrLink* getNext() const { return mNext; } JSUPtrLink* getPrev() const { return mPrev; } public: void* mObject; JSUPtrList* mList; JSUPtrLink* mPrev; JSUPtrLink* mNext; }; /** * @ingroup jsystem-jsupport * */ template class JSULink : public JSUPtrLink { public: JSULink(T* object) : JSUPtrLink((void*)object) {} T* getObject() const { return static_cast(mObject); } JSUList* getSupervisor() const { return static_cast*>(this->getList()); } JSULink* getNext() const { return static_cast(mNext); } JSULink* getPrev() const { return static_cast(mPrev); } }; // // List // /** * @ingroup jsystem-jsupport * */ class JSUPtrList { public: JSUPtrList() { this->initiate(); } JSUPtrList(bool init); ~JSUPtrList(); void initiate(); void setFirst(JSUPtrLink* first); bool append(JSUPtrLink* ptr); bool prepend(JSUPtrLink* ptr); bool insert(JSUPtrLink* before, JSUPtrLink* ptr); bool remove(JSUPtrLink* ptr); JSUPtrLink* getNthLink(u32 i) const; JSUPtrLink* getFirstLink() const { return mHead; } JSUPtrLink* getLastLink() const { return mTail; } u32 getNumLinks() const { return mLength; } private: JSUPtrLink* mHead; JSUPtrLink* mTail; u32 mLength; }; /** * @ingroup jsystem-jsupport * */ template class JSUList : public JSUPtrList { public: JSUList() : JSUPtrList() {} JSUList(bool init) : JSUPtrList(init) {} ~JSUList() {} bool append(JSULink* link) { return this->JSUPtrList::append((JSUPtrLink*)link); } bool prepend(JSULink* link) { return this->JSUPtrList::prepend((JSUPtrLink*)link); } bool insert(JSULink* before, JSULink* link) { return this->JSUPtrList::insert((JSUPtrLink*)before, (JSUPtrLink*)link); } bool remove(JSULink* link) { return this->JSUPtrList::remove((JSUPtrLink*)link); } JSULink* getFirst() const { return (JSULink*)getFirstLink(); } JSULink* getLast() const { return (JSULink*)getLastLink(); } JSULink* getNth(int index) { return (JSULink*)getNthLink(index); } JSULink* getEnd() const { return NULL; } u32 getNumLinks() const { return this->JSUPtrList::getNumLinks(); } }; /** * @ingroup jsystem-jsupport * */ template class JSUListIterator { public: JSUListIterator() : mLink(NULL) {} 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->() const { return mLink->getObject(); } // private: JSULink* mLink; }; // // Tree // /** * @ingroup jsystem-jsupport * */ template class JSUTree : public JSUList, public JSULink { public: JSUTree(T* owner) : JSUList(), JSULink(owner) {} ~JSUTree() {} bool appendChild(JSUTree* child) { return this->append(child); } bool removeChild(JSUTree* child) { return this->remove(child); } bool insertChild(JSUTree* before, JSUTree* child) { return this->insert(before, child); } JSUTree* getEndChild() const { return NULL; } JSUTree* getFirstChild() const { return (JSUTree*)this->getFirst(); } JSUTree* getLastChild() const { return (JSUTree*)this->getLast(); } JSUTree* getNextChild() const { return (JSUTree*)this->getNext(); } JSUTree* getPrevChild() const { return (JSUTree*)this->getPrev(); } u32 getNumChildren() const { return this->getNumLinks(); } T* getObject() const { return (T*)this->getObjectPtr(); } JSUTree* getParent() const { return (JSUTree*)this->getList(); } }; /** * @ingroup jsystem-jsupport * */ template class JSUTreeIterator { public: JSUTreeIterator() : mTree(NULL) {} JSUTreeIterator(JSUTree* tree) : mTree(tree) {} JSUTreeIterator& operator=(JSUTree* tree) { this->mTree = tree; return *this; } T* getObject() { return this->mTree->getObject(); } bool operator==(JSUTree* other) { return this->mTree == other; } bool operator!=(JSUTree* other) { 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->() { return this->getObject(); } private: JSUTree* mTree; }; #endif /* JSULIST_H */