/** @file typechecking.h
 *  Interface of the type checking system for generic EA types
 *	@author Chris Burns (cburns@ea.com)
 *
 *	EABaseTypes
 *	(c) 2011 Electronic Arts Inc. 
 */

#ifndef EABASETYPES_TYPECHECKING_H_
#define EABASETYPES_TYPECHECKING_H_

#include "EABaseTypes/string.h"
#include "EABaseTypes/autoref.h"

namespace EA { namespace Allocator { class ICoreAllocator; } }

namespace EA
{
	namespace Types
	{
		class MetaTypes;
	
		EABASETYPES_FORWARD_DECLARATION(class, BaseType)

		/*!
		*	Verify if a given BaseType describes a valid type
		*	@param data		The BaseType to verify
		*	@return bool	true if	the data describes a valid type, false otherwise
		*/
		bool IsType(MetaTypes* metaTypes, ConstBaseTypeIn data);

		/*!
		*	Verify if a given BaseType conforms to a given type description
		*	@param data		The BaseType to verify
		*	@param type		The BaseType describing the type
		*	@param[out] message	A message describing why the BaseType does not conform
		*	@return bool	true if the data matches the type, false otherwise
		*/
		bool CheckType(MetaTypes* metaTypes, BaseTypeIn data, BaseTypeIn type, EA::RawString& message);
	}
}

#endif /* EABASETYPES_TYPECHECKING_H_ */
