Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
176 additions
and 29 deletions.
- +167 −0 VCS PC/PtrList.h
- +1 −0 VCS PC/VCS PC.vcxproj
- +3 −0 VCS PC/VCS PC.vcxproj.filters
- +2 −2 VCS PC/World.cpp
- +3 −27 VCS PC/World.h
There are no files selected for viewing
| @@ -0,0 +1,167 @@ | ||
| #ifndef __PTRLIST | ||
| #define __PTRLIST | ||
|
|
||
| class CPtrNode | ||
| { | ||
| public: | ||
| void* m_pPtr; | ||
| union | ||
| { | ||
| class CPtrNodeSingleLink* m_psNext; | ||
| class CPtrNodeDoubleLink* m_pdNext; | ||
|
|
||
| class CPtrNode* m_pNext; // for CPtrList methods | ||
| }; | ||
|
|
||
| public: | ||
| CPtrNode(void* pItem) | ||
| : m_pPtr(pItem) | ||
| { | ||
| } | ||
| }; | ||
|
|
||
| class CPtrNodeSingleLink : public CPtrNode | ||
| { | ||
| public: | ||
| CPtrNodeSingleLink(void* pItem) | ||
| : CPtrNode(pItem) | ||
| { | ||
| } | ||
| }; | ||
|
|
||
| class CPtrNodeDoubleLink : public CPtrNode | ||
| { | ||
| public: | ||
| CPtrNodeDoubleLink* m_pdPrev; | ||
|
|
||
| public: | ||
| CPtrNodeDoubleLink(void* pItem) | ||
| : CPtrNode(pItem) | ||
| { | ||
| } | ||
| }; | ||
|
|
||
| class CPtrList | ||
| { | ||
| public: | ||
| union | ||
| { | ||
| CPtrNodeSingleLink* m_psNodes; | ||
| CPtrNodeDoubleLink* m_pdNodes; | ||
|
|
||
| CPtrNode* m_pNodes; // for CPtrList methods | ||
| }; | ||
|
|
||
| bool IsMemberOfList(void* pItem) | ||
| { | ||
| if ( CPtrNode* pCurNode = m_pNodes ) | ||
| { | ||
| while ( pCurNode->m_pPtr != pItem ) | ||
| { | ||
| pCurNode->m_pNext; | ||
| if ( !pCurNode ) | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| return false; | ||
| }; | ||
|
|
||
| int CountElements() | ||
| { | ||
| CPtrNode* pCurMode = m_pNodes; | ||
| int nCount = 0; | ||
|
|
||
| while ( pCurMode ) | ||
| { | ||
| ++nCount; | ||
| pCurMode = pCurMode->m_pNext; | ||
| } | ||
| return nCount; | ||
| }; | ||
| }; | ||
|
|
||
| class CPtrListSingleLink : public CPtrList | ||
| { | ||
| public: | ||
| // TODO: NEEDS NEW/DELETE OVERLOADS & FLUSH METHOD | ||
| CPtrNodeSingleLink* AddItem(void* pItem) | ||
| { | ||
| CPtrNodeSingleLink* pNewLink = new CPtrNodeSingleLink(pItem); | ||
|
|
||
| pNewLink->m_psNext = m_psNodes; | ||
| m_psNodes = pNewLink; | ||
|
|
||
| return pNewLink; | ||
| } | ||
|
|
||
| void DeleteItem(void* pItem) | ||
| { | ||
| CPtrNodeSingleLink* pCurNode = m_psNodes; | ||
| CPtrNodeSingleLink* pPrevNode = nullptr; | ||
|
|
||
| if ( pCurNode ) | ||
| { | ||
| while ( pCurNode->m_pPtr != pItem ) | ||
| { | ||
| pPrevNode = pCurNode; | ||
| pCurNode = pCurNode->m_psNext; | ||
| if ( !pCurNode ) | ||
| return; | ||
| } | ||
|
|
||
| if ( m_psNodes == pCurNode ) | ||
| m_psNodes = pCurNode->m_psNext; | ||
| else if ( pPrevNode ) | ||
| pPrevNode->m_psNext = pCurNode->m_psNext; | ||
|
|
||
| delete pCurNode; | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| class CPtrListDoubleLink : public CPtrList | ||
| { | ||
| public: | ||
| // TODO: NEEDS NEW/DELETE OVERLOADS & FLUSH METHOD | ||
| CPtrNodeDoubleLink* AddItem(void* pItem) | ||
| { | ||
| CPtrNodeDoubleLink* pNewLink = new CPtrNodeDoubleLink(pItem); | ||
|
|
||
| pNewLink->m_pdNext = m_pdNodes; | ||
| pNewLink->m_pdPrev = nullptr; | ||
|
|
||
| if ( m_pdNodes ) | ||
| m_pdNodes->m_pdPrev = pNewLink; | ||
| m_pdNodes = pNewLink; | ||
|
|
||
| return pNewLink; | ||
| } | ||
|
|
||
| void DeleteItem(void* pItem) | ||
| { | ||
| CPtrNodeDoubleLink* pCurNode = m_pdNodes; | ||
|
|
||
| if ( pCurNode ) | ||
| { | ||
| while ( pCurNode->m_pPtr != pItem ) | ||
| { | ||
| pCurNode = pCurNode->m_pdNext; | ||
| if ( !pCurNode ) | ||
| return; | ||
| } | ||
|
|
||
| if ( m_pdNodes == pCurNode ) | ||
| m_pdNodes = pCurNode->m_pdNext; | ||
| if ( pCurNode->m_pdPrev ) | ||
| pCurNode->m_pdPrev->m_pdNext = pCurNode->m_pdNext; | ||
| if ( pCurNode->m_pdNext ) | ||
| pCurNode->m_pdNext->m_pdPrev = pCurNode->m_pdPrev; | ||
|
|
||
| delete pCurNode; | ||
| } | ||
| } | ||
| }; | ||
|
|
||
|
|
||
| #endif |