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