#include "hash.h" template<> uint32_t __calcHashCode( const int k ) { return k; } template<> bool __cmpHashKeys( const int a, const int b ) { return a == b; } template<> uint32_t __calcHashCode( int k ) { return k; } template<> bool __cmpHashKeys( int a, int b ) { return a == b; } template<> uint32_t __calcHashCode( const char * k ) { if (k == NULL) { return 0; } unsigned long int nPos = 0; for( const char *s = k; *s; s++ ) { nPos = *s + (nPos << 6) + (nPos << 16) - nPos; } return nPos; } template<> bool __cmpHashKeys( const char *a, const char *b ) { if( a == b ) return true; for(; *a != *b; a++, b++ ) if( *a == '\0' && *b == '\0' ) return true; return false; } template<> uint32_t __calcHashCode( char *k ) { return __calcHashCode((const char *)k ); } template<> bool __cmpHashKeys( char *a, char *b ) { return __cmpHashKeys((const char *)a, (const char *)b ); } template<> uint32_t __calcHashCode( const std::string k ) { std::string::size_type j, sz = k.size(); const char *s = k.c_str(); unsigned long int nPos = 0; for( j = 0; j < sz; j++, s++ ) { nPos = *s + (nPos << 6) + (nPos << 16) - nPos; } return nPos; } template<> bool __cmpHashKeys( const std::string a, const std::string b ) { return a == b; } template<> uint32_t __calcHashCode( std::string k ) { return __calcHashCode( k ); } template<> bool __cmpHashKeys( std::string a, std::string b ) { return __cmpHashKeys( a, b ); } template<> uint32_t __calcHashCode( Hashable &k ) { return k.getHashCode(); } template<> bool __cmpHashKeys( Hashable &a, Hashable &b ) { return a.compareForHash( b ); }