ssize_t mphf_chm_imp_update (mphf_t *mphf, uintmax_t key, uintmax_t value){ // {{{ ssize_t ret; uintmax_t vertex[2], g_old, g_new, edge_id; vertex_list_t vertex_new; chm_imp_t *data = (chm_imp_t *)&mphf->data; if( (ret = chm_imp_check(mphf, WRITEABLE)) < 0) return ret; vertex[0] = ((key ^ data->params.hash1) % data->nvertex); vertex[1] = ((key ^ data->params.hash2) % data->nvertex); #ifdef MPHF_DEBUG printf("mphf: update: %lx value: %.8lx v:{%lx,%lx:%lx:%lx}\n", key, value, vertex[0], vertex[1], data->params.hash1, data->params.hash2 ); #endif if(vertex[0] == vertex[1]) goto insert_new; if(graph_find_edge(data, 2, (uintmax_t *)&vertex, &edge_id) < 0) goto insert_new; if(graph_getg(data, 1, (uintmax_t *)&vertex[1], &g_old) < 0) goto insert_new; g_new = value - g_old; vertex_new.vertex = vertex[1]; vertex_new.next = NULL; if( (ret = graph_recalc(data, &vertex_new, g_old, g_new, edge_id)) < 0) return ret; if( (ret = graph_setg(data, 1, &vertex[1], &g_new)) < 0) return ret; return 0; insert_new: return mphf_chm_imp_insert(mphf, key, value); } // }}}
struct edge * graph_add_edge(struct graph *g, struct vertex *a, struct vertex * b) { if (g->n_edges >= g->max_edges) { g->max_edges *= 2; struct edge ** newarr = (struct edge **)realloc(g->edges, sizeof(struct edge *) * g->max_edges); if (newarr == NULL) return NULL; g->edges = newarr; } struct edge *edge = graph_find_edge(g, a, b); if (edge == NULL) { edge = (struct edge *)malloc(sizeof(struct edge)); edge->from = a; edge->to = b; g->edges[g->n_edges++] = edge; printf("[+] Edge: %d -> %d\n", edge->from->value, edge->to->value); } return edge; }