xref: /freebsd/contrib/llvm-project/libcxx/include/__functional/hash.h (revision b1879975794772ee51f0b4865753364c7d7626c3)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef _LIBCPP___FUNCTIONAL_HASH_H
10 #define _LIBCPP___FUNCTIONAL_HASH_H
11 
12 #include <__config>
13 #include <__functional/unary_function.h>
14 #include <__fwd/functional.h>
15 #include <__type_traits/conjunction.h>
16 #include <__type_traits/invoke.h>
17 #include <__type_traits/is_constructible.h>
18 #include <__type_traits/is_enum.h>
19 #include <__type_traits/underlying_type.h>
20 #include <__utility/pair.h>
21 #include <__utility/swap.h>
22 #include <cstddef>
23 #include <cstdint>
24 #include <cstring>
25 
26 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
27 #  pragma GCC system_header
28 #endif
29 
30 _LIBCPP_BEGIN_NAMESPACE_STD
31 
32 template <class _Size>
33 inline _LIBCPP_HIDE_FROM_ABI _Size __loadword(const void* __p) {
34   _Size __r;
35   std::memcpy(&__r, __p, sizeof(__r));
36   return __r;
37 }
38 
39 // We use murmur2 when size_t is 32 bits, and cityhash64 when size_t
40 // is 64 bits.  This is because cityhash64 uses 64bit x 64bit
41 // multiplication, which can be very slow on 32-bit systems.
42 template <class _Size, size_t = sizeof(_Size) * __CHAR_BIT__>
43 struct __murmur2_or_cityhash;
44 
45 template <class _Size>
46 struct __murmur2_or_cityhash<_Size, 32> {
47   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK _Size
48   operator()(const void* __key, _Size __len) const {
49     // murmur2
50     const _Size __m             = 0x5bd1e995;
51     const _Size __r             = 24;
52     _Size __h                   = __len;
53     const unsigned char* __data = static_cast<const unsigned char*>(__key);
54     for (; __len >= 4; __data += 4, __len -= 4) {
55       _Size __k = std::__loadword<_Size>(__data);
56       __k *= __m;
57       __k ^= __k >> __r;
58       __k *= __m;
59       __h *= __m;
60       __h ^= __k;
61     }
62     switch (__len) {
63     case 3:
64       __h ^= static_cast<_Size>(__data[2] << 16);
65       _LIBCPP_FALLTHROUGH();
66     case 2:
67       __h ^= static_cast<_Size>(__data[1] << 8);
68       _LIBCPP_FALLTHROUGH();
69     case 1:
70       __h ^= __data[0];
71       __h *= __m;
72     }
73     __h ^= __h >> 13;
74     __h *= __m;
75     __h ^= __h >> 15;
76     return __h;
77   }
78 };
79 
80 template <class _Size>
81 struct __murmur2_or_cityhash<_Size, 64> {
82   // cityhash64
83   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK _Size
84   operator()(const void* __key, _Size __len) const {
85     const char* __s = static_cast<const char*>(__key);
86     if (__len <= 32) {
87       if (__len <= 16) {
88         return __hash_len_0_to_16(__s, __len);
89       } else {
90         return __hash_len_17_to_32(__s, __len);
91       }
92     } else if (__len <= 64) {
93       return __hash_len_33_to_64(__s, __len);
94     }
95 
96     // For strings over 64 bytes we hash the end first, and then as we
97     // loop we keep 56 bytes of state: v, w, x, y, and z.
98     _Size __x = std::__loadword<_Size>(__s + __len - 40);
99     _Size __y = std::__loadword<_Size>(__s + __len - 16) + std::__loadword<_Size>(__s + __len - 56);
100     _Size __z =
101         __hash_len_16(std::__loadword<_Size>(__s + __len - 48) + __len, std::__loadword<_Size>(__s + __len - 24));
102     pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z);
103     pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x);
104     __x                    = __x * __k1 + std::__loadword<_Size>(__s);
105 
106     // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
107     __len = (__len - 1) & ~static_cast<_Size>(63);
108     do {
109       __x = __rotate(__x + __y + __v.first + std::__loadword<_Size>(__s + 8), 37) * __k1;
110       __y = __rotate(__y + __v.second + std::__loadword<_Size>(__s + 48), 42) * __k1;
111       __x ^= __w.second;
112       __y += __v.first + std::__loadword<_Size>(__s + 40);
113       __z = __rotate(__z + __w.first, 33) * __k1;
114       __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first);
115       __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, __y + std::__loadword<_Size>(__s + 16));
116       std::swap(__z, __x);
117       __s += 64;
118       __len -= 64;
119     } while (__len != 0);
120     return __hash_len_16(__hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z,
121                          __hash_len_16(__v.second, __w.second) + __x);
122   }
123 
124 private:
125   // Some primes between 2^63 and 2^64.
126   static const _Size __k0 = 0xc3a5c85c97cb3127ULL;
127   static const _Size __k1 = 0xb492b66fbe98f273ULL;
128   static const _Size __k2 = 0x9ae16a3b2f90404fULL;
129   static const _Size __k3 = 0xc949d7c7509e6557ULL;
130 
131   _LIBCPP_HIDE_FROM_ABI static _Size __rotate(_Size __val, int __shift) {
132     return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift)));
133   }
134 
135   _LIBCPP_HIDE_FROM_ABI static _Size __rotate_by_at_least_1(_Size __val, int __shift) {
136     return (__val >> __shift) | (__val << (64 - __shift));
137   }
138 
139   _LIBCPP_HIDE_FROM_ABI static _Size __shift_mix(_Size __val) { return __val ^ (__val >> 47); }
140 
141   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static _Size __hash_len_16(_Size __u, _Size __v) {
142     const _Size __mul = 0x9ddfea08eb382d69ULL;
143     _Size __a         = (__u ^ __v) * __mul;
144     __a ^= (__a >> 47);
145     _Size __b = (__v ^ __a) * __mul;
146     __b ^= (__b >> 47);
147     __b *= __mul;
148     return __b;
149   }
150 
151   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static _Size
152   __hash_len_0_to_16(const char* __s, _Size __len) {
153     if (__len > 8) {
154       const _Size __a = std::__loadword<_Size>(__s);
155       const _Size __b = std::__loadword<_Size>(__s + __len - 8);
156       return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b;
157     }
158     if (__len >= 4) {
159       const uint32_t __a = std::__loadword<uint32_t>(__s);
160       const uint32_t __b = std::__loadword<uint32_t>(__s + __len - 4);
161 #ifdef _LIBCPP_ABI_FIX_CITYHASH_IMPLEMENTATION
162       return __hash_len_16(__len + (static_cast<_Size>(__a) << 3), __b);
163 #else
164       return __hash_len_16(__len + (__a << 3), __b);
165 #endif
166     }
167     if (__len > 0) {
168       const unsigned char __a = static_cast<unsigned char>(__s[0]);
169       const unsigned char __b = static_cast<unsigned char>(__s[__len >> 1]);
170       const unsigned char __c = static_cast<unsigned char>(__s[__len - 1]);
171       const uint32_t __y      = static_cast<uint32_t>(__a) + (static_cast<uint32_t>(__b) << 8);
172       const uint32_t __z      = __len + (static_cast<uint32_t>(__c) << 2);
173       return __shift_mix(__y * __k2 ^ __z * __k3) * __k2;
174     }
175     return __k2;
176   }
177 
178   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static _Size
179   __hash_len_17_to_32(const char* __s, _Size __len) {
180     const _Size __a = std::__loadword<_Size>(__s) * __k1;
181     const _Size __b = std::__loadword<_Size>(__s + 8);
182     const _Size __c = std::__loadword<_Size>(__s + __len - 8) * __k2;
183     const _Size __d = std::__loadword<_Size>(__s + __len - 16) * __k0;
184     return __hash_len_16(
185         __rotate(__a - __b, 43) + __rotate(__c, 30) + __d, __a + __rotate(__b ^ __k3, 20) - __c + __len);
186   }
187 
188   // Return a 16-byte hash for 48 bytes.  Quick and dirty.
189   // Callers do best to use "random-looking" values for a and b.
190   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static pair<_Size, _Size>
191   __weak_hash_len_32_with_seeds(_Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) {
192     __a += __w;
193     __b             = __rotate(__b + __a + __z, 21);
194     const _Size __c = __a;
195     __a += __x;
196     __a += __y;
197     __b += __rotate(__a, 44);
198     return pair<_Size, _Size>(__a + __z, __b + __c);
199   }
200 
201   // Return a 16-byte hash for s[0] ... s[31], a, and b.  Quick and dirty.
202   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static pair<_Size, _Size>
203   __weak_hash_len_32_with_seeds(const char* __s, _Size __a, _Size __b) {
204     return __weak_hash_len_32_with_seeds(
205         std::__loadword<_Size>(__s),
206         std::__loadword<_Size>(__s + 8),
207         std::__loadword<_Size>(__s + 16),
208         std::__loadword<_Size>(__s + 24),
209         __a,
210         __b);
211   }
212 
213   // Return an 8-byte hash for 33 to 64 bytes.
214   _LIBCPP_HIDE_FROM_ABI _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK static _Size
215   __hash_len_33_to_64(const char* __s, size_t __len) {
216     _Size __z = std::__loadword<_Size>(__s + 24);
217     _Size __a = std::__loadword<_Size>(__s) + (__len + std::__loadword<_Size>(__s + __len - 16)) * __k0;
218     _Size __b = __rotate(__a + __z, 52);
219     _Size __c = __rotate(__a, 37);
220     __a += std::__loadword<_Size>(__s + 8);
221     __c += __rotate(__a, 7);
222     __a += std::__loadword<_Size>(__s + 16);
223     _Size __vf = __a + __z;
224     _Size __vs = __b + __rotate(__a, 31) + __c;
225     __a        = std::__loadword<_Size>(__s + 16) + std::__loadword<_Size>(__s + __len - 32);
226     __z += std::__loadword<_Size>(__s + __len - 8);
227     __b = __rotate(__a + __z, 52);
228     __c = __rotate(__a, 37);
229     __a += std::__loadword<_Size>(__s + __len - 24);
230     __c += __rotate(__a, 7);
231     __a += std::__loadword<_Size>(__s + __len - 16);
232     _Size __wf = __a + __z;
233     _Size __ws = __b + __rotate(__a, 31) + __c;
234     _Size __r  = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0);
235     return __shift_mix(__r * __k0 + __vs) * __k2;
236   }
237 };
238 
239 template <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)>
240 struct __scalar_hash;
241 
242 template <class _Tp>
243 struct __scalar_hash<_Tp, 0> : public __unary_function<_Tp, size_t> {
244   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
245     union {
246       _Tp __t;
247       size_t __a;
248     } __u;
249     __u.__a = 0;
250     __u.__t = __v;
251     return __u.__a;
252   }
253 };
254 
255 template <class _Tp>
256 struct __scalar_hash<_Tp, 1> : public __unary_function<_Tp, size_t> {
257   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
258     union {
259       _Tp __t;
260       size_t __a;
261     } __u;
262     __u.__t = __v;
263     return __u.__a;
264   }
265 };
266 
267 template <class _Tp>
268 struct __scalar_hash<_Tp, 2> : public __unary_function<_Tp, size_t> {
269   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
270     union {
271       _Tp __t;
272       struct {
273         size_t __a;
274         size_t __b;
275       } __s;
276     } __u;
277     __u.__t = __v;
278     return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
279   }
280 };
281 
282 template <class _Tp>
283 struct __scalar_hash<_Tp, 3> : public __unary_function<_Tp, size_t> {
284   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
285     union {
286       _Tp __t;
287       struct {
288         size_t __a;
289         size_t __b;
290         size_t __c;
291       } __s;
292     } __u;
293     __u.__t = __v;
294     return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
295   }
296 };
297 
298 template <class _Tp>
299 struct __scalar_hash<_Tp, 4> : public __unary_function<_Tp, size_t> {
300   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
301     union {
302       _Tp __t;
303       struct {
304         size_t __a;
305         size_t __b;
306         size_t __c;
307         size_t __d;
308       } __s;
309     } __u;
310     __u.__t = __v;
311     return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
312   }
313 };
314 
315 struct _PairT {
316   size_t first;
317   size_t second;
318 };
319 
320 _LIBCPP_HIDE_FROM_ABI inline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT {
321   typedef __scalar_hash<_PairT> _HashT;
322   const _PairT __p = {__lhs, __rhs};
323   return _HashT()(__p);
324 }
325 
326 template <class _Tp>
327 struct _LIBCPP_TEMPLATE_VIS hash<_Tp*> : public __unary_function<_Tp*, size_t> {
328   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp* __v) const _NOEXCEPT {
329     union {
330       _Tp* __t;
331       size_t __a;
332     } __u;
333     __u.__t = __v;
334     return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
335   }
336 };
337 
338 template <>
339 struct _LIBCPP_TEMPLATE_VIS hash<bool> : public __unary_function<bool, size_t> {
340   _LIBCPP_HIDE_FROM_ABI size_t operator()(bool __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
341 };
342 
343 template <>
344 struct _LIBCPP_TEMPLATE_VIS hash<char> : public __unary_function<char, size_t> {
345   _LIBCPP_HIDE_FROM_ABI size_t operator()(char __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
346 };
347 
348 template <>
349 struct _LIBCPP_TEMPLATE_VIS hash<signed char> : public __unary_function<signed char, size_t> {
350   _LIBCPP_HIDE_FROM_ABI size_t operator()(signed char __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
351 };
352 
353 template <>
354 struct _LIBCPP_TEMPLATE_VIS hash<unsigned char> : public __unary_function<unsigned char, size_t> {
355   _LIBCPP_HIDE_FROM_ABI size_t operator()(unsigned char __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
356 };
357 
358 #ifndef _LIBCPP_HAS_NO_CHAR8_T
359 template <>
360 struct _LIBCPP_TEMPLATE_VIS hash<char8_t> : public __unary_function<char8_t, size_t> {
361   _LIBCPP_HIDE_FROM_ABI size_t operator()(char8_t __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
362 };
363 #endif // !_LIBCPP_HAS_NO_CHAR8_T
364 
365 template <>
366 struct _LIBCPP_TEMPLATE_VIS hash<char16_t> : public __unary_function<char16_t, size_t> {
367   _LIBCPP_HIDE_FROM_ABI size_t operator()(char16_t __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
368 };
369 
370 template <>
371 struct _LIBCPP_TEMPLATE_VIS hash<char32_t> : public __unary_function<char32_t, size_t> {
372   _LIBCPP_HIDE_FROM_ABI size_t operator()(char32_t __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
373 };
374 
375 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
376 template <>
377 struct _LIBCPP_TEMPLATE_VIS hash<wchar_t> : public __unary_function<wchar_t, size_t> {
378   _LIBCPP_HIDE_FROM_ABI size_t operator()(wchar_t __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
379 };
380 #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
381 
382 template <>
383 struct _LIBCPP_TEMPLATE_VIS hash<short> : public __unary_function<short, size_t> {
384   _LIBCPP_HIDE_FROM_ABI size_t operator()(short __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
385 };
386 
387 template <>
388 struct _LIBCPP_TEMPLATE_VIS hash<unsigned short> : public __unary_function<unsigned short, size_t> {
389   _LIBCPP_HIDE_FROM_ABI size_t operator()(unsigned short __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
390 };
391 
392 template <>
393 struct _LIBCPP_TEMPLATE_VIS hash<int> : public __unary_function<int, size_t> {
394   _LIBCPP_HIDE_FROM_ABI size_t operator()(int __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
395 };
396 
397 template <>
398 struct _LIBCPP_TEMPLATE_VIS hash<unsigned int> : public __unary_function<unsigned int, size_t> {
399   _LIBCPP_HIDE_FROM_ABI size_t operator()(unsigned int __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
400 };
401 
402 template <>
403 struct _LIBCPP_TEMPLATE_VIS hash<long> : public __unary_function<long, size_t> {
404   _LIBCPP_HIDE_FROM_ABI size_t operator()(long __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
405 };
406 
407 template <>
408 struct _LIBCPP_TEMPLATE_VIS hash<unsigned long> : public __unary_function<unsigned long, size_t> {
409   _LIBCPP_HIDE_FROM_ABI size_t operator()(unsigned long __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
410 };
411 
412 template <>
413 struct _LIBCPP_TEMPLATE_VIS hash<long long> : public __scalar_hash<long long> {};
414 
415 template <>
416 struct _LIBCPP_TEMPLATE_VIS hash<unsigned long long> : public __scalar_hash<unsigned long long> {};
417 
418 #ifndef _LIBCPP_HAS_NO_INT128
419 
420 template <>
421 struct _LIBCPP_TEMPLATE_VIS hash<__int128_t> : public __scalar_hash<__int128_t> {};
422 
423 template <>
424 struct _LIBCPP_TEMPLATE_VIS hash<__uint128_t> : public __scalar_hash<__uint128_t> {};
425 
426 #endif
427 
428 template <>
429 struct _LIBCPP_TEMPLATE_VIS hash<float> : public __scalar_hash<float> {
430   _LIBCPP_HIDE_FROM_ABI size_t operator()(float __v) const _NOEXCEPT {
431     // -0.0 and 0.0 should return same hash
432     if (__v == 0.0f)
433       return 0;
434     return __scalar_hash<float>::operator()(__v);
435   }
436 };
437 
438 template <>
439 struct _LIBCPP_TEMPLATE_VIS hash<double> : public __scalar_hash<double> {
440   _LIBCPP_HIDE_FROM_ABI size_t operator()(double __v) const _NOEXCEPT {
441     // -0.0 and 0.0 should return same hash
442     if (__v == 0.0)
443       return 0;
444     return __scalar_hash<double>::operator()(__v);
445   }
446 };
447 
448 template <>
449 struct _LIBCPP_TEMPLATE_VIS hash<long double> : public __scalar_hash<long double> {
450   _LIBCPP_HIDE_FROM_ABI size_t operator()(long double __v) const _NOEXCEPT {
451     // -0.0 and 0.0 should return same hash
452     if (__v == 0.0L)
453       return 0;
454 #if defined(__i386__) || (defined(__x86_64__) && defined(__ILP32__))
455     // Zero out padding bits
456     union {
457       long double __t;
458       struct {
459         size_t __a;
460         size_t __b;
461         size_t __c;
462         size_t __d;
463       } __s;
464     } __u;
465     __u.__s.__a = 0;
466     __u.__s.__b = 0;
467     __u.__s.__c = 0;
468     __u.__s.__d = 0;
469     __u.__t     = __v;
470     return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d;
471 #elif defined(__x86_64__)
472     // Zero out padding bits
473     union {
474       long double __t;
475       struct {
476         size_t __a;
477         size_t __b;
478       } __s;
479     } __u;
480     __u.__s.__a = 0;
481     __u.__s.__b = 0;
482     __u.__t     = __v;
483     return __u.__s.__a ^ __u.__s.__b;
484 #else
485     return __scalar_hash<long double>::operator()(__v);
486 #endif
487   }
488 };
489 
490 template <class _Tp, bool = is_enum<_Tp>::value>
491 struct _LIBCPP_TEMPLATE_VIS __enum_hash : public __unary_function<_Tp, size_t> {
492   _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
493     typedef typename underlying_type<_Tp>::type type;
494     return hash<type>()(static_cast<type>(__v));
495   }
496 };
497 template <class _Tp>
498 struct _LIBCPP_TEMPLATE_VIS __enum_hash<_Tp, false> {
499   __enum_hash()                              = delete;
500   __enum_hash(__enum_hash const&)            = delete;
501   __enum_hash& operator=(__enum_hash const&) = delete;
502 };
503 
504 template <class _Tp>
505 struct _LIBCPP_TEMPLATE_VIS hash : public __enum_hash<_Tp> {};
506 
507 #if _LIBCPP_STD_VER >= 17
508 
509 template <>
510 struct _LIBCPP_TEMPLATE_VIS hash<nullptr_t> : public __unary_function<nullptr_t, size_t> {
511   _LIBCPP_HIDE_FROM_ABI size_t operator()(nullptr_t) const _NOEXCEPT { return 662607004ull; }
512 };
513 #endif
514 
515 #ifndef _LIBCPP_CXX03_LANG
516 template <class _Key, class _Hash>
517 using __check_hash_requirements _LIBCPP_NODEBUG =
518     integral_constant<bool,
519                       is_copy_constructible<_Hash>::value && is_move_constructible<_Hash>::value &&
520                           __invokable_r<size_t, _Hash, _Key const&>::value >;
521 
522 template <class _Key, class _Hash = hash<_Key> >
523 using __has_enabled_hash _LIBCPP_NODEBUG =
524     integral_constant<bool, __check_hash_requirements<_Key, _Hash>::value && is_default_constructible<_Hash>::value >;
525 
526 #  if _LIBCPP_STD_VER >= 17
527 template <class _Type, class>
528 using __enable_hash_helper_imp _LIBCPP_NODEBUG = _Type;
529 
530 template <class _Type, class... _Keys>
531 using __enable_hash_helper _LIBCPP_NODEBUG =
532     __enable_hash_helper_imp<_Type, __enable_if_t<__all<__has_enabled_hash<_Keys>::value...>::value> >;
533 #  else
534 template <class _Type, class...>
535 using __enable_hash_helper _LIBCPP_NODEBUG = _Type;
536 #  endif
537 
538 #endif // !_LIBCPP_CXX03_LANG
539 
540 _LIBCPP_END_NAMESPACE_STD
541 
542 #endif // _LIBCPP___FUNCTIONAL_HASH_H
543