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