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