#ifndef JPALIST_H #define JPALIST_H #include "dolphin/types.h" /** * @ingroup jsystem-jparticle * */ template struct JPANode { JPANode() : mpPrev(NULL), mpNext(NULL) { } ~JPANode() {} JPANode* getPrev() { return mpPrev; } JPANode* getNext() { return mpNext; } T* getObject() { return &mData; } /* 0x00 */ JPANode* mpPrev; /* 0x04 */ JPANode* mpNext; /* 0x08 */ T mData; }; /** * @ingroup jsystem-jparticle * */ template struct JPAList { /* 0x00 */ JPANode* mpFirst; /* 0x04 */ JPANode* mpLast; /* 0x08 */ u32 mNum; JPAList() : mpFirst(NULL), mpLast(NULL), mNum() {} ~JPAList() {} JPANode* getEnd() { return NULL; } JPANode* getFirst() const { return mpFirst; } JPANode* getLast() const { return mpLast; } u32 getNum() const { return mNum; } void push_front(JPANode* node) { if (mpFirst != NULL) { node->mpPrev = NULL; node->mpNext = mpFirst; mpFirst->mpPrev = node; mpFirst = node; } else { mpLast = node; mpFirst = node; node->mpPrev = NULL; node->mpNext = NULL; } mNum++; } void push_back(JPANode* node) { if (mpLast != NULL) { node->mpPrev = mpLast; node->mpNext = NULL; mpLast->mpNext = node; mpLast = node; } else { mpFirst = node; mpLast = node; node->mpNext = node->mpPrev = NULL; } mNum++; } JPANode* pop_front() { JPANode* ret = NULL; if (mNum == 1) { ret = mpFirst; mpLast = NULL; mpFirst = NULL; mNum--; } else if (mNum) { ret = mpFirst; ret->mpNext->mpPrev = NULL; mpFirst = ret->mpNext; mNum--; } return ret; } JPANode* pop_back() { JPANode* ret = NULL; if (mNum == 1) { ret = mpLast; mpLast = NULL; mpFirst = NULL; mNum--; } else if (mNum) { ret = mpLast; ret->mpPrev->mpNext = NULL; mpLast = ret->mpPrev; mNum--; } return ret; } JPANode* erase(JPANode* node) { if (node->mpNext != NULL && node->mpPrev != NULL) { node->mpPrev->mpNext = node->mpNext; node->mpNext->mpPrev = node->mpPrev; mNum--; } else if (node->mpNext != NULL) { node->mpNext->mpPrev = NULL; mpFirst = node->mpNext; mNum--; } else if (node->mpPrev != NULL) { node->mpPrev->mpNext = NULL; mpLast = node->mpPrev; mNum--; } else { mpLast = NULL; mpFirst = NULL; mNum--; } return node; } }; #endif