Support using better-enum as key in dictionaries and maps (#77)

This enabled hashing so that unordered_map are supported.
This commit is contained in:
Sven Scharmentke 2019-07-16 11:36:16 +02:00 committed by Anton Bachin
parent 8a0d376b53
commit 5a677ac72b
2 changed files with 49 additions and 17 deletions

11
enum.h
View File

@ -1283,4 +1283,15 @@ BETTER_ENUMS_CONSTEXPR_ map<Enum, T> make_map(T (*f)(Enum))
} }
#define BETTER_ENUMS_DECLARE_STD_HASH(type) \
namespace std { \
template <> struct hash<type> \
{ \
size_t operator()(const type &x) const \
{ \
return std::hash<size_t>()(x._to_integral()); \
} \
}; \
}
#endif // #ifndef BETTER_ENUMS_ENUM_H #endif // #ifndef BETTER_ENUMS_ENUM_H

View File

@ -31,7 +31,10 @@ BETTER_ENUM(Namespaced, short, One, Two)
// be changed to be more precise in the future. // be changed to be more precise in the future.
#ifdef BETTER_ENUMS_HAVE_CONSTEXPR_ #ifdef BETTER_ENUMS_HAVE_CONSTEXPR_
BETTER_ENUMS_DECLARE_STD_HASH(Channel)
#include <type_traits> #include <type_traits>
#include <functional>
// Type properties. // Type properties.
static_assert_1(std::is_class<Channel>()); static_assert_1(std::is_class<Channel>());
@ -161,6 +164,24 @@ static_assert_1(same_string(Depth::_names()[0], "HighColor"));
// Run-time testing. // Run-time testing.
class HashTests : public CxxTest::TestSuite {
public:
void test_same_values()
{
#ifdef _ENUM_HAVE_CONSTEXPR
TS_ASSERT_EQUALS(
std::hash<Channel>().operator()(Channel::Red),
std::hash<int>().operator()(0));
TS_ASSERT_EQUALS(
std::hash<Channel>().operator()(Channel::Green),
std::hash<int>().operator()(1));
TS_ASSERT_EQUALS(
std::hash<Channel>().operator()(Channel::Blue),
std::hash<int>().operator()(2));
#endif // #ifdef _ENUM_HAVE_CONSTEXPR
}
};
class EnumTests : public CxxTest::TestSuite { class EnumTests : public CxxTest::TestSuite {
public: public:
void test_constant_values() void test_constant_values()