#pragma once template class CDynamicList; //////////////////////////////////// /// CDynamicNode declaration /// //////////////////////////////////// template class CDynamicNode { friend class CDynamicList; public: CDynamicNode(T *pItem); virtual ~CDynamicNode(void); CDynamicNode *GetNextNode() { return m_pNextNode; } T *GetValue() { return m_pItem; } protected: T *m_pItem; void SetNextNode(CDynamicNode *pNextNode) { m_pNextNode = pNextNode; } CDynamicNode *m_pNextNode; private: CDynamicNode(void) {} }; /////////////////////////////////////// /// CDynamicList implementation /// /////////////////////////////////////// template CDynamicNode::CDynamicNode(T *_pItem) { m_pItem = _pItem; m_pNextNode = NULL; } template CDynamicNode::~CDynamicNode(void) { delete m_pItem; m_pItem = NULL; } //////////////////////////////////// /// CDynamicList declaration /// //////////////////////////////////// template class CDynamicList { public: CDynamicList(void); virtual ~CDynamicList(void); int ListCount() { return m_iItemCount; } int AddItem(T *pNewItem); bool RemoveItem(T *pNewItem); bool RemoveCurrentItem(); void ClearList(); CDynamicNode *SelectFirst(); CDynamicNode *SelectNext(); CDynamicNode *GetCurrent(); T *GetValue(); protected: int m_iItemCount; CDynamicNode *m_pFirst; CDynamicNode *m_pLast; CDynamicNode *m_pCurrent; }; /////////////////////////////////////// /// CDynamicList implementation /// /////////////////////////////////////// template CDynamicList::CDynamicList(void) { m_iItemCount = 0; m_pFirst = NULL; m_pLast = NULL; m_pCurrent = NULL; } template CDynamicList::~CDynamicList(void) { ClearList(); } template int CDynamicList::AddItem(T *_pNewItem) { CDynamicNode *Item = new CDynamicNode(_pNewItem); if (!m_pFirst) m_pFirst = Item; if (!m_pLast) m_pLast = Item; else { m_pLast->SetNextNode(Item); m_pLast = Item; } return ++m_iItemCount; } template bool CDynamicList::RemoveItem(T *_pItem) { bool bRet = false; CDynamicNode *Item, *PrevItem; Item = m_pFirst; if (_pItem) { while (Item) { if (Item->GetValue() == _pItem) { if (Item == m_pFirst) m_pFirst = Item->GetNextNode(); else if (Item == m_pLast) { m_pLast = PrevItem; m_pLast->SetNextNode(NULL); } else PrevItem->SetNextNode(Item->GetNextNode()); delete Item; m_iItemCount--; bRet = true; break; } PrevItem = Item; Item = Item->GetNextNode(); } } return bRet; } template bool CDynamicList::RemoveCurrentItem() { bool bRet = false; if (m_pCurrent) { bRet = RemoveItem(m_pCurrent->GetValue()); if (bRet) m_pCurrent = m_pFirst; } return bRet; } template void CDynamicList::ClearList() { CDynamicNode *Item, *ItemNext = NULL; Item = SelectFirst(); while (Item) { ItemNext = Item->GetNextNode(); delete Item; Item = ItemNext; } m_pFirst = NULL; m_pLast = NULL; m_pCurrent = NULL; m_iItemCount = 0; } template CDynamicNode *CDynamicList::SelectFirst() { m_pCurrent = m_pFirst; return m_pCurrent; } template CDynamicNode *CDynamicList::SelectNext() { if (m_pCurrent) { m_pCurrent = m_pCurrent->GetNextNode(); return m_pCurrent; } else return NULL; } template CDynamicNode *CDynamicList::GetCurrent() { return m_pCurrent; } template T *CDynamicList::GetValue() { if (m_pCurrent) return m_pCurrent->GetValue(); else return NULL; }