#include "ptrlist.h" CPtrList::CPtrList() { Initialize(); } CPtrList::CPtrList(const CPtrList& list) { Initialize(); CreateLocalCopy(list.m_pHead); } const CPtrList& CPtrList::operator=(const CPtrList& right) { if (&right != this) { RemoveAll(); Initialize(); CreateLocalCopy(right.m_pHead); } return *this; } void CPtrList::Initialize() { m_pHead = NULL; m_pTail = NULL; m_dwCount = 0; } CPtrList::~CPtrList() { RemoveAll(); } void CPtrList::CreateLocalCopy(const _DATALISTELEMENT* pHead) { void* pData = NULL; _DATALISTELEMENT* pNode = NULL; RemoveAll(); if (!pHead) { return; } if (pHead->pData) { AddTail(pHead->pData); } pNode = pHead->pNext; while (pNode) { pData = pNode->pData; if (pData) { AddTail(pData); } pNode = pNode->pNext; } } DWORD CPtrList::GetCount() const { return m_dwCount; } POSITION CPtrList::GetHeadPosition() const { return (POSITION) m_pHead; } void* CPtrList::GetNext(POSITION& rPosition) const { _DATALISTELEMENT* pNode = (_DATALISTELEMENT*) rPosition; if (!pNode) { return NULL; } rPosition = (POSITION) pNode->pNext; return pNode->pData; } void* CPtrList::GetAt(POSITION position) const { _DATALISTELEMENT* pNode = (_DATALISTELEMENT*) position; if (!pNode) { return NULL; } return pNode->pData; } POSITION CPtrList::Find(void* p, POSITION startAfter /* = NULL */) const { _DATALISTELEMENT* pNode = (_DATALISTELEMENT*) startAfter; if (pNode == NULL) { pNode = m_pHead; } else { pNode = pNode->pNext; // start after the one specified } while (pNode != NULL) { if (p == pNode->pData) { return (POSITION) pNode; } pNode = pNode->pNext; } return NULL; } POSITION CPtrList::FindIndex(DWORD dwIndex) const { if (dwIndex >= m_dwCount) { return NULL; } _DATALISTELEMENT* pNode = m_pHead; while (dwIndex--) { pNode = pNode->pNext; } return (POSITION) pNode; } void CPtrList::RemoveAt(POSITION position) { _DATALISTELEMENT* pOldNode = (_DATALISTELEMENT*) position; if (!pOldNode) { return; } if (pOldNode == m_pHead) { m_pHead = pOldNode->pNext; } else { pOldNode->pPrev->pNext = pOldNode->pNext; } if (pOldNode == m_pTail) { m_pTail = pOldNode->pPrev; } else { pOldNode->pNext->pPrev = pOldNode->pPrev; } FreeNode(pOldNode); } void CPtrList::RemoveAll() { _DATALISTELEMENT* pNode = NULL; _DATALISTELEMENT* pNext = NULL; pNode = m_pHead; while (pNode) { pNext = pNode->pNext; FreeNode(pNode); pNode = pNext; } m_pHead = NULL; m_pTail = NULL; m_dwCount = 0; } void CPtrList::FreeNode(_DATALISTELEMENT* pNode) { if ((pNode == NULL) || (m_dwCount == 0)) { return; } delete pNode; m_dwCount--; } void CPtrList::AddTail(void* p) { _DATALISTELEMENT* pNode = NULL; _DATALISTELEMENT* pPrevious = NULL; pNode = new _DATALISTELEMENT; if (pNode) { pNode->pData = p; pNode->pNext = NULL; if (m_pTail) { pNode->pPrev = m_pTail; m_pTail->pNext = pNode; } else { pNode->pPrev = NULL; m_pHead = pNode; } m_dwCount++; m_pTail = pNode; } }