19e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow//===----------------------------------------------------------------------===// 29e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// 39e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// The LLVM Compiler Infrastructure 49e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// 59e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 69e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// Source Licenses. See LICENSE.TXT for details. 79e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// 89e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow//===----------------------------------------------------------------------===// 99e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 109e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// <functional> 119e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 129e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// make sure that we can hash enumeration values 139e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow// Not very portable 149e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 159e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#include <__config> 169e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 179e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#if _LIBCPP_STD_VER > 11 189e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 199e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#include <functional> 209e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#include <cassert> 219e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#include <type_traits> 229e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#include <limits> 239e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 249e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum class Colors { red, orange, yellow, green, blue, indigo, violet }; 259e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum class Cardinals { zero, one, two, three, five=5 }; 269e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum class LongColors : short { red, orange, yellow, green, blue, indigo, violet }; 279e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum class ShortColors : long { red, orange, yellow, green, blue, indigo, violet }; 289e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum class EightBitColors : uint8_t { red, orange, yellow, green, blue, indigo, violet }; 299e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 309e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowenum Fruits { apple, pear, grape, mango, cantaloupe }; 319e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 329e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowtemplate <class T> 339e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowvoid 349e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowtest() 359e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow{ 369e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow static_assert((std::is_base_of<std::unary_function<T, std::size_t>, 379e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow std::hash<T> >::value), ""); 389e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow typedef typename std::underlying_type<T>::type under_type; 399e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 409e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow std::hash<T> h1; 419e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow std::hash<under_type> h2; 429e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow for (int i = 0; i <= 5; ++i) 439e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow { 449e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow T t(static_cast<T> (i)); 459e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow if (sizeof(T) <= sizeof(std::size_t)) 469e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow assert(h1(t) == h2(static_cast<under_type>(i))); 479e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow } 489e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow} 499e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 509e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowint main() 519e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow{ 529e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<Cardinals>(); 539e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 549e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<Colors>(); 559e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<ShortColors>(); 569e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<LongColors>(); 579e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<EightBitColors>(); 589e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow 599e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow test<Fruits>(); 609e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow} 619e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#else 629e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clowint main () {} 639e613ca1b359b4f5c15191650bf3b772a79aacc8Marshall Clow#endif 64