/* Hash Functions * Resize the hash to minumim for this number of entries */ DirectResult fusion_hash_resize (FusionHash *hash) { FusionHashNode **new_nodes; FusionHashNode *node; FusionHashNode *next; unsigned int hash_val; int new_size; int i; D_MAGIC_ASSERT( hash, FusionHash ); new_size = spaced_primes_closest (hash->nnodes); if (new_size > FUSION_HASH_MAX_SIZE ) new_size = FUSION_HASH_MAX_SIZE; if (new_size < FUSION_HASH_MIN_SIZE) new_size = FUSION_HASH_MIN_SIZE; if (hash->local) new_nodes = D_CALLOC (new_size, sizeof(FusionHashNode*)); else new_nodes = SHCALLOC (hash->pool, new_size, sizeof(FusionHashNode*)); if (!new_nodes) return hash->local?DFB_NOSYSTEMMEMORY:DFB_NOSHAREDMEMORY; for (i = 0; i < hash->size; i++) for (node = hash->nodes[i]; node; node = next) { next = node->next; /*TODO We could also optimize pointer hashing*/ if (hash->key_type == HASH_STRING ) { unsigned int h; const signed char *p = node->key; HASH_STR(h, p) hash_val = h % new_size; } else hash_val = ((unsigned long)node->key) % new_size; node->next = new_nodes[hash_val]; new_nodes[hash_val] = node; } if (hash->local) D_FREE(hash->nodes); else SHFREE(hash->pool, hash->nodes); hash->nodes = new_nodes; hash->size = new_size; return true; }
void addTerm(const std::string &term) { S.insert(HASH_STR(term)); }
void setStart(const std::string &st) { start = HASH_STR(st); }
void addEdge(const std::string &from, const char token, const std::string &to) { M[HASH_STR(from)][token] = HASH_STR(to); }