/*!****************************************************************************

 @file         PVRTStringHash.h
 @copyright    Copyright (c) Imagination Technologies Limited.
 @brief        Inherits from PVRTString to include PVRTHash functionality for
               quick string compares.

******************************************************************************/
#ifndef PVRTSTRINGHASH_H
#define PVRTSTRINGHASH_H

#include "PVRTString.h"
#include "PVRTHash.h"

/*!***********************************************************************
 @class        CPVRTStringHash
 @brief        Inherits from PVRTString to include PVRTHash functionality for
               quick string compares.
*************************************************************************/
class CPVRTStringHash
{
public:
	/*!***********************************************************************
	@brief      		Constructor
	@param[in]			_Ptr	A string
	@param[in]			_Count	Length of _Ptr
	************************************************************************/
	explicit CPVRTStringHash(const char* _Ptr, size_t _Count = CPVRTString::npos);

	/*!***********************************************************************
	@brief      		Constructor
	@param[in]			_Right	A string
	************************************************************************/
	explicit CPVRTStringHash(const CPVRTString& _Right);

	/*!***********************************************************************
	@brief      		Constructor
	************************************************************************/
	CPVRTStringHash();

	/*!***********************************************************************
	@brief      		Appends a string
	@param[in]			_Ptr	A string
	@return 			Updated string
	*************************************************************************/
	CPVRTStringHash& append(const char* _Ptr);

	/*!***********************************************************************
	@brief      		Appends a string
	@param[in]			_Str	A string
	@return 			Updated string
	*************************************************************************/
	CPVRTStringHash& append(const CPVRTString& _Str);

	/*!***********************************************************************
	@brief      		Assigns the string to the string _Ptr
	@param[in]			_Ptr A string
	@return 			Updated string
	*************************************************************************/
	CPVRTStringHash& assign(const char* _Ptr);

	/*!***********************************************************************
	@brief      		Assigns the string to the string _Str
	@param[in]			_Str A string
	@return 			Updated string
	*************************************************************************/
	CPVRTStringHash& assign(const CPVRTString& _Str);

	/*!***********************************************************************
	@brief      	== Operator. This function compares the hash values of
					the string.
	@param[in]		_Str 	A hashed string to compare with
	@return 		True if they match
	*************************************************************************/
	bool operator==(const CPVRTStringHash& _Str) const;

	/*!***********************************************************************
	@brief      	== Operator. This function performs a strcmp()
					as it's more efficient to strcmp than to hash the string
					for every comparison.
	@param[in]		_Str 	A string to compare with
	@return 		True if they match
	*************************************************************************/
	bool operator==(const char* _Str) const;

	/*!***********************************************************************
	@brief      	== Operator. This function performs a strcmp()
					as it's more efficient to strcmp than to hash the string
					for every comparison.
	@param[in]		_Str 	A string to compare with
	@return 		True if they match
	*************************************************************************/
	bool operator==(const CPVRTString& _Str) const;

	/*!***********************************************************************
	@brief      	== Operator. This function compares the hash values of
					the string.
	@param[in]		Hash 	A Hash to compare with
	@return 		True if they match
	*************************************************************************/
	bool operator==(const CPVRTHash& Hash) const;

	/*!***********************************************************************
	@brief      	!= Operator
	@param[in]		_Str 	A string to compare with
	@return 		True if they don't match
	*************************************************************************/
	bool operator!=(const CPVRTStringHash& _Str) const;

	/*!***********************************************************************
	@brief      	!= Operator. This function compares the hash values of
					the string.
	@param[in]		Hash 	A Hash to compare with
	@return 		True if they match
	*************************************************************************/
	bool operator!=(const CPVRTHash& Hash) const;

	/*!***********************************************************************
	@fn       		String
	@return 		The original string
	@brief      	Returns the original, base string.
	*************************************************************************/
	const CPVRTString& String() const;

	/*!***********************************************************************
	@brief      	Returns the hash of the base string
	@fn       		Hash
	@return 		The hash
	*************************************************************************/
	const CPVRTHash& Hash() const;

	/*!***************************************************************************
	@fn       		c_str
	@return			The original string.
	@brief      	Returns the base string as a const char*.
	*****************************************************************************/
	const char* c_str() const;

private:
	CPVRTString			m_String;
	CPVRTHash			m_Hash;
};

#endif