Skip to content

Commit

Permalink
Add std::hash specialization for rich-enums
Browse files Browse the repository at this point in the history
  • Loading branch information
alexkaratarakis committed Sep 12, 2024
1 parent 5d624d8 commit 97800b0
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/fixed_containers/enum_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -635,3 +635,13 @@ class NonDefaultConstructibleSkeletalRichEnum
};

} // namespace fixed_containers::rich_enums

template <fixed_containers::rich_enums::is_rich_enum RichEnumType>
struct std::hash<RichEnumType>
{
// std::hash<BackingEnum> is not constexpr
/*constexpr*/ std::size_t operator()(const RichEnumType& val) const noexcept
{
return std::hash<typename RichEnumType::BackingEnum>{}(val.backing_enum());
}
};
28 changes: 28 additions & 0 deletions test/enum_utils_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,34 @@ TEST(RichEnum, BoolNegate)
}
}

TEST(RichEnum, StdHash)
{
{
std::size_t hash_value_of_backing_enum =
std::hash<detail::TestRichEnum1BackingEnum>{}(detail::TestRichEnum1BackingEnum::C_ONE);
std::size_t hash_value_of_rich_enum = std::hash<TestRichEnum1>{}(TestRichEnum1::C_ONE());
ASSERT_EQ(hash_value_of_backing_enum, hash_value_of_rich_enum);
}
{
std::size_t hash_value_of_backing_enum =
std::hash<detail::TestRichEnum1BackingEnum>{}(detail::TestRichEnum1BackingEnum::C_TWO);
std::size_t hash_value_of_rich_enum = std::hash<TestRichEnum1>{}(TestRichEnum1::C_TWO());
ASSERT_EQ(hash_value_of_backing_enum, hash_value_of_rich_enum);
}
{
std::size_t hash_value_of_backing_enum = std::hash<detail::TestRichEnum1BackingEnum>{}(
detail::TestRichEnum1BackingEnum::C_THREE);
std::size_t hash_value_of_rich_enum = std::hash<TestRichEnum1>{}(TestRichEnum1::C_THREE());
ASSERT_EQ(hash_value_of_backing_enum, hash_value_of_rich_enum);
}
{
std::size_t hash_value_of_backing_enum =
std::hash<detail::TestRichEnum1BackingEnum>{}(detail::TestRichEnum1BackingEnum::C_FOUR);
std::size_t hash_value_of_rich_enum = std::hash<TestRichEnum1>{}(TestRichEnum1::C_FOUR());
ASSERT_EQ(hash_value_of_backing_enum, hash_value_of_rich_enum);
}
}

static_assert(IsStructuralType<TestRichEnum1>);

namespace
Expand Down

0 comments on commit 97800b0

Please sign in to comment.