Use more bucket functions.
[libfirm] / pbqp_node.c
1 #include "adt/array.h"
2
3 #include "assert.h"
4
5 #include "pbqp_node.h"
6 #include "pbqp_node_t.h"
7 #include "pbqp_edge_t.h"
8 #include "vector.h"
9
10 pbqp_node *alloc_node(pbqp *pbqp, unsigned node_index, vector *costs)
11 {
12         pbqp_node *node = obstack_alloc(&pbqp->obstack, sizeof(*node));
13         assert(node);
14
15         node->edges = NEW_ARR_F(pbqp_edge *, 0);
16         node->costs = vector_copy(pbqp, costs);
17         node->bucket_index = UINT_MAX;
18         node->solution = UINT_MAX;
19         node->index = node_index;
20
21         return node;
22 }
23
24 int is_connected(pbqp_node *node, pbqp_edge *edge)
25 {
26         pbqp_edge **edges;
27         unsigned    edge_index;
28         unsigned    edge_len;
29
30         assert(node);
31         assert(edge);
32
33         if (edge->src != node && edge->tgt != node) return 0;
34
35         edges = node->edges;
36         edge_len = ARR_LEN(edges);
37
38         for (edge_index = 0; edge_index < edge_len; ++edge_index) {
39                 pbqp_edge *edge_candidate = edges[edge_index];
40                 if (edge_candidate == edge) {
41                         return 1;
42                 }
43         }
44
45         return 0;
46 }
47
48 void disconnect_edge(pbqp_node *node, pbqp_edge *edge)
49 {
50         pbqp_edge **edges;
51         unsigned    edge_index;
52         unsigned    edge_len;
53
54         edges = node->edges;
55         edge_len = ARR_LEN(edges);
56
57         for (edge_index = 0; edge_index < edge_len; ++edge_index) {
58                 pbqp_edge *edge_candidate = edges[edge_index];
59                 if (edge_candidate == edge) {
60                         edges[edge_index] = edges[edge_len - 1];
61                         ARR_SHRINKLEN(edges, (int)edge_len - 1);
62                         break;
63                 }
64         }
65 }