Example #1
0
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);
} // }}}
Example #2
0
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;

}