Home | History | Annotate | Download | only in stl
      1 /*
      2  * Copyright (c) 1997-1999
      3  * Silicon Graphics Computer Systems, Inc.
      4  *
      5  * Copyright (c) 1999
      6  * Boris Fomitchev
      7  *
      8  * This material is provided "as is", with absolutely no warranty expressed
      9  * or implied. Any use is at your own risk.
     10  *
     11  * Permission to use or copy this software for any purpose is hereby granted
     12  * without fee, provided the above notices are retained on all copies.
     13  * Permission to modify the code and to distribute modified code is granted,
     14  * provided the above notices are retained, and a notice that the code was
     15  * modified is included with the above copyright notice.
     16  *
     17  */
     18 
     19 #ifndef _STLP_STRING_HASH_H
     20 #define _STLP_STRING_HASH_H
     21 
     22 #ifndef _STLP_HASH_FUN_H
     23 # include <stl/_hash_fun.h>
     24 #endif
     25 
     26 #ifndef _STLP_INTERNAL_STRING_H
     27 # include <stl/_string.h>
     28 #endif
     29 
     30 _STLP_BEGIN_NAMESPACE
     31 
     32 template <class _CharT, class _Traits, class _Alloc>
     33 _STLP_INLINE_LOOP size_t
     34 __stl_string_hash(const basic_string<_CharT,_Traits,_Alloc>& __s) {
     35   unsigned long __h = 0;
     36   size_t __len = __s.size();
     37   const _CharT* __data = __s.data();
     38   for ( size_t __i = 0; __i < __len; ++__i)
     39     __h = /* 5 *__h */(__h << 2) + __h + __data[__i];
     40   return size_t(__h);
     41 }
     42 
     43 #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && \
     44   (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x560))
     45 template <class _CharT, class _Traits, class _Alloc>
     46 struct hash<basic_string<_CharT,_Traits,_Alloc> > {
     47   size_t operator()(const basic_string<_CharT,_Traits,_Alloc>& __s) const
     48     { return __stl_string_hash(__s); }
     49 };
     50 
     51 #else
     52 
     53 _STLP_TEMPLATE_NULL
     54 struct _STLP_CLASS_DECLSPEC hash<string> {
     55   size_t operator()(const string& __s) const
     56     { return __stl_string_hash(__s); }
     57 };
     58 
     59 #  if defined (_STLP_HAS_WCHAR_T)
     60 _STLP_TEMPLATE_NULL
     61 struct _STLP_CLASS_DECLSPEC hash<wstring> {
     62   size_t operator()(const wstring& __s) const
     63     { return __stl_string_hash(__s); }
     64 };
     65 #  endif
     66 
     67 #endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
     68 
     69 _STLP_END_NAMESPACE
     70 
     71 #endif
     72