1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 2*58b9f456SAndroid Build Coastguard Worker // 3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*58b9f456SAndroid Build Coastguard Worker // 5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 7*58b9f456SAndroid Build Coastguard Worker // 8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*58b9f456SAndroid Build Coastguard Worker 10*58b9f456SAndroid Build Coastguard Worker // <functional> 11*58b9f456SAndroid Build Coastguard Worker 12*58b9f456SAndroid Build Coastguard Worker // template <class T> 13*58b9f456SAndroid Build Coastguard Worker // struct hash 14*58b9f456SAndroid Build Coastguard Worker // : public unary_function<T, size_t> 15*58b9f456SAndroid Build Coastguard Worker // { 16*58b9f456SAndroid Build Coastguard Worker // size_t operator()(T val) const; 17*58b9f456SAndroid Build Coastguard Worker // }; 18*58b9f456SAndroid Build Coastguard Worker 19*58b9f456SAndroid Build Coastguard Worker // Not very portable 20*58b9f456SAndroid Build Coastguard Worker 21*58b9f456SAndroid Build Coastguard Worker #include <string> 22*58b9f456SAndroid Build Coastguard Worker #include <cassert> 23*58b9f456SAndroid Build Coastguard Worker #include <type_traits> 24*58b9f456SAndroid Build Coastguard Worker 25*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h" 26*58b9f456SAndroid Build Coastguard Worker 27*58b9f456SAndroid Build Coastguard Worker template <class T> 28*58b9f456SAndroid Build Coastguard Worker void test()29*58b9f456SAndroid Build Coastguard Workertest() 30*58b9f456SAndroid Build Coastguard Worker { 31*58b9f456SAndroid Build Coastguard Worker typedef std::hash<T> H; 32*58b9f456SAndroid Build Coastguard Worker static_assert((std::is_same<typename H::argument_type, T>::value), "" ); 33*58b9f456SAndroid Build Coastguard Worker static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); 34*58b9f456SAndroid Build Coastguard Worker ASSERT_NOEXCEPT(H()(T())); 35*58b9f456SAndroid Build Coastguard Worker 36*58b9f456SAndroid Build Coastguard Worker H h; 37*58b9f456SAndroid Build Coastguard Worker std::string g1 = "1234567890"; 38*58b9f456SAndroid Build Coastguard Worker std::string g2 = "1234567891"; 39*58b9f456SAndroid Build Coastguard Worker T s1(g1.begin(), g1.end()); 40*58b9f456SAndroid Build Coastguard Worker T s2(g2.begin(), g2.end()); 41*58b9f456SAndroid Build Coastguard Worker assert(h(s1) != h(s2)); 42*58b9f456SAndroid Build Coastguard Worker } 43*58b9f456SAndroid Build Coastguard Worker main()44*58b9f456SAndroid Build Coastguard Workerint main() 45*58b9f456SAndroid Build Coastguard Worker { 46*58b9f456SAndroid Build Coastguard Worker test<std::string>(); 47*58b9f456SAndroid Build Coastguard Worker #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L 48*58b9f456SAndroid Build Coastguard Worker test<std::u8string>(); 49*58b9f456SAndroid Build Coastguard Worker #endif 50*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 51*58b9f456SAndroid Build Coastguard Worker test<std::u16string>(); 52*58b9f456SAndroid Build Coastguard Worker test<std::u32string>(); 53*58b9f456SAndroid Build Coastguard Worker #endif // _LIBCPP_HAS_NO_UNICODE_CHARS 54*58b9f456SAndroid Build Coastguard Worker test<std::wstring>(); 55*58b9f456SAndroid Build Coastguard Worker } 56