// EMERGENT GAME TECHNOLOGIES PROPRIETARY INFORMATION // // This software is supplied under the terms of a license agreement or // nondisclosure agreement with Emergent Game Technologies and may not // be copied or disclosed except in accordance with the terms of that // agreement. // // Copyright (c) 1996-2007 Emergent Game Technologies. // All Rights Reserved. // // Emergent Game Technologies, Chapel Hill, North Carolina 27517 // http://www.emergent.net //--------------------------------------------------------------------------- template inline NiTPointerListBase::~NiTPointerListBase() { // RemoveAll is called from here because it depends on virtual functions // implemented in the derived class. // It will also be called in the parent destructor, // but the map will already be empty. NiTPointerListBase::RemoveAll(); } //--------------------------------------------------------------------------- template inline NiTListItem* NiTPointerListBase::NewItem() { return (NiTListItem*)NiTListBase::m_kAllocator.Allocate(); } //--------------------------------------------------------------------------- template inline void NiTPointerListBase::DeleteItem(NiTListItem* pkItem) { pkItem->m_element = 0; NiTListBase::m_kAllocator.Deallocate(pkItem); } //--------------------------------------------------------------------------- template inline const T& NiTPointerListBase::GetHead() const { return NiTListBase::m_pkHead->m_element; } //--------------------------------------------------------------------------- template inline const T& NiTPointerListBase::GetTail() const { return NiTListBase::m_pkTail->m_element; } //--------------------------------------------------------------------------- template inline const T& NiTPointerListBase::GetNext(NiTListIterator& kPos) const { NIASSERT(kPos != 0); const T& element= ((NiTListItem*) kPos)->m_element; kPos = ((NiTListItem*) kPos)->m_pkNext; return element; } //--------------------------------------------------------------------------- template inline const T& NiTPointerListBase::GetPrev(NiTListIterator& kPos) const { NIASSERT(kPos != 0); const T& element= ((NiTListItem*) kPos)->m_element; kPos = ((NiTListItem*) kPos)->m_pkPrev; return element; } //--------------------------------------------------------------------------- template inline const T& NiTPointerListBase::Get(NiTListIterator kPos) const { NIASSERT(kPos != 0); return ((NiTListItem*) kPos)->m_element; } //--------------------------------------------------------------------------- template inline T NiTPointerListBase::RemoveHead() { NIASSERT((NiTListBase::m_pkHead)); NiTListItem* pkNode = NiTListBase::m_pkHead; NiTListBase::m_pkHead = NiTListBase::m_pkHead->m_pkNext; if (NiTListBase::m_pkHead) NiTListBase::m_pkHead->m_pkPrev = 0; else NiTListBase::m_pkTail = 0; T element = pkNode->m_element; DeleteItem(pkNode); NiTListBase::m_kAllocator.m_uiCount--; return element; } //--------------------------------------------------------------------------- template inline T NiTPointerListBase::RemoveTail() { NIASSERT((NiTListBase::m_pkTail)); NiTListItem* pkNode = NiTListBase::m_pkTail; NiTListBase::m_pkTail = NiTListBase::m_pkTail->m_pkPrev; if (NiTListBase::m_pkTail) NiTListBase::m_pkTail->m_pkNext = 0; else NiTListBase::m_pkHead = 0; T element = pkNode->m_element; DeleteItem(pkNode); NiTListBase::m_kAllocator.m_uiCount--; return element; } //--------------------------------------------------------------------------- template inline T NiTPointerListBase::RemovePos(NiTListIterator& kPos) { NiTListItem* pkNode = (NiTListItem*) kPos; NIASSERT(pkNode); if (pkNode == NiTListBase::m_pkHead) { kPos = pkNode->m_pkNext; // kPos points to new head return RemoveHead(); } if (pkNode == NiTListBase::m_pkTail) { kPos = 0; // kPos has walked off end of list return RemoveTail(); } NiTListItem* pkPrev = pkNode->m_pkPrev; NiTListItem* pkNext = pkNode->m_pkNext; kPos = pkNext; if (pkPrev) pkPrev->m_pkNext = pkNext; if (pkNext) pkNext->m_pkPrev = pkPrev; T element = pkNode->m_element; DeleteItem(pkNode); NiTListBase::m_kAllocator.m_uiCount--; return element; } //--------------------------------------------------------------------------- template inline NiTListIterator NiTPointerListBase:: InsertAfter(NiTListIterator kPos, const T& element) { NIASSERT(kPos); NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); pkNode->m_element = element; return AddNodeAfter(kPos,pkNode); } //--------------------------------------------------------------------------- template inline NiTListIterator NiTPointerListBase:: InsertBefore(NiTListIterator kPos, const T& element) { NIASSERT(kPos); NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); pkNode->m_element = element; return AddNodeBefore(kPos,pkNode); } //--------------------------------------------------------------------------- template inline void NiTPointerListBase::AddHead(const T& element) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); pkNode->m_element = element; AddNodeHead(pkNode); } //--------------------------------------------------------------------------- template inline void NiTPointerListBase::AddTail(const T& element) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); pkNode->m_element = element; AddNodeTail(pkNode); } //--------------------------------------------------------------------------- template inline T NiTPointerListBase::Remove(const T& element) { NiTListIterator kPos = NiTPointerListBase::FindPos( element); return kPos ? RemovePos(kPos) : element; } //--------------------------------------------------------------------------- template inline NiTListIterator NiTPointerListBase:: FindPos(const T& element, NiTListIterator kStart) const { if (kStart == 0) kStart = NiTPointerListBase::GetHeadPos(); while (kStart) { NiTListIterator kPos = kStart; if (element == GetNext(kStart)) return kPos; } return 0; } //---------------------------------------------------------------------------