/* (c) Ubi Studios 1996*/
/* See Vincent Greco for any comment or question*/
 
#ifndef __CPALST_HPP__
#define __CPALST_HPP__
/*#include "stdafx.h"*/
#include "afxtempl.h"
#include "LstDcl.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__*/
 
 
 
 
 
