Add specialized hash() for type dict and use a dict instead of a std::map for techmap_cache and techmap_do_cache.
This commit is contained in:
@@ -19,6 +19,12 @@
|
||||
|
||||
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;
|
||||
|
||||
@@ -100,6 +106,20 @@ 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;
|
||||
@@ -191,11 +211,6 @@ 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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user