explicit constexpr Aspect(const char *name);
constexpr operator const char *() const;
+
+ struct Hash {
+ size_t operator()(const Aspect &key) const;
+ };
};
// Non-member functions //
namespace ucl {
+ // Aspect<CHILD>::Hash //
+
+ template <class CHILD>
+ size_t Aspect<CHILD>::Hash::operator()(const Aspect<CHILD> &key) const
+ {
+ constexpr size_t PRIME = 31;
+ size_t result = 0;
+ for (size_t i = 0; (key.name[i] != '\0'); ++i) {
+ result *= PRIME;
+ result += key.name[i];
+ }
+ return result;
+ }
+
+ // Aspect<CHILD> //
+
template <class CHILD>
constexpr Aspect<CHILD>::Aspect() :
name(nullptr)
}
};
- using Hash = typename std::conditional<std::is_enum<KEY>::value,
- EnumClassHash<KEY>, std::hash<KEY>>::type;
+ template <class KEY2, class = void>
+ struct GetHash {
+ using Type = std::hash<KEY2>;
+ };
+
+ template <class KEY2>
+ struct GetHash<KEY2, typename std::enable_if<
+ std::is_enum<KEY2>::value>::type> {
+ using Type = EnumClassHash<KEY2>;
+ };
+
+ template <class KEY2>
+ struct GetHash<KEY2, typename std::enable_if<
+ std::is_class<typename KEY2::Hash>::value>::type> {
+ using Type = typename KEY2::Hash;
+ };
+
+ using Hash = typename GetHash<KEY>::Type;
private:
std::unordered_map<KEY, VALUE, Hash> m_map;