aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorAlberto Gonzalez <boqwxp@airmail.cc>2020-04-22 22:04:22 +0000
committerAlberto Gonzalez <boqwxp@airmail.cc>2020-05-14 20:06:55 +0000
commit35b94d1f664928dcf8476a9a6f35e2bb7f647ee1 (patch)
tree8678b64ebd0713946ff17844a70b3d1b631fd223 /kernel
parente17329164904f05efa48be63fbb73ec8afdda8e4 (diff)
downloadyosys-35b94d1f664928dcf8476a9a6f35e2bb7f647ee1.tar.gz
yosys-35b94d1f664928dcf8476a9a6f35e2bb7f647ee1.tar.bz2
yosys-35b94d1f664928dcf8476a9a6f35e2bb7f647ee1.zip
kernel: Re-implement `dict` hash code as a `dict` member function instead of a specialized template for `hash_ops`.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hashlib.h34
1 files changed, 14 insertions, 20 deletions
diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index cdbad87c4..18114b6ad 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -19,12 +19,6 @@
namespace hashlib {
-template<typename T> struct hash_ops;
-template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
-template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
-template<typename K, typename OPS = hash_ops<K>> class pool;
-template<typename K, typename OPS = hash_ops<K>> class mfp;
-
const int hashtable_size_trigger = 2;
const int hashtable_size_factor = 3;
@@ -106,20 +100,6 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
}
};
-template<typename P, typename Q> struct hash_ops<dict<P, Q>> {
- static inline bool cmp(dict<P, Q> a, dict<P, Q> b) {
- return a == b;
- }
- static inline unsigned int hash(dict<P, Q> a) {
- unsigned int h = mkhash_init;
- for (auto &it : a) {
- h = mkhash(h, hash_ops<P>::hash(it.first));
- h = mkhash(h, hash_ops<Q>::hash(it.second));
- }
- return h;
- }
-};
-
template<typename... T> struct hash_ops<std::tuple<T...>> {
static inline bool cmp(std::tuple<T...> a, std::tuple<T...> b) {
return a == b;
@@ -211,6 +191,11 @@ inline int hashtable_size(int min_size)
throw std::length_error("hash table exceeded maximum size.");
}
+template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
+template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
+template<typename K, typename OPS = hash_ops<K>> class pool;
+template<typename K, typename OPS = hash_ops<K>> class mfp;
+
template<typename K, typename T, typename OPS>
class dict
{
@@ -630,6 +615,15 @@ public:
return !operator==(other);
}
+ unsigned int hash() const {
+ unsigned int h = mkhash_init;
+ for (auto &it : entries) {
+ h = mkhash(h, hash_ops<K>::hash(it.udata.first));
+ h = mkhash(h, hash_ops<T>::hash(it.udata.second));
+ }
+ return h;
+ }
+
void reserve(size_t n) { entries.reserve(n); }
size_t size() const { return entries.size(); }
bool empty() const { return entries.empty(); }