kernel: Re-implement `dict` hash code as a `dict` member function instead of a specia...
authorAlberto Gonzalez <boqwxp@airmail.cc>
Wed, 22 Apr 2020 22:04:22 +0000 (22:04 +0000)
committerAlberto Gonzalez <boqwxp@airmail.cc>
Thu, 14 May 2020 20:06:55 +0000 (20:06 +0000)
kernel/hashlib.h

index cdbad87c41e49b40f1bdb51154132338f47ce84c..18114b6ad119ff6e27b29a909f62f8d7b2e0b163 100644 (file)
 
 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(); }