15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
35a83710eSEric Fiselier //                     The LLVM Compiler Infrastructure
45a83710eSEric Fiselier //
55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open
65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details.
75a83710eSEric Fiselier //
85a83710eSEric Fiselier //===----------------------------------------------------------------------===//
95a83710eSEric Fiselier 
105a83710eSEric Fiselier // <functional>
115a83710eSEric Fiselier 
125a83710eSEric Fiselier // template <class T>
135a83710eSEric Fiselier // struct hash
145a83710eSEric Fiselier //     : public unary_function<T, size_t>
155a83710eSEric Fiselier // {
165a83710eSEric Fiselier //     size_t operator()(T val) const;
175a83710eSEric Fiselier // };
185a83710eSEric Fiselier 
195a83710eSEric Fiselier #include <functional>
205a83710eSEric Fiselier #include <cassert>
215a83710eSEric Fiselier #include <type_traits>
22df5ddf2cSMarshall Clow #include <cstddef>
235a83710eSEric Fiselier #include <limits>
245a83710eSEric Fiselier 
255f15481fSEric Fiselier #include "test_macros.h"
265f15481fSEric Fiselier 
275a83710eSEric Fiselier template <class T>
285a83710eSEric Fiselier void
295a83710eSEric Fiselier test()
305a83710eSEric Fiselier {
31d95510ebSMarshall Clow     typedef std::hash<T> H;
32d95510ebSMarshall Clow     static_assert((std::is_same<typename H::argument_type, T>::value), "" );
33d95510ebSMarshall Clow     static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" );
34d95510ebSMarshall Clow     H h;
35d95510ebSMarshall Clow 
365a83710eSEric Fiselier     for (int i = 0; i <= 5; ++i)
375a83710eSEric Fiselier     {
38*f2e24f56SStephan T. Lavavej         T t(static_cast<T>(i));
395a83710eSEric Fiselier         if (sizeof(T) <= sizeof(std::size_t))
405f15481fSEric Fiselier         {
415f15481fSEric Fiselier             const std::size_t result = h(t);
425f15481fSEric Fiselier             LIBCPP_ASSERT(result == t);
435f15481fSEric Fiselier             ((void)result); // Prevent unused warning
445f15481fSEric Fiselier         }
455a83710eSEric Fiselier     }
465a83710eSEric Fiselier }
475a83710eSEric Fiselier 
485a83710eSEric Fiselier int main()
495a83710eSEric Fiselier {
505a83710eSEric Fiselier     test<bool>();
515a83710eSEric Fiselier     test<char>();
525a83710eSEric Fiselier     test<signed char>();
535a83710eSEric Fiselier     test<unsigned char>();
545a83710eSEric Fiselier     test<char16_t>();
555a83710eSEric Fiselier     test<char32_t>();
565a83710eSEric Fiselier     test<wchar_t>();
575a83710eSEric Fiselier     test<short>();
585a83710eSEric Fiselier     test<unsigned short>();
595a83710eSEric Fiselier     test<int>();
605a83710eSEric Fiselier     test<unsigned int>();
615a83710eSEric Fiselier     test<long>();
625a83710eSEric Fiselier     test<unsigned long>();
635a83710eSEric Fiselier     test<long long>();
645a83710eSEric Fiselier     test<unsigned long long>();
651867554cSMarshall Clow 
661867554cSMarshall Clow //	LWG #2119
67df5ddf2cSMarshall Clow     test<std::ptrdiff_t>();
681867554cSMarshall Clow     test<size_t>();
691867554cSMarshall Clow 
701867554cSMarshall Clow 	test<int8_t>();
711867554cSMarshall Clow 	test<int16_t>();
721867554cSMarshall Clow 	test<int32_t>();
731867554cSMarshall Clow 	test<int64_t>();
741867554cSMarshall Clow 
751867554cSMarshall Clow 	test<int_fast8_t>();
761867554cSMarshall Clow 	test<int_fast16_t>();
771867554cSMarshall Clow 	test<int_fast32_t>();
781867554cSMarshall Clow 	test<int_fast64_t>();
791867554cSMarshall Clow 
801867554cSMarshall Clow 	test<int_least8_t>();
811867554cSMarshall Clow 	test<int_least16_t>();
821867554cSMarshall Clow 	test<int_least32_t>();
831867554cSMarshall Clow 	test<int_least64_t>();
841867554cSMarshall Clow 
851867554cSMarshall Clow     test<intmax_t>();
861867554cSMarshall Clow     test<intptr_t>();
871867554cSMarshall Clow 
881867554cSMarshall Clow 	test<uint8_t>();
891867554cSMarshall Clow 	test<uint16_t>();
901867554cSMarshall Clow 	test<uint32_t>();
911867554cSMarshall Clow 	test<uint64_t>();
921867554cSMarshall Clow 
931867554cSMarshall Clow 	test<uint_fast8_t>();
941867554cSMarshall Clow 	test<uint_fast16_t>();
951867554cSMarshall Clow 	test<uint_fast32_t>();
961867554cSMarshall Clow 	test<uint_fast64_t>();
971867554cSMarshall Clow 
981867554cSMarshall Clow 	test<uint_least8_t>();
991867554cSMarshall Clow 	test<uint_least16_t>();
1001867554cSMarshall Clow 	test<uint_least32_t>();
1011867554cSMarshall Clow 	test<uint_least64_t>();
1021867554cSMarshall Clow 
1031867554cSMarshall Clow     test<uintmax_t>();
1041867554cSMarshall Clow     test<uintptr_t>();
105df691e18SEric Fiselier 
106df691e18SEric Fiselier #ifndef _LIBCPP_HAS_NO_INT128
107df691e18SEric Fiselier     test<__int128_t>();
108df691e18SEric Fiselier     test<__uint128_t>();
109df691e18SEric Fiselier #endif
1105a83710eSEric Fiselier }
111