@@ -44,15 +44,6 @@ template <typename T> ERL_NIF_TERM encode(ErlNifEnv *env, const T &value);
44
44
template <typename T, typename SFINAE = void > struct Decoder ;
45
45
template <typename T, typename SFINAE = void > struct Encoder ;
46
46
47
- enum class HashAlgorithm {
48
- INTERNAL = ERL_NIF_INTERNAL_HASH,
49
- PHASH2 = ERL_NIF_PHASH2,
50
- };
51
-
52
- namespace __private__ {
53
- template <typename T> struct Hasher ;
54
- }
55
-
56
47
namespace __private__ {
57
48
std::vector<ErlNifFunc> &get_erl_nif_funcs ();
58
49
int load (ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info);
@@ -74,13 +65,16 @@ inline ERL_NIF_TERM make_atom(ErlNifEnv *env, const char *msg) {
74
65
// A representation of an atom term.
75
66
class Atom {
76
67
public:
77
- Atom (std::string name) : name(name), term(std::nullopt) {
68
+ Atom (std::string name) : name(std::move( name) ), term(std::nullopt) {
78
69
if (!Atom::initialized) {
79
70
Atom::atoms.push_back (this );
80
71
}
81
72
}
82
73
83
- std::string to_string () const { return this ->name ; }
74
+ public:
75
+ const std::string &to_string () const & noexcept { return this ->name ; }
76
+
77
+ std::string to_string () && noexcept { return this ->name ; }
84
78
85
79
bool operator ==(const Atom &other) const { return this ->name == other.name ; }
86
80
@@ -99,7 +93,8 @@ class Atom {
99
93
}
100
94
101
95
friend struct Encoder <Atom>;
102
- friend struct __private__ ::Hasher<Atom>;
96
+ friend struct Decoder <Atom>;
97
+ friend struct ::std::hash<Atom>;
103
98
104
99
friend int __private__::load (ErlNifEnv *env, void **priv_data,
105
100
ERL_NIF_TERM load_info);
@@ -1111,34 +1106,6 @@ inline int load(ErlNifEnv *env, void **, ERL_NIF_TERM) {
1111
1106
}
1112
1107
} // namespace __private__
1113
1108
1114
- // Hash
1115
- namespace __private__ {
1116
- template <> struct Hasher <Atom> {
1117
- static std::uint64_t hash (HashAlgorithm algorithm, const Atom &atom,
1118
- std::uint64_t salt = 0 ) noexcept {
1119
- return enif_hash (static_cast <ErlNifHash>(algorithm), *atom.term , salt);
1120
- }
1121
- };
1122
-
1123
- template <> struct Hasher <Term> {
1124
- static std::uint64_t hash (HashAlgorithm algorithm, const Term &term,
1125
- std::uint64_t salt = 0 ) noexcept {
1126
- return enif_hash (static_cast <ErlNifHash>(algorithm), term, salt);
1127
- }
1128
- };
1129
- } // namespace __private__
1130
-
1131
- template <HashAlgorithm A = HashAlgorithm::PHASH2, typename T>
1132
- inline static std::uint64_t hash (const T &value, std::uint64_t salt = 0 ) {
1133
- return __private__::Hasher<T>::hash (A, value, salt);
1134
- }
1135
-
1136
- template <typename T>
1137
- inline static std::uint64_t hash (HashAlgorithm algorithm, const T &value,
1138
- std::uint64_t salt = 0 ) {
1139
- return __private__::Hasher<T>::hash (algorithm, value, salt);
1140
- }
1141
-
1142
1109
// Macros
1143
1110
1144
1111
#define FINE_NIF (name, flags ) \
@@ -1199,13 +1166,13 @@ inline static std::uint64_t hash(HashAlgorithm algorithm, const T &value,
1199
1166
namespace std {
1200
1167
template <> struct hash <::fine::Term> {
1201
1168
size_t operator ()(const ::fine::Term &term) noexcept {
1202
- return ::fine::hash<::fine::HashAlgorithm::PHASH2>( term);
1169
+ return enif_hash (ERL_NIF_INTERNAL_HASH, term, 0 );
1203
1170
}
1204
1171
};
1205
1172
1206
1173
template <> struct hash <::fine::Atom> {
1207
- size_t operator ()(const ::fine::Term &term ) noexcept {
1208
- return ::fine:: hash<::fine::HashAlgorithm::PHASH2>(term );
1174
+ size_t operator ()(const ::fine::Atom &atom ) noexcept {
1175
+ return std:: hash<std::string_view>{}(atom. to_string () );
1209
1176
}
1210
1177
};
1211
1178
} // namespace std
0 commit comments