// 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 NiTObjectList::~NiTObjectList() { // RemoveAll is called from here because it depends on virtual functions // implemented in NiTAllocatorMap. It will also be called in the // parent destructor, but the map will already be empty. NiTObjectList::RemoveAll(); } //--------------------------------------------------------------------------- template inline T* NiTObjectList::AddNewHead() { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); AddNodeHead(pkNode); return &pkNode->m_element; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::AddNewTail() { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); AddNodeTail(pkNode); return &pkNode->m_element; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::InsertNewBefore(NiTListIterator kPos, NiTListIterator& kNewIterator) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); kNewIterator = AddNodeBefore(kPos,pkNode); return &pkNode->m_element; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::InsertNewAfter(NiTListIterator kPos, NiTListIterator& kNewIterator) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); kNewIterator = AddNodeAfter(kPos,pkNode); return &pkNode->m_element; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::InsertNewBefore(NiTListIterator kPos) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); AddNodeBefore(kPos,pkNode); return &pkNode->m_element; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::InsertNewAfter(NiTListIterator kPos) { NiTListItem* pkNode; pkNode = (NiTListItem*) NewItem(); AddNodeAfter(kPos,pkNode); return &pkNode->m_element; }//--------------------------------------------------------------------------- template inline T* NiTObjectList::GetHead() const { return NiTListBase, T>::m_pkHead ? &NiTListBase, T>::m_pkHead->m_element : NULL; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::GetTail() const { return NiTListBase, T>::m_pkTail ? &NiTListBase, T>::m_pkTail->m_element : NULL; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::GetNext(NiTListIterator& kPos) const { if (kPos == 0) return NULL; T* pkElement = &((NiTListItem*) kPos)->m_element; kPos = ((NiTListItem*) kPos)->m_pkNext; return pkElement; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::GetPrev(NiTListIterator& kPos) const { if (kPos == 0) return NULL; T* pkElement = &((NiTListItem*) kPos)->m_element; kPos = ((NiTListItem*) kPos)->m_pkPrev; return pkElement; } //--------------------------------------------------------------------------- template inline T* NiTObjectList::Get(NiTListIterator kPos) const { if (!kPos) return NULL; return &((NiTListItem*) kPos)->m_element; } //--------------------------------------------------------------------------- template inline void NiTObjectList::RemoveHead() { NIASSERT((NiTListBase, T>::m_pkHead)); NiTListItem* pkNode = NiTListBase, T>::m_pkHead; NiTListBase, T>::m_pkHead = NiTListBase, T>::m_pkHead->m_pkNext; if (NiTListBase, T>::m_pkHead) NiTListBase, T>::m_pkHead->m_pkPrev = 0; else NiTListBase, T>::m_pkTail = 0; DeleteItem(pkNode); NiTListBase, T>::m_kAllocator.m_uiCount--; } //--------------------------------------------------------------------------- template inline void NiTObjectList::RemoveTail() { NIASSERT((NiTListBase, T>::m_pkTail)); NiTListItem* pkNode = NiTListBase, T>::m_pkTail; NiTListBase, T>::m_pkTail = NiTListBase, T>::m_pkTail->m_pkPrev; if (NiTListBase, T>::m_pkTail) NiTListBase, T>::m_pkTail->m_pkNext = 0; else NiTListBase, T>::m_pkHead = 0; DeleteItem(pkNode); NiTListBase, T>::m_kAllocator.m_uiCount--; } //--------------------------------------------------------------------------- template inline void NiTObjectList::RemovePos(NiTListIterator& kPos) { NiTListItem* pkNode = (NiTListItem*) kPos; NIASSERT(pkNode); if (pkNode == NiTListBase, T>::m_pkHead) { kPos = pkNode->m_pkNext; // kPos points to new head RemoveHead(); } else if (pkNode == NiTListBase, T>::m_pkTail) { kPos = 0; // kPos has walked off end of list RemoveTail(); } else { NiTListItem* pkPrev = pkNode->m_pkPrev; NiTListItem* pkNext = pkNode->m_pkNext; kPos = pkNext; if (pkPrev) pkPrev->m_pkNext = pkNext; if (pkNext) pkNext->m_pkPrev = pkPrev; DeleteItem(pkNode); NiTListBase, T>::m_kAllocator.m_uiCount--; } } //--------------------------------------------------------------------------- template inline void NiTObjectList::Remove(const T* element) { NiTListIterator kPos = FindPos(element); if (kPos) RemovePos(kPos); } //--------------------------------------------------------------------------- template inline NiTListIterator NiTObjectList::FindPos(const T* element, NiTListIterator kStart) const { if (kStart == 0) kStart = NiTObjectList::GetHeadPos(); while (kStart) { NiTListIterator kPos = kStart; if (element == GetNext(kStart)) return kPos; } return 0; } //--------------------------------------------------------------------------- template inline NiTListItem* NiTObjectList::NewItem() { return (NiTListItem*)NiTListBase, T>::m_kAllocator.Allocate(); } //--------------------------------------------------------------------------- template inline void NiTObjectList::DeleteItem(NiTListItem* pkItem) { NiTListBase, T>::m_kAllocator.Deallocate(pkItem); } //---------------------------------------------------------------------------