#ifndef JPALIST_H #define JPALIST_H template struct JPANode { JPANode() { mpPrev = NULL; mpNext = NULL; } ~JPANode() {} JPANode* getPrev() { return mpPrev; } JPANode* getNext() { return mpNext; } T* getObject() { return &mData; } JPANode* mpPrev; JPANode* mpNext; T mData; }; template struct JPAList { JPANode* mpFirst; JPANode* mpLast; u32 mNum; JPAList() : mpFirst(NULL), mpLast(NULL), mNum() {} 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->mpPrev = NULL; node->mpNext = 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; } }; #endif