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__
1.5.1-p1