30 #ifndef _FUNCTIONAL_HASH_H 
   31 #define _FUNCTIONAL_HASH_H 1 
   33 #pragma GCC system_header 
   37 namespace std _GLIBCXX_VISIBILITY(default)
 
   39 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   49   template<
typename _Result, 
typename _Arg>
 
   52       typedef _Result     result_type;
 
   53       typedef _Arg      argument_type;
 
   57   template<
typename _Tp>
 
   58     struct hash : 
public __hash_base<size_t, _Tp>
 
   61       operator()(_Tp __val) 
const;
 
   65   template<
typename _Tp>
 
   66     struct hash<_Tp*> : 
public __hash_base<size_t, _Tp*>
 
   69       operator()(_Tp* __p)
 const 
   70       { 
return reinterpret_cast<size_t>(__p); }
 
   74 #define _Cxx_hashtable_define_trivial_hash(_Tp)     \ 
   77     hash<_Tp>::operator()(_Tp __val) const      \ 
   78     { return static_cast<size_t>(__val); } 
   81   _Cxx_hashtable_define_trivial_hash(
bool);
 
   84   _Cxx_hashtable_define_trivial_hash(
char);
 
   87   _Cxx_hashtable_define_trivial_hash(
signed char);
 
   90   _Cxx_hashtable_define_trivial_hash(
unsigned char);
 
   93   _Cxx_hashtable_define_trivial_hash(
wchar_t);
 
   96   _Cxx_hashtable_define_trivial_hash(char16_t);
 
   99   _Cxx_hashtable_define_trivial_hash(char32_t);
 
  102   _Cxx_hashtable_define_trivial_hash(
short);
 
  105   _Cxx_hashtable_define_trivial_hash(
int);
 
  108   _Cxx_hashtable_define_trivial_hash(
long);
 
  111   _Cxx_hashtable_define_trivial_hash(
long long);
 
  114   _Cxx_hashtable_define_trivial_hash(
unsigned short);
 
  117   _Cxx_hashtable_define_trivial_hash(
unsigned int);
 
  120   _Cxx_hashtable_define_trivial_hash(
unsigned long);
 
  123   _Cxx_hashtable_define_trivial_hash(
unsigned long long);
 
  125 #undef _Cxx_hashtable_define_trivial_hash 
  130     hash(
const void* __ptr, 
size_t __clength,
 
  131      size_t __seed = static_cast<size_t>(0xc70f6907UL))
 
  132     { 
return _Hash_bytes(__ptr, __clength, __seed); }
 
  134     template<
typename _Tp>
 
  136       hash(
const _Tp& __val)
 
  137       { 
return hash(&__val, 
sizeof(__val)); }
 
  139     template<
typename _Tp>
 
  141       __hash_combine(
const _Tp& __val, 
size_t __hash)
 
  142       { 
return hash(&__val, 
sizeof(__val), __hash); }
 
  145   struct _Fnv_hash_impl
 
  148     hash(
const void* __ptr, 
size_t __clength,
 
  149      size_t __seed = static_cast<size_t>(2166136261UL))
 
  150     { 
return _Fnv_hash_bytes(__ptr, __clength, __seed); }
 
  152     template<
typename _Tp>
 
  154       hash(
const _Tp& __val)
 
  155       { 
return hash(&__val, 
sizeof(__val)); }
 
  157     template<
typename _Tp>
 
  159       __hash_combine(
const _Tp& __val, 
size_t __hash)
 
  160       { 
return hash(&__val, 
sizeof(__val), __hash); }
 
  166     hash<float>::operator()(
float __val)
 const 
  169       return __val != 0.0f ? std::_Hash_impl::hash(__val) : 0;
 
  175     hash<double>::operator()(
double __val)
 const 
  178       return __val != 0.0 ? std::_Hash_impl::hash(__val) : 0;
 
  184     hash<long double>::operator()(
long double __val) 
const;
 
  188 _GLIBCXX_END_NAMESPACE_VERSION
 
  191 #endif // _FUNCTIONAL_HASH_H