diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2013-09-03 17:55:32 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2013-09-03 17:55:32 +0000 |
commit | 5155a569d184fb2648000bb2a2bde843bf300961 (patch) | |
tree | c4a04072a9a47cde90195e5ac522b1638d5a77be /libcxx/test/utilities/function.objects | |
parent | aeb5b46a854e7b8c28ac52aa66e8d544a38adf7e (diff) | |
download | bcm5719-llvm-5155a569d184fb2648000bb2a2bde843bf300961.tar.gz bcm5719-llvm-5155a569d184fb2648000bb2a2bde843bf300961.zip |
LWG Issue 2148: Hashing Enums
llvm-svn: 189831
Diffstat (limited to 'libcxx/test/utilities/function.objects')
-rw-r--r-- | libcxx/test/utilities/function.objects/unord.hash/enum.fail.cpp | 24 | ||||
-rw-r--r-- | libcxx/test/utilities/function.objects/unord.hash/enum.pass.cpp | 63 |
2 files changed, 87 insertions, 0 deletions
diff --git a/libcxx/test/utilities/function.objects/unord.hash/enum.fail.cpp b/libcxx/test/utilities/function.objects/unord.hash/enum.fail.cpp new file mode 100644 index 00000000000..9e44bfb7781 --- /dev/null +++ b/libcxx/test/utilities/function.objects/unord.hash/enum.fail.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <functional> + +// Hashing a struct w/o a defined hash should fail. + +#include <functional> +#include <cassert> +#include <type_traits> + +struct X {}; + +int main() +{ + X x; + size_t h = std::hash<X>{} ( x ); +} diff --git a/libcxx/test/utilities/function.objects/unord.hash/enum.pass.cpp b/libcxx/test/utilities/function.objects/unord.hash/enum.pass.cpp new file mode 100644 index 00000000000..b5cd6f8454d --- /dev/null +++ b/libcxx/test/utilities/function.objects/unord.hash/enum.pass.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <functional> + +// make sure that we can hash enumeration values +// Not very portable + +#include <__config> + +#if _LIBCPP_STD_VER > 11 + +#include <functional> +#include <cassert> +#include <type_traits> +#include <limits> + +enum class Colors { red, orange, yellow, green, blue, indigo, violet }; +enum class Cardinals { zero, one, two, three, five=5 }; +enum class LongColors : short { red, orange, yellow, green, blue, indigo, violet }; +enum class ShortColors : long { red, orange, yellow, green, blue, indigo, violet }; +enum class EightBitColors : uint8_t { red, orange, yellow, green, blue, indigo, violet }; + +enum Fruits { apple, pear, grape, mango, cantaloupe }; + +template <class T> +void +test() +{ + static_assert((std::is_base_of<std::unary_function<T, std::size_t>, + std::hash<T> >::value), ""); + typedef typename std::underlying_type<T>::type under_type; + + std::hash<T> h1; + std::hash<under_type> h2; + for (int i = 0; i <= 5; ++i) + { + T t(static_cast<T> (i)); + if (sizeof(T) <= sizeof(std::size_t)) + assert(h1(t) == h2(static_cast<under_type>(i))); + } +} + +int main() +{ + test<Cardinals>(); + + test<Colors>(); + test<ShortColors>(); + test<LongColors>(); + test<EightBitColors>(); + + test<Fruits>(); +} +#else +int main () {} +#endif |