![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsHEFaceList.hpp 00003 00004 Class HEFaceList is a doubly linked list for HEFace (half-edge node). 00005 00006 SUKITTI PUNAK (04/05/2005) 00007 UPDATE (04/10/2005) 00008 ******************************************************************************/ 00009 #include "TAPsHEFaceList.hpp" 00010 // Using Inclusion Model (i.e. definitions are included in declarations) 00011 // (this name.cpp is included in name.hpp) 00012 // Each friend is defined directly inside its declaration. 00013 00014 BEGIN_NAMESPACE_TAPs 00015 //============================================================================= 00016 // Constructor(s) 00017 //----------------------------------------------------------------------------- 00018 template <typename T> 00019 HEFaceList<T>::HEFaceList () 00020 : m_iLength( 0 ), 00021 pHead( NULL ), pTail( NULL ), pCurrent( NULL ) 00022 {} 00023 //============================================================================= 00024 // Destructor 00025 //----------------------------------------------------------------------------- 00026 template <typename T> 00027 HEFaceList<T>::~HEFaceList () 00028 { 00029 HEFace<T> *tmp; 00030 while ( pHead != NULL ) { 00031 pCurrent = pHead; 00032 tmp = Remove(); 00033 if ( tmp != NULL ) delete tmp; 00034 } 00035 m_iLength = 0; 00036 } 00037 //============================================================================= 00038 // Operations 00039 //----------------------------------------------------------------------------- 00040 // Insert after pCurrent 00041 template <typename T> 00042 void HEFaceList<T>::InsertBefore ( HEFace<T> * const n ) { 00043 // case empty list 00044 if ( pHead == NULL ) { 00045 pCurrent = pHead = pTail = n; 00046 n->Next( NULL ); 00047 n->Prev( NULL ); 00048 ++m_iLength; 00049 } 00050 // case pCurrent == pHead 00051 else if ( pCurrent == pHead ) { 00052 Prepend( n ); 00053 } 00054 // case non-empty list 00055 else { 00056 pCurrent = pCurrent->Prev(); 00057 InsertAfter( n ); 00058 } 00059 } 00060 //----------------------------------------------------------------------------- 00061 // Insert after pCurrent 00062 template <typename T> 00063 void HEFaceList<T>::InsertAfter ( HEFace<T> * const n ) 00064 { 00065 // case empty list 00066 if ( pHead == NULL ) { 00067 pCurrent = pHead = pTail = n; 00068 n->Next( NULL ); 00069 n->Prev( NULL ); 00070 ++m_iLength; 00071 } 00072 // case pCurrent == pTail 00073 else if ( pCurrent == pTail ) { 00074 Append( n ); 00075 //n->Prev( pCurrent ); 00076 //n->Next( NULL ); 00077 //pCurrent->Next( n ); 00078 //pCurrent = pTail = n; 00079 } 00080 // case pCurrent != pTail 00081 else { 00082 n->Prev( pCurrent ); 00083 n->Next( pCurrent->Next() ); 00084 n->Next()->Prev( n ); 00085 pCurrent->Next( n ); 00086 pCurrent = n; 00087 ++m_iLength; 00088 } 00089 } 00090 //----------------------------------------------------------------------------- 00091 // Insert at head 00092 template <typename T> 00093 void HEFaceList<T>::Prepend ( HEFace<T> * const n ) 00094 { 00095 // case empty list 00096 if ( pHead == NULL ) { 00097 pCurrent = pHead = pTail = n; 00098 n->Next( NULL ); 00099 n->Prev( NULL ); 00100 ++m_iLength; 00101 } 00102 // case non-empty list 00103 else { 00104 n->Prev( NULL ); 00105 n->Next( pHead ); 00106 pHead->Prev( n ); 00107 pHead = n; 00108 ++m_iLength; 00109 } 00110 } 00111 //----------------------------------------------------------------------------- 00112 // Insert at tail 00113 template <typename T> 00114 void HEFaceList<T>::Append ( HEFace<T> * const n ) 00115 { 00116 // case empty list 00117 if ( pHead == NULL ) { 00118 pCurrent = pHead = pTail = n; 00119 n->Next( NULL ); 00120 n->Prev( NULL ); 00121 ++m_iLength; 00122 } 00123 // case non-empty list 00124 else { 00125 n->Prev( pTail ); 00126 n->Next( NULL ); 00127 pTail = n; 00128 n->Prev()->Next( n ); 00129 ++m_iLength; 00130 } 00131 } 00132 //----------------------------------------------------------------------------- 00133 // Remove at pCurrent 00134 template <typename T> 00135 HEFace<T> * HEFaceList<T>::Remove () 00136 { 00137 return Remove( pCurrent ); 00138 } 00139 /* 00140 //----------------------------------------------------------------------------- 00141 // Remove this face 00142 template <typename T> 00143 HEFace<T> * HEFaceList<T>::Remove ( HEFace<T> *thisFace ) 00144 { 00145 pCurrent = pHead; 00146 while ( pCurrent != thisFace && pCurrent != NULL ) { 00147 pCurrent = pCurrent->Next(); 00148 } 00149 return Remove(); 00150 } 00151 //*/ 00152 //----------------------------------------------------------------------------- 00153 // Remove this face 00154 template <typename T> 00155 HEFace<T> * HEFaceList<T>::Remove ( HEFace<T> * pFace ) 00156 { 00157 //--------------------------------------------------------------- 00158 // case empty list 00159 if ( pFace == NULL ) return NULL; 00160 //--------------------------------------------------------------- 00161 HEFace<T> *tmp = pFace; 00162 //--------------------------------------------------------------- 00163 // case one element list 00164 if ( pHead == pTail && pFace == pHead ) { 00165 //std::cout << "// case one element list" << std::endl; 00166 pFace = pHead = pTail = NULL; // make list empty 00167 m_iLength = 0; // size is zero 00168 return tmp; 00169 } 00170 //--------------------------------------------------------------- 00171 // case pFace == pHead 00172 else if ( pHead == pFace ) { 00173 //std::cout << "// case pFace == pHead" << std::endl; 00174 pFace = pHead = pHead->Next(); 00175 pHead->Prev( NULL ); 00176 } 00177 //--------------------------------------------------------------- 00178 // case pFace == pTail 00179 else if ( pTail == pFace ) { 00180 //std::cout << "// case pFace == pTail" << std::endl; 00181 pFace = pTail = pTail->Prev(); 00182 pTail->Next( NULL ); 00183 } 00184 //--------------------------------------------------------------- 00185 // case between pHead and pTail 00186 else { 00187 //std::cout << "// case between pHead and pTail" << std::endl; 00188 pFace = pFace->Next(); 00189 tmp->Prev()->Next( pFace ); 00190 pFace->Prev( tmp->Prev() ); 00191 } 00192 //--------------------------------------------------------------- 00193 tmp->Prev( NULL ); 00194 tmp->Next( NULL ); 00195 --m_iLength; 00196 00197 //std::cout << "Size: " << m_iLength << std::endl; 00198 00199 return tmp; 00200 } 00201 //----------------------------------------------------------------------------- 00202 // Delete pVertex 00203 template <typename T> 00204 void HEFaceList<T>::Delete ( HEFace<T> * pFace ) 00205 { 00206 HEFace<T> * removeItem = Remove( pFace ); 00207 if ( removeItem ) delete removeItem; 00208 } 00209 //----------------------------------------------------------------------------- 00210 //============================================================================= 00211 END_NAMESPACE_TAPs 00212 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00213 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8