// typeindex standard header
#pragma once
#ifndef _TYPEINDEX_
#define _TYPEINDEX_
#ifndef RC_INVOKED
#include <typeinfo>

 #pragma pack(push,_CRT_PACKING)
 #pragma warning(push,3)

 #if _HAS_CPP0X
_STD_BEGIN
class type_index
	{	// wraps a typeinfo for indexing
public:
	type_index(const type_info &_Tinfo)
		: _Tptr(&_Tinfo)
		{	// construct from type_info
		}

	size_t hash_code() const
		{	// return hash value
		return (_Tptr->hash_code());
		}

	const char *name() const
		{	// return name
		return (_Tptr->name());
		}

	bool operator==(const type_index& _Right) const
		{	// test if *this == _Right
		return (*_Tptr == *_Right._Tptr);
		}

	bool operator!=(const type_index& _Right) const
		{	// test if *this != _Right
		return (!(*this == _Right));
		}

	bool operator<(const type_index& _Right) const
		{	// test if *this < _Right
		return (_Tptr->before(*_Right._Tptr) != 0);
		}

	bool operator>=(const type_index& _Right) const
		{	// test if *this >= _Right
		return (!(*this < _Right));
		}

	bool operator>(const type_index& _Right) const
		{	// test if *this > _Right
		return (_Right < *this);
		}

	bool operator<=(const type_index& _Right) const
		{	// test if *this <= _Right
		return (!(_Right < *this));
		}

private:
	const type_info *_Tptr;
	};

template<class _Kty>
	class hash;

template<>
	class hash<type_index>
		: public unary_function<type_index, size_t>
	{	// hash functor
public:
	typedef type_index _Kty;

	size_t operator()(_Kty _Keyval) const
		{	// hash _Keyval to size_t value by pseudorandomizing transform
		return (_Keyval.hash_code());
		}
	};
_STD_END
 #endif /* _HAS_CPP0X */

 #pragma warning(pop)
 #pragma pack(pop)

#endif /* RC_INVOKED */
#endif /* _TYPE_INDEX_ */

/*
 * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V5.20:0009 */
