|  | /*!**************************************************************************** | 
|  |  | 
|  | @file         PVRTMap.h | 
|  | @copyright    Copyright (c) Imagination Technologies Limited. | 
|  | @brief        A simple and easy-to-use implementation of a map. | 
|  |  | 
|  | ******************************************************************************/ | 
|  | #ifndef __PVRTMAP_H__ | 
|  | #define __PVRTMAP_H__ | 
|  |  | 
|  | #include "PVRTArray.h" | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @class		CPVRTMap | 
|  | @brief		Expanding map template class. | 
|  | @details   A simple and easy-to-use implementation of a map. | 
|  | *****************************************************************************/ | 
|  | template <typename KeyType, typename DataType> | 
|  | class CPVRTMap | 
|  | { | 
|  | public: | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Constructor for a CPVRTMap. | 
|  | @return		A new CPVRTMap. | 
|  | *************************************************************************/ | 
|  | CPVRTMap() : m_Keys(), m_Data(), m_uiSize(0) | 
|  | {} | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Destructor for a CPVRTMap. | 
|  | *************************************************************************/ | 
|  | ~CPVRTMap() | 
|  | { | 
|  | //Clear the map, that's enough - the CPVRTArray members will tidy everything else up. | 
|  | Clear(); | 
|  | } | 
|  |  | 
|  | EPVRTError Reserve(const PVRTuint32 uiSize) | 
|  | { | 
|  | //Sets the capacity of each member array to the requested size. The array used will only expand. | 
|  | //Returns the most serious error from either method. | 
|  | return PVRT_MAX(m_Keys.SetCapacity(uiSize),m_Data.SetCapacity(uiSize)); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Returns the number of meaningful members in the map. | 
|  | @return		Number of meaningful members in the map. | 
|  | *************************************************************************/ | 
|  | PVRTuint32 GetSize() const | 
|  | { | 
|  | //Return the size. | 
|  | return m_uiSize; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Gets the position of a particular key/data within the map. | 
|  | If the return value is exactly equal to the value of | 
|  | GetSize() then the item has not been found. | 
|  | @param[in]		key     Key type | 
|  | @return		The index value for a mapped item. | 
|  | *************************************************************************/ | 
|  | PVRTuint32 GetIndexOf(const KeyType key) const | 
|  | { | 
|  | //Loop through all the valid keys. | 
|  | for (PVRTuint32 i=0; i<m_uiSize; ++i) | 
|  | { | 
|  | //Check if a key matches. | 
|  | if (m_Keys[i]==key) | 
|  | { | 
|  | //If a matched key is found, return the position. | 
|  | return i; | 
|  | } | 
|  | } | 
|  |  | 
|  | //If not found, return the number of meaningful members. | 
|  | return m_uiSize; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Returns a pointer to the Data at a particular index. | 
|  | If the index supplied is not valid, NULL is returned | 
|  | instead. Deletion of data at this pointer will lead | 
|  | to undefined behaviour. | 
|  | @param[in]		uiIndex     Index number | 
|  | @return		Data type at the specified position. | 
|  | *************************************************************************/ | 
|  | const DataType* GetDataAtIndex(const PVRTuint32 uiIndex) const | 
|  | { | 
|  | if (uiIndex>=m_uiSize) | 
|  | return NULL; | 
|  |  | 
|  | return &(m_Data[uiIndex]); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	If a mapping already exists for 'key' then it will return | 
|  | the associated data. If no mapping currently exists, a new | 
|  | element is created in place. | 
|  | @param[in]		key     Key type | 
|  | @return		Data that is mapped to 'key'. | 
|  | *************************************************************************/ | 
|  | DataType& operator[] (const KeyType key) | 
|  | { | 
|  | //Get the index of the key. | 
|  | PVRTuint32 uiIndex = GetIndexOf(key); | 
|  |  | 
|  | //Check the index is valid | 
|  | if (uiIndex != m_uiSize) | 
|  | { | 
|  | //Return mapped data if the index is valid. | 
|  | return m_Data[uiIndex]; | 
|  | } | 
|  | else | 
|  | { | 
|  | //Append the key to the Keys array. | 
|  | m_Keys.Append(key); | 
|  |  | 
|  | //Create a new DataType. | 
|  | DataType sNewData; | 
|  |  | 
|  | //Append the new pointer to the Data array. | 
|  | m_Data.Append(sNewData); | 
|  |  | 
|  | //Increment the size of meaningful data. | 
|  | ++m_uiSize; | 
|  |  | 
|  | //Return the contents of pNewData. | 
|  | return m_Data[m_Keys.GetSize()-1]; | 
|  | } | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Removes an element from the map if it exists. | 
|  | @param[in]		key     Key type | 
|  | @return		Returns PVR_FAIL if item doesn't exist. | 
|  | Otherwise returns PVR_SUCCESS. | 
|  | *************************************************************************/ | 
|  | EPVRTError Remove(const KeyType key) | 
|  | { | 
|  | //Finds the index of the key. | 
|  | PVRTuint32 uiIndex=GetIndexOf(key); | 
|  |  | 
|  | //If the key is invalid, fail. | 
|  | if (uiIndex==m_uiSize) | 
|  | { | 
|  | //Return failure. | 
|  | return PVR_FAIL; | 
|  | } | 
|  |  | 
|  | //Decrement the size of the map to ignore the last element in each array. | 
|  | m_uiSize--; | 
|  |  | 
|  | //Copy the last key over the deleted key. There are now two copies of one element, | 
|  | //but the one at the end of the array is ignored. | 
|  | m_Keys[uiIndex]=m_Keys[m_uiSize-1]; | 
|  |  | 
|  | //Copy the last data over the deleted data in the same way as the keys. | 
|  | m_Data[uiIndex]=m_Data[m_uiSize-1]; | 
|  |  | 
|  | //Return success. | 
|  | return PVR_SUCCESS; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Clears the Map of all data values. | 
|  | *************************************************************************/ | 
|  | void Clear() | 
|  | { | 
|  | //Set the size to 0. | 
|  | m_uiSize=0; | 
|  | m_Keys.Clear(); | 
|  | m_Data.Clear(); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      	Checks whether or not data exists for the specified key. | 
|  | @param[in]		key     Key type | 
|  | @return		Whether data exists for the specified key or not. | 
|  | *************************************************************************/ | 
|  | bool Exists(const KeyType key) const | 
|  | { | 
|  | //Checks for a valid index for key, if not, returns false. | 
|  | return (GetIndexOf(key) != m_uiSize); | 
|  | } | 
|  |  | 
|  | private: | 
|  |  | 
|  |  | 
|  | CPVRTArray<KeyType> m_Keys; /*!< Array of all the keys. Indices match m_Data. */ | 
|  |  | 
|  | CPVRTArray<DataType> m_Data; /*!< Array of pointers to all the allocated data. */ | 
|  |  | 
|  | PVRTuint32 m_uiSize; /*!< The number of meaningful members in the map. */ | 
|  | }; | 
|  |  | 
|  | #endif // __PVRTMAP_H__ | 
|  |  | 
|  | /***************************************************************************** | 
|  | End of file (PVRTMap.h) | 
|  | *****************************************************************************/ | 
|  |  |