D:/Zythum/DinoKod/Common/List.h

00001 #ifndef __LIST_H__
00002 #define __LIST_H__
00003 
00004 #include "Common/CommonDll.h"
00005 //#include <list>
00006 #include "Common/Assert.h"
00007 #include "Common/Types.h"
00008 
00009 #pragma warning( disable : 4251 )
00010 
00011 /*using namespace std;
00012 
00013 //---------------------------------------------------------------------------------------------------------------------
00014 template <class TYPE>
00015 class KList
00016 {
00017 protected:
00018         list<TYPE>              m_List;
00019 
00020 public:
00021                                         KList()                                 {}
00022 //                                      ~KList()                                { KASSERT( m_List.empty() );                                            }
00023 
00024         void                    Clear()                                 { m_List.clear();                                                               }
00025         void                    Add( TYPE pData )               { m_List.push_back( pData );                                    }
00026         void                    Remove( TYPE pData )    { m_List.remove( pData );                                               }
00027         u32                             GetSize()                               { return (u32)m_List.size();                                    }
00028 
00029         TYPE                    GetFirst()                              { return GetSize() ? *m_List.begin() : NULL;    }
00030         TYPE                    GetNext( TYPE pData )
00031         {
00032                 list<TYPE>::iterator    i;
00033 
00034                 for(i = m_List.begin();i != m_List.end();++i)
00035                 {
00036                         if( *i == pData )
00037                         {
00038                                 i++;
00039                                 if( i == m_List.end() )
00040                                         return NULL;
00041 
00042                                 return *i;
00043                         }
00044                 }
00045                 return NULL;
00046         }
00047         TYPE                    GetLast()                               { return GetSize() ? *m_List.end() : NULL;              }
00048 };
00049 */
00050 //---------------------------------------------------------------------------------------------------------------------
00051 class /*COMMON_API*/ KListElement
00052 {
00053 public:
00054         void*                   m_pElement;
00055         KListElement*   m_pPrev;
00056         KListElement*   m_pNext;
00057 };
00058 
00059 
00060 template <class TYPE>
00061 class /*COMMON_API*/ KList
00062 {
00063 protected:
00064         KListElement*   m_pCurrElement;
00065         KListElement*   m_pHead;
00066         KListElement*   m_pTail;
00067         u32                             m_Size;
00068 
00069 public:
00070         KList()
00071         {
00072                 m_pCurrElement  = NULL;
00073                 m_pHead                 = NULL;
00074                 m_pTail                 = NULL;
00075                 m_Size                  = 0;
00076         }
00077 
00078         ~KList()
00079         {
00080                 KASSERT( m_Size == 0 );
00081         }
00082 
00083         // Efface tout les élements
00084         void                    Clear()
00085         {
00086                 KListElement*   pElement = m_pHead;
00087                 KListElement*   pNext;
00088 
00089                 while( pElement )
00090                 {
00091                         pNext = pElement->m_pNext;
00092                         SafeDeletep( pElement );
00093                         pElement = pNext;
00094                 }
00095 
00096                 m_pHead                 = NULL;
00097                 m_pTail                 = NULL;
00098                 m_pCurrElement  = NULL;
00099                 m_Size                  = 0;
00100         }
00101 
00102         // Ajoute un nouvel élement en queue de liste
00103         void                    Add( TYPE pData )
00104         {
00105                 KListElement*   pElement = new KListElement();
00106                 pElement->m_pElement    = (void*)pData;
00107                 pElement->m_pPrev               = m_pTail;
00108                 pElement->m_pNext               = NULL;
00109                 if( m_pTail )
00110                         m_pTail->m_pNext        = pElement;
00111 
00112                 m_pTail                                 = pElement;
00113 
00114                 if( !m_pHead )
00115                         m_pHead = pElement;
00116 
00117                 m_Size ++;
00118         }
00119 
00120         // Retire l'élément de la liste
00121         void                    Remove( TYPE pData )
00122         {
00123                 KListElement*   pElement = m_pHead;
00124 
00125                 while( pElement )
00126                 {
00127                         if( pElement->m_pElement == (void*)pData )
00128                         {
00129                                 if( pElement->m_pPrev )
00130                                         pElement->m_pPrev->m_pNext = pElement->m_pNext;
00131                                 else
00132                                         m_pHead = pElement->m_pNext;
00133 
00134                                 if( pElement->m_pNext )
00135                                         pElement->m_pNext->m_pPrev = pElement->m_pPrev;
00136                                 else
00137                                         m_pTail = pElement->m_pPrev;
00138 
00139                                 SafeDeletep( pElement );
00140 
00141                                 m_Size --;
00142 
00143                                 return;
00144                         }
00145                         pElement = pElement->m_pNext;
00146                 }
00147         }
00148 
00149         u32                             GetSize()                               { return m_Size;        }
00150 
00151         TYPE                    GetFirst()
00152         {
00153                 // Garde le pointeur de début en cache
00154                 m_pCurrElement = m_pHead;
00155                 // Retourne le premier élement
00156                 return (m_pHead ? (TYPE)m_pHead->m_pElement : (TYPE)NULL);
00157         }
00158 
00159         TYPE                    GetLast()
00160         {
00161                 // Garde le pointeur de fin en cache
00162                 m_pCurrElement = m_pTail;
00163                 // Retourne le dernier élément
00164                 return (m_pTail ? (TYPE)m_pTail->m_pElement : (TYPE)NULL);
00165         }
00166 
00167         TYPE                    GetNext( TYPE pData )
00168         {
00169                 KListElement*   pElement = m_pHead;
00170 
00171                 // Vérifie si le pointeur en cache est le bon
00172                 if( m_pCurrElement && m_pCurrElement->m_pElement && (m_pCurrElement->m_pElement == (void*)pData ) )
00173                 {
00174                         m_pCurrElement = m_pCurrElement->m_pNext;
00175                         return (m_pCurrElement ? (TYPE)m_pCurrElement->m_pElement : (TYPE)NULL);
00176                 }
00177 
00178                 // Recherche l'élement
00179                 while( pElement )
00180                 {
00181                         if( pElement->m_pElement == (void*)pData )
00182                         {
00183                                 m_pCurrElement = pElement;
00184                                 return (pElement->m_pNext ? (TYPE)pElement->m_pNext->m_pElement : (TYPE)NULL);
00185                         }
00186 
00187                         pElement = pElement->m_pNext;
00188                 }
00189                 return (TYPE)NULL;
00190         }
00191 
00192         TYPE                    GetPosition( u32 Position )
00193         {
00194                 TYPE    Element = GetFirst();
00195 
00196                 while( Position -- )
00197                 {
00198                         Element = GetNext( Element );
00199                 }
00200 
00201                 return Element;
00202         }
00203 };
00204 
00205 #endif //       __LIST_H__

Generated on Sun Mar 25 20:02:10 2007 for Zythum Project by  doxygen 1.5.1-p1