reman3/Rayman_X/cpa/public/LST/CpaList.hpp

164 lines
3.6 KiB
C++

/* (c) Ubi Studios 1996*/
/* See Vincent Greco for any comment or question*/
#ifndef __CPALST_HPP__
#define __CPALST_HPP__
#include "afxtempl.h"
template<class TYPE>
class CPA_List : public CList<TYPE*, TYPE*>
{
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<class TYPE>
inline TYPE* CPA_List<TYPE>::GetAtElement(POSITION& rPosition) const
{
return rPosition!=NULL ? GetAt(rPosition) : NULL;
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::FindElementFromIndex(int nIndex) const
{
POSITION Position=FindIndex(nIndex);
return GetAtElement(Position);
}
/*Position based Iteration*/
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetHeadElement(POSITION& rPosition) const
{
rPosition = GetHeadPosition();
return GetAtElement(rPosition);
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetTailElement(POSITION& rPosition) const
{
rPosition = GetTailPosition();
return GetAtElement(rPosition);
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetNextElement(POSITION& rPosition) const
{
if(rPosition)
{
GetNext(rPosition);
return GetAtElement(rPosition);
}
else
return GetHeadElement(rPosition);
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetPrevElement(POSITION& rPosition) const
{
if(rPosition)
{
GetPrev(rPosition);
return GetAtElement(rPosition);
}
else
return GetTailElement(rPosition);
}
template<class TYPE>
inline BOOL CPA_List<TYPE>::AvailableElement(POSITION& rPosition) const
{
return (rPosition != NULL);
}
/*Element based Iteration*/
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetHeadElement(void) const
{
POSITION Position;
return GetHeadElement(Position);
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::GetTailElement(void) const
{
POSITION Position;
return GetTailElement(Position);
}
template<class TYPE>
inline TYPE* CPA_List<TYPE>::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<class TYPE>
inline TYPE* CPA_List<TYPE>::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<class TYPE>
inline BOOL CPA_List<TYPE>::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__*/