// 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 //--------------------------------------------------------------------------- // NiTQueue inline functions //--------------------------------------------------------------------------- template inline NiTQueue::NiTQueue(unsigned int uiInitialSize) { NIASSERT(uiInitialSize > 0); m_pBase = TAlloc::Allocate(uiInitialSize); NIASSERT(m_pBase != NULL); m_uiAlloced = uiInitialSize; m_uiHead = UINT_MAX; m_uiTail = 0; } //--------------------------------------------------------------------------- template inline NiTQueue::~NiTQueue() { while (!IsEmpty()) Remove(); TAlloc::Deallocate(m_pBase); } //--------------------------------------------------------------------------- template inline bool NiTQueue::IsEmpty() const { return (m_uiHead == UINT_MAX); } //--------------------------------------------------------------------------- template inline bool NiTQueue::IsFull() const { return (m_uiHead == m_uiTail); } //--------------------------------------------------------------------------- template inline T NiTQueue::Head() const { NIASSERT(!IsEmpty()); return m_pBase[m_uiHead]; } //--------------------------------------------------------------------------- template inline T NiTQueue::Remove() { if (IsEmpty()) return 0; T element; element = m_pBase[m_uiHead]; m_pBase[m_uiHead] = 0; if (++m_uiHead == m_uiAlloced) { m_uiHead = 0; } if (m_uiHead == m_uiTail) { m_uiHead = UINT_MAX; m_uiTail = 0; } return element; } //--------------------------------------------------------------------------- template inline void NiTQueue::Add(T element) { if (IsEmpty()) { m_pBase[m_uiHead = 0] = element; m_uiTail = 1; } else { if (IsFull()) { Realloc(2 * m_uiAlloced); } m_pBase[m_uiTail++] = element; } if (m_uiTail == m_uiAlloced) { m_uiTail = 0; } } //--------------------------------------------------------------------------- template inline void NiTQueue::AddUnique(T element) { unsigned int i; if (!IsEmpty()) { if (m_uiHead >= m_uiTail) { for (i = m_uiHead; i < m_uiAlloced; i++) { if (m_pBase[i] == element) return; } for (i = 0; i < m_uiTail; i++) { if (m_pBase[i] == element) return; } } else { for (i = m_uiHead; i < m_uiTail; i++) { if (m_pBase[i] == element) return; } } } Add(element); } //--------------------------------------------------------------------------- template inline unsigned int NiTQueue::GetSize() const { if (IsEmpty()) { return 0; } else if (m_uiHead >= m_uiTail) { return m_uiAlloced - m_uiHead + m_uiTail; } else { return m_uiTail - m_uiHead; } } //--------------------------------------------------------------------------- template inline void NiTQueue::Realloc() { Realloc(GetSize()); } //--------------------------------------------------------------------------- template inline void NiTQueue::Realloc(unsigned int uiNewSize) { T *pNewBase; unsigned int i, j; if (uiNewSize == 0) return; NIASSERT(uiNewSize >= GetSize()); pNewBase = TAlloc::Allocate(uiNewSize); NIASSERT(pNewBase != NULL); j = 0; if (m_uiHead >= m_uiTail) { for (i = m_uiHead; i < m_uiAlloced; i++) { pNewBase[j++] = m_pBase[i]; } for (i = 0; i < m_uiTail; i++) { pNewBase[j++] = m_pBase[i]; } } else { for (i = m_uiHead; i < m_uiTail; i++) { pNewBase[j++] = m_pBase[i]; } } NIASSERT(j == GetSize()); m_uiHead = 0; m_uiTail = j; m_uiAlloced = uiNewSize; TAlloc::Deallocate(m_pBase); m_pBase = pNewBase; } //--------------------------------------------------------------------------- template inline NiTObjectQueue::NiTObjectQueue(unsigned int uiInitialSize) : NiTQueue >(uiInitialSize) { } //--------------------------------------------------------------------------- template inline NiTPrimitiveQueue::NiTPrimitiveQueue(unsigned int uiInitialSize) : NiTQueue >(uiInitialSize) { } //---------------------------------------------------------------------------