/* (c) Ubi Studios 1996*/ /* See Vincent Greco for any comment or question*/ #ifndef __CPALST_HPP__ #define __CPALST_HPP__ #include "afxtempl.h" template class CPA_List : public CList { public: CPA_List(){} ~CPA_List(){} /* TYPE* FindElementFromPos (POSITION& rPosition) const; */ TYPE* FindElementFromIndex(int nIndex) const;/*nIndex is int (not tIndex) because of MFC compatibility...*/ /*Position based Iteration*/ TYPE* GetAtElement (POSITION& rPosition) const; TYPE* GetHeadElement (POSITION& rPosition) const; TYPE* GetTailElement (POSITION& rPosition) const; TYPE* GetNextElement (POSITION& rPosition) const; TYPE* GetPrevElement (POSITION& rPosition) const; BOOL AvailableElement(POSITION& rPosition) const; /*Element based Iteration*/ TYPE* GetHeadElement (void) const; TYPE* GetTailElement (void) const; TYPE* GetNextElement (TYPE* pElement) const; TYPE* GetPrevElement (TYPE* pElement) const; BOOL AvailableElement(TYPE* pElement) const; }; /*inline functions*/ template inline TYPE* CPA_List::GetAtElement(POSITION& rPosition) const { return rPosition!=NULL ? GetAt(rPosition) : NULL; } template inline TYPE* CPA_List::FindElementFromIndex(int nIndex) const { POSITION Position=FindIndex(nIndex); return GetAtElement(Position); } /*Position based Iteration*/ template inline TYPE* CPA_List::GetHeadElement(POSITION& rPosition) const { rPosition = GetHeadPosition(); return GetAtElement(rPosition); } template inline TYPE* CPA_List::GetTailElement(POSITION& rPosition) const { rPosition = GetTailPosition(); return GetAtElement(rPosition); } template inline TYPE* CPA_List::GetNextElement(POSITION& rPosition) const { if(rPosition) { GetNext(rPosition); return GetAtElement(rPosition); } else return GetHeadElement(rPosition); } template inline TYPE* CPA_List::GetPrevElement(POSITION& rPosition) const { if(rPosition) { GetPrev(rPosition); return GetAtElement(rPosition); } else return GetTailElement(rPosition); } template inline BOOL CPA_List::AvailableElement(POSITION& rPosition) const { return (rPosition != NULL); } /*Element based Iteration*/ template inline TYPE* CPA_List::GetHeadElement(void) const { POSITION Position; return GetHeadElement(Position); } template inline TYPE* CPA_List::GetTailElement(void) const { POSITION Position; return GetTailElement(Position); } template inline TYPE* CPA_List::GetNextElement(TYPE* pElement) const { POSITION Position=NULL; if(!pElement) return GetNextElement(Position);/*return head*/ Position=Find(pElement); return Position?GetNextElement(Position):NULL;/*if not found return NULL*/ } template inline TYPE* CPA_List::GetPrevElement(TYPE* pElement) const { POSITION Position=NULL; if(!pElement) return GetPrevElement(Position);/*return tail*/ Position=Find(pElement); return Position?GetPrevElement(Position):NULL;/*if not found return NULL*/ } template inline BOOL CPA_List::AvailableElement(TYPE* pElement) const { return (pElement != NULL); } #define M_ForAllTheElementsInList(pElement, pListe, Position) \ for \ ( \ pElement=(pListe)->GetHeadElement(Position); \ (pListe)->AvailableElement(Position); \ pElement=(pListe)->GetNextElement(Position) \ ) #endif/*__CPALST_HPP__*/