| /*!**************************************************************************** | |
| @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) | |
| *****************************************************************************/ | |