@@ -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);
@@ -1081,34 +1076,6 @@ inline int load(ErlNifEnv *env, void **, ERL_NIF_TERM) {
1081
1076
}
1082
1077
} // namespace __private__
1083
1078
1084
- // Hash
1085
- namespace __private__ {
1086
- template <> struct Hasher <Atom> {
1087
- static std::uint64_t hash (HashAlgorithm algorithm, const Atom &atom,
1088
- std::uint64_t salt = 0 ) noexcept {
1089
- return enif_hash (static_cast <ErlNifHash>(algorithm), *atom.term , salt);
1090
- }
1091
- };
1092
-
1093
- template <> struct Hasher <Term> {
1094
- static std::uint64_t hash (HashAlgorithm algorithm, const Term &term,
1095
- std::uint64_t salt = 0 ) noexcept {
1096
- return enif_hash (static_cast <ErlNifHash>(algorithm), term, salt);
1097
- }
1098
- };
1099
- } // namespace __private__
1100
-
1101
- template <HashAlgorithm A = HashAlgorithm::PHASH2, typename T>
1102
- inline static std::uint64_t hash (const T &value, std::uint64_t salt = 0 ) {
1103
- return __private__::Hasher<T>::hash (A, value, salt);
1104
- }
1105
-
1106
- template <typename T>
1107
- inline static std::uint64_t hash (HashAlgorithm algorithm, const T &value,
1108
- std::uint64_t salt = 0 ) {
1109
- return __private__::Hasher<T>::hash (algorithm, value, salt);
1110
- }
1111
-
1112
1079
// Macros
1113
1080
1114
1081
#define FINE_NIF (name, flags ) \
@@ -1169,13 +1136,13 @@ inline static std::uint64_t hash(HashAlgorithm algorithm, const T &value,
1169
1136
namespace std {
1170
1137
template <> struct hash <::fine::Term> {
1171
1138
size_t operator ()(const ::fine::Term &term) noexcept {
1172
- return ::fine::hash<::fine::HashAlgorithm::PHASH2>( term);
1139
+ return enif_hash (ERL_NIF_INTERNAL_HASH, term, 0 );
1173
1140
}
1174
1141
};
1175
1142
1176
1143
template <> struct hash <::fine::Atom> {
1177
- size_t operator ()(const ::fine::Term &term ) noexcept {
1178
- return ::fine:: hash<::fine::HashAlgorithm::PHASH2>(term );
1144
+ size_t operator ()(const ::fine::Atom &atom ) noexcept {
1145
+ return std:: hash<std::string_view>{}(atom. to_string () );
1179
1146
}
1180
1147
};
1181
1148
} // namespace std
0 commit comments