17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!****************************************************************************
27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @file         PVRTArray.h
47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @copyright    Copyright (c) Imagination Technologies Limited.
57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief        Expanding array template class. Allows appending and direct
67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens               access. Mixing access methods should be approached with caution.
77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifndef __PVRTARRAY_H__
107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define __PVRTARRAY_H__
117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTGlobal.h"
137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTError.h"
147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************
167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens**  Classes
177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @class       CPVRTArray
217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief       Expanding array template class.
227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenstemplate<typename T>
247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensclass CPVRTArray
257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenspublic:
277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief     Blank constructor. Makes a default sized array.
297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray() : m_uiSize(0), m_uiCapacity(GetDefaultSize())
317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray = new T[m_uiCapacity];
337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief  	Constructor taking initial size of array in elements.
377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiSize	intial size of array
387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray(const unsigned int uiSize) : m_uiSize(0), m_uiCapacity(uiSize)
407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiSize != 0);
427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray = new T[uiSize];
437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Copy constructor.
477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	original	the other dynamic array
487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray(const CPVRTArray& original) : m_uiSize(original.m_uiSize),
507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens											  m_uiCapacity(original.m_uiCapacity)
517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray = new T[m_uiCapacity];
537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int i=0;i<m_uiSize;i++)
547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pArray[i]=original.m_pArray[i];
567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      constructor from ordinary array.
617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	pArray		an ordinary array
627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiSize		number of elements passed
637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray(const T* const pArray, const unsigned int uiSize) : m_uiSize(uiSize),
657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens														  m_uiCapacity(uiSize)
667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiSize != 0);
687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray = new T[uiSize];
697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int i=0;i<m_uiSize;i++)
707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pArray[i]=pArray[i];
727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      constructor from a capacity and initial value.
777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiSize		initial capacity
787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	val			value to populate with
797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray(const unsigned int uiSize, const T& val)	: m_uiSize(uiSize),
817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens														m_uiCapacity(uiSize)
827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiSize != 0);
847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray = new T[uiSize];
857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int uiIndex = 0; uiIndex < m_uiSize; ++uiIndex)
867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pArray[uiIndex] = val;
887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Destructor.
937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	virtual ~CPVRTArray()
957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pArray)
977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			delete [] m_pArray;
987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Inserts an element into the array, expanding it
1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if necessary.
1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	pos		The position to insert the new element at
1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	addT	The element to insert
1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	The index of the new item or -1 on failure.
1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int Insert(const unsigned int pos, const T& addT)
1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiIndex = pos;
1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pos >= m_uiSize) // Are we adding to the end
1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			uiIndex = Append(addT);
1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			unsigned int uiNewCapacity = 0;
1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			T* pArray = m_pArray;
1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_uiSize > m_uiCapacity)
1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				uiNewCapacity = m_uiCapacity + 10;	// Expand the array by 10.
1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pArray = new T[uiNewCapacity];		// New Array
1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(!pArray)
1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					return -1;						// Failed to allocate memory!
1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				// Copy the first half to the new array
1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				for(unsigned int i = 0; i < pos; ++i)
1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					pArray[i] = m_pArray[i];
1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Copy last half to the new array
1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(unsigned int i = m_uiSize; i > pos; --i)
1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pArray[i] = m_pArray[i - 1];
1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Insert our new element
1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			pArray[pos] = addT;
1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			uiIndex = pos;
1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Increase our size
1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			++m_uiSize;
1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Switch pointers and free memory if needed
1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(pArray != m_pArray)
1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				m_uiCapacity = uiNewCapacity;
1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				delete[] m_pArray;
1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				m_pArray = pArray;
1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return uiIndex;
1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Appends an element to the end of the array, expanding it
1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if necessary.
1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	addT	The element to append
1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	The index of the new item.
1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int Append(const T& addT)
1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiIndex = Append();
1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray[uiIndex] = addT;
1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return uiIndex;
1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Creates space for a new item, but doesn't add. Instead
1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				returns the index of the new item.
1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	The index of the new item.
1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int Append()
1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiIndex = m_uiSize;
1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		SetCapacity(m_uiSize+1);
1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_uiSize++;
1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return uiIndex;
1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Clears the array.
1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	void Clear()
1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_uiSize = 0U;
1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Changes the array to the new size
1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiSize		New size of array
1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	EPVRTError Resize(const unsigned int uiSize)
1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		EPVRTError err = SetCapacity(uiSize);
2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(err != PVR_SUCCESS)
2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return err;
2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_uiSize = uiSize;
2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_SUCCESS;
2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Expands array to new capacity
2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiSize		New capacity of array
2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	EPVRTError SetCapacity(const unsigned int uiSize)
2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiSize <= m_uiCapacity)
2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_SUCCESS;	// nothing to be done
2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiNewCapacity;
2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiSize < m_uiCapacity*2)
2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			uiNewCapacity = m_uiCapacity*2;			// Ignore the new size. Expand to twice the previous size.
2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			uiNewCapacity = uiSize;
2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		T* pNewArray = new T[uiNewCapacity];		// New Array
2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!pNewArray)
2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;						// Failed to allocate memory!
2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Copy source data to new array
2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int i = 0; i < m_uiSize; ++i)
2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			pNewArray[i] = m_pArray[i];
2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Switch pointers and free memory
2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_uiCapacity	= uiNewCapacity;
2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		T* pOldArray	= m_pArray;
2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pArray		= pNewArray;
2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		delete [] pOldArray;
2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_SUCCESS;
2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@fn     	Copy
2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      A copy function. Will attempt to copy from other CPVRTArrays
2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if this is possible.
2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	other	The CPVRTArray needing copied
2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	template<typename T2>
2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	void Copy(const CPVRTArray<T2>& other)
2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		T* pNewArray = new T[other.GetCapacity()];
2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pNewArray)
2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Copy data
2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(unsigned int i = 0; i < other.GetSize(); i++)
2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pNewArray[i] = other[i];
2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
2637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Free current array
2657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pArray)
2667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				delete [] m_pArray;
2677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Swap pointers
2697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pArray		= pNewArray;
2707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_uiCapacity	= other.GetCapacity();
2727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_uiSize		= other.GetSize();
2737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      assignment operator.
2787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	other	The CPVRTArray needing copied
2797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
2807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray& operator=(const CPVRTArray<T>& other)
2817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(&other != this)
2837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			Copy(other);
2847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
2867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      appends an existing CPVRTArray on to this one.
2907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	other		the array to append.
2917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
2927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray& operator+=(const CPVRTArray<T>& other)
2937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(&other != this)
2957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(unsigned int uiIndex = 0; uiIndex < other.GetSize(); ++uiIndex)
2977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				Append(other[uiIndex]);
2997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
3037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Indexed access into array. Note that this has no error
3077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				checking whatsoever
3087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiIndex	index of element in array
3097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	the element indexed
3107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	T& operator[](const unsigned int uiIndex)
3127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiIndex < m_uiCapacity);
3147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return m_pArray[uiIndex];
3157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Indexed access into array. Note that this has no error checking whatsoever
3197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiIndex	    index of element in array
3207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	The element indexed
3217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const T& operator[](const unsigned int uiIndex) const
3237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiIndex < m_uiCapacity);
3257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return m_pArray[uiIndex];
3267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	Size of array
3307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Gives current size of array/number of elements
3317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int GetSize() const
3337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return m_uiSize;
3357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Gives the default size of array/number of elements
3397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	Default size of array
3407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static unsigned int GetDefaultSize()
3427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return 16U;
3447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Gives current allocated size of array/number of elements
3487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	Capacity of array
3497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int GetCapacity() const
3517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return m_uiCapacity;
3537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Indicates whether the given object resides inside the array.
3577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	object		The object to check in the array
3587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	true if object is contained in this array.
3597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool Contains(const T& object) const
3617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int uiIndex = 0; uiIndex < m_uiSize; ++uiIndex)
3637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pArray[uiIndex] == object)
3657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return true;
3667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return false;
3687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief     	Attempts to find the object in the array and returns a
3727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pointer if it is found, or NULL if not found. The time
3737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				taken is O(N).
3747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	object		The object to check in the array
3757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	Pointer to the found object or NULL.
3767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	T* Find(const T& object) const
3787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int uiIndex = 0; uiIndex < m_uiSize; ++uiIndex)
3807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pArray[uiIndex] == object)
3827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return &m_pArray[uiIndex];
3837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return NULL;
3857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Simple bubble-sort of the array. Pred should be an object that
3897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				defines a bool operator().
3907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	predicate		The object which defines "bool operator()"
3917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
3927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	template<class Pred>
3937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	void Sort(Pred predicate)
3947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bSwap;
3967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(unsigned int i=0; i < m_uiSize; ++i)
3977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bSwap = false;
3997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(unsigned int j=0; j < m_uiSize-1; ++j)
4007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
4017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(predicate(m_pArray[j], m_pArray[j+1]))
4027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
4037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					PVRTswap(m_pArray[j], m_pArray[j+1]);
4047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					bSwap = true;
4057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
4067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
4077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bSwap)
4097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return;
4107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
4147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Removes an element from the array.
4157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiIndex		The index to remove
4167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	success or failure
4177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
4187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	virtual EPVRTError Remove(unsigned int uiIndex)
4197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiIndex < m_uiSize);
4217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_uiSize == 0)
4227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
4237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiIndex == m_uiSize-1)
4257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
4267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return RemoveLast();
4277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        m_uiSize--;
4307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        // Copy the data. memmove will only work for built-in types.
4317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        for(unsigned int uiNewIdx = uiIndex; uiNewIdx < m_uiSize; ++uiNewIdx)
4327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        {
4337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            m_pArray[uiNewIdx] = m_pArray[uiNewIdx+1];
4347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        }
4357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_SUCCESS;
4377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
4407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief    	Removes the last element. Simply decrements the size value
4417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	success or failure
4427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
4437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	virtual EPVRTError RemoveLast()
4447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_uiSize > 0)
4467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
4477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_uiSize--;
4487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_SUCCESS;
4497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
4517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
4527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
4537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensprotected:
4577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int 	m_uiSize;		/*!< Current size of contents of array */
4587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int	m_uiCapacity;	/*!< Currently allocated size of array */
4597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	T				*m_pArray;		/*!< The actual array itself */
4607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
4617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// note "this" is required for ISO standard, C++ and gcc complains otherwise
4637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// http://lists.apple.com/archives/Xcode-users//2005/Dec/msg00644.html
4647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @class       CPVRTArrayManagedPointers
4677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief       Maintains an array of managed pointers.
4687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
4697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenstemplate<typename T>
4707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensclass CPVRTArrayManagedPointers : public CPVRTArray<T*>
4717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenspublic:
4737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
4747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief     Destructor.
4757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
4767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens    virtual ~CPVRTArrayManagedPointers()
4777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(this->m_pArray)
4797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
4807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(unsigned int i=0;i<this->m_uiSize;i++)
4817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
4827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				delete(this->m_pArray[i]);
4837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
4847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
4887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Removes an element from the array.
4897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@param[in]	uiIndex		The index to remove.
4907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	success or failure
4917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
4927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	virtual EPVRTError Remove(unsigned int uiIndex)
4937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(uiIndex < this->m_uiSize);
4957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(this->m_uiSize == 0)
4967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
4977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiIndex == this->m_uiSize-1)
4997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
5007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return this->RemoveLast();
5017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
5027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiSize = (this->m_uiSize - (uiIndex+1)) * sizeof(T*);
5047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		delete this->m_pArray[uiIndex];
5067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memmove(this->m_pArray + uiIndex, this->m_pArray + (uiIndex+1), uiSize);
5077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		this->m_uiSize--;
5097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_SUCCESS;
5107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
5137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@brief      Removes the last element. Simply decrements the size value
5147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	@return 	success or failure
5157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*****************************************************************************/
5167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	virtual EPVRTError RemoveLast()
5177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(this->m_uiSize > 0 && this->m_pArray)
5197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
5207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			delete this->m_pArray[this->m_uiSize-1];
5217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			this->m_uiSize--;
5227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_SUCCESS;
5237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
5247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
5257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
5267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
5277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
5287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
5307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif // __PVRTARRAY_H__
5327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
5347b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEnd of file (PVRTArray.h)
5357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
5367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
537