diff options
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(); }  | 
