diff options
author | Alberto Gonzalez <boqwxp@airmail.cc> | 2020-04-22 22:04:22 +0000 |
---|---|---|
committer | Alberto Gonzalez <boqwxp@airmail.cc> | 2020-05-14 20:06:55 +0000 |
commit | 35b94d1f664928dcf8476a9a6f35e2bb7f647ee1 (patch) | |
tree | 8678b64ebd0713946ff17844a70b3d1b631fd223 /kernel | |
parent | e17329164904f05efa48be63fbb73ec8afdda8e4 (diff) | |
download | yosys-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.h | 34 |
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(); } |