Use more bucket functions.
[libfirm] / bucket.c
1 #include "adt/array.h"
2
3 #include "bucket.h"
4 #include "pbqp_edge_t.h"
5 #include "pbqp_node_t.h"
6
7 int edge_bucket_contains(pbqp_edge_bucket bucket, pbqp_edge *edge)
8 {
9         assert(edge);
10
11         return edge->bucket_index < edge_bucket_get_length(bucket)
12                         && bucket[edge->bucket_index] == edge;
13 }
14
15 void edge_bucket_free(pbqp_edge_bucket *bucket)
16 {
17         DEL_ARR_F(*bucket);
18         *bucket = NULL;
19 }
20
21 unsigned edge_bucket_get_length(pbqp_edge_bucket bucket)
22 {
23         return ARR_LEN(bucket);
24 }
25
26 void edge_bucket_init(pbqp_edge_bucket *bucket)
27 {
28         *bucket = NEW_ARR_F(pbqp_edge *, 0);
29 }
30
31 void edge_bucket_insert(pbqp_edge_bucket *bucket, pbqp_edge *edge)
32 {
33         edge->bucket_index = edge_bucket_get_length(*bucket);
34         ARR_APP1(pbqp_edge *, *bucket, edge);
35 }
36
37 int node_bucket_contains(pbqp_node_bucket bucket, pbqp_node *node)
38 {
39         assert(node);
40
41         return node->bucket_index < node_bucket_get_length(bucket)
42                         && bucket[node->bucket_index] == node;
43 }
44
45 void node_bucket_free(pbqp_node_bucket *bucket)
46 {
47         DEL_ARR_F(*bucket);
48         *bucket = NULL;
49 }
50
51 unsigned node_bucket_get_length(pbqp_node_bucket bucket)
52 {
53         return ARR_LEN(bucket);
54 }
55
56 void node_bucket_init(pbqp_node_bucket *bucket)
57 {
58         *bucket = NEW_ARR_F(pbqp_node *, 0);
59 }
60
61 void node_bucket_insert(pbqp_node_bucket *bucket, pbqp_node *node)
62 {
63         node->bucket_index = node_bucket_get_length(*bucket);
64         ARR_APP1(pbqp_node *, *bucket, node);
65 }
66
67 void node_bucket_remove(pbqp_node_bucket *bucket, pbqp_node *node)
68 {
69         unsigned   last_bucket_index = node_bucket_get_length(*bucket) - 1;
70         unsigned   node_index;
71         pbqp_node *other;
72
73         assert(node);
74         assert(node_bucket_contains(*bucket, node));
75
76         node_index            = node->index;
77         other                 = (*bucket)[last_bucket_index];
78         other->bucket_index   = node_index;
79         (*bucket)[node_index] = other;
80
81         ARR_SHRINKLEN(*bucket, last_bucket_index);
82 }