// 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-2008 Emergent Game Technologies. // All Rights Reserved. // // Emergent Game Technologies, Chapel Hill, North Carolina 27517 // http://www.emergent.net #ifndef NITPTRSET_H #define NITPTRSET_H #include // This template class implements an unordered set. It is safe for smart // pointer use. template class NiTPtrSet : public NiTSet { public: inline NiTPtrSet(unsigned int uiInitialSize = 1); inline ~NiTPtrSet(); inline void RemoveAt(unsigned int uiIndex); inline void OrderedRemoveAt(unsigned int uiIndex); // Preserve order. inline void RemoveAll(); private: // To prevent an application from inadvertently causing the compiler to // generate the default copy constructor or default assignment operator, // these methods are declared as private. They are not defined anywhere, // so code that attempts to use them will not link. NiTPtrSet(const NiTPtrSet&); NiTPtrSet& operator=(const NiTPtrSet&); }; template class NiTObjectPtrSet: public NiTPtrSet > { public: inline NiTObjectPtrSet(unsigned int uiInitialSize = 0); }; template class NiTPrimitivePtrSet: public NiTPtrSet > { public: inline NiTPrimitivePtrSet(unsigned int uiInitialSize = 0); }; //--------------------------------------------------------------------------- template inline NiTObjectPtrSet::NiTObjectPtrSet(unsigned int uiInitialSize) : NiTPtrSet >(uiInitialSize) { } //--------------------------------------------------------------------------- template inline NiTPrimitivePtrSet::NiTPrimitivePtrSet(unsigned int uiInitialSize): NiTPtrSet >(uiInitialSize) { } //--------------------------------------------------------------------------- template inline NiTPtrSet::NiTPtrSet(unsigned int uiInitialSize) : NiTSet(uiInitialSize) { } //--------------------------------------------------------------------------- template inline NiTPtrSet::~NiTPtrSet() { RemoveAll(); } //--------------------------------------------------------------------------- template inline void NiTPtrSet::RemoveAt(unsigned int uiIndex) { NIASSERT((uiIndex < NiTSet::m_uiUsed)); NiTSet::m_pBase[uiIndex] = NiTSet::m_pBase[--NiTSet::m_uiUsed]; NiTSet::m_pBase[NiTSet::m_uiUsed] = 0; } //--------------------------------------------------------------------------- template inline void NiTPtrSet::OrderedRemoveAt(unsigned int uiIndex) { NIASSERT((uiIndex < NiTSet::m_uiUsed)); for (unsigned int ui = uiIndex; ui < NiTSet::m_uiUsed - 1; ui++) { NiTSet::m_pBase[ui] = NiTSet::m_pBase[ui + 1]; } NiTSet::m_uiUsed--; NiTSet::m_pBase[NiTSet::m_uiUsed] = 0; } //--------------------------------------------------------------------------- template inline void NiTPtrSet::RemoveAll() { for (unsigned int ui = 0; ui < NiTSet::m_uiUsed; ui++) { NiTSet::m_pBase[ui] = 0; } NiTSet::m_uiUsed = 0; } //--------------------------------------------------------------------------- #endif // #ifndef NITPTRSET_H