111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997-1999
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_STRING_HASH_H
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_STRING_HASH_H
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_HASH_FUN_H
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/_hash_fun.h>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_STRING_H
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/_string.h>
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _CharT, class _Traits, class _Alloc>
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP size_t
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__stl_string_hash(const basic_string<_CharT,_Traits,_Alloc>& __s) {
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  unsigned long __h = 0;
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t __len = __s.size();
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const _CharT* __data = __s.data();
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  for ( size_t __i = 0; __i < __len; ++__i)
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __h = /* 5 *__h */(__h << 2) + __h + __data[__i];
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return size_t(__h);
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && \
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x560))
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _CharT, class _Traits, class _Alloc>
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct hash<basic_string<_CharT,_Traits,_Alloc> > {
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t operator()(const basic_string<_CharT,_Traits,_Alloc>& __s) const
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return __stl_string_hash(__s); }
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _STLP_CLASS_DECLSPEC hash<string> {
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t operator()(const string& __s) const
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return __stl_string_hash(__s); }
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_HAS_WCHAR_T)
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _STLP_CLASS_DECLSPEC hash<wstring> {
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t operator()(const wstring& __s) const
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return __stl_string_hash(__s); }
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
72