TAPs 0.7.7.3
TAPsHEFaceList.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines