From 2df60da7bee3a9fde96370ca091f02724ce4afae Mon Sep 17 00:00:00 2001 From: IAmTrial Date: Mon, 2 Jul 2018 20:48:20 -0700 Subject: [PATCH 1/2] Allow enum types to be used as frozen keys Signed-off-by: IAmTrial --- include/frozen/bits/elsa.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/frozen/bits/elsa.h b/include/frozen/bits/elsa.h index f807c75..a73d5d2 100644 --- a/include/frozen/bits/elsa.h +++ b/include/frozen/bits/elsa.h @@ -26,11 +26,11 @@ namespace frozen { template struct elsa { - static_assert(std::is_integral::value, + static_assert(std::is_integral::value || std::is_enum::value, "only supports integral types, specialize for other types"); constexpr std::size_t operator()(T const &value, std::size_t seed) const { - std::size_t key = seed ^ value; + std::size_t key = seed ^ static_cast(value); key = (~key) + (key << 21); // key = (key << 21) - key - 1; key = key ^ (key >> 24); key = (key + (key << 3)) + (key << 8); // key * 265 From 1e1b029dc44c202bb7bd2be1efffb0b932ea3ca2 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Sat, 7 Jul 2018 11:56:19 +0200 Subject: [PATCH 2/2] Extra test case for hashing of enum key --- tests/test_unordered_set.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_unordered_set.cpp b/tests/test_unordered_set.cpp index f2ff076..115251a 100644 --- a/tests/test_unordered_set.cpp +++ b/tests/test_unordered_set.cpp @@ -125,6 +125,15 @@ TEST_CASE("frozen::unordered_set <> std::unordered_set", } +TEST_CASE("frozen::unordered_set with enum keys", "[unordered_set]") { + enum class some_enum { + A,B,C + }; + constexpr frozen::unordered_set frozen_set = { some_enum::A, some_enum::B }; + REQUIRE(frozen_set.count(some_enum::A) == 1); + REQUIRE(frozen_set.count(some_enum::C) == 0); +} + TEST_CASE("frozen::unordered_set <> frozen::make_unordered_set", "[unordered_set]") { constexpr frozen::unordered_set frozen_set = { INIT_SEQ }; constexpr auto frozen_set2 = frozen::make_unordered_set({INIT_SEQ});