4 #include "pbqp_edge_t.h"
5 #include "pbqp_node_t.h"
7 int edge_bucket_contains(pbqp_edge_bucket bucket, pbqp_edge *edge)
11 return edge->bucket_index < edge_bucket_get_length(bucket)
12 && bucket[edge->bucket_index] == edge;
15 void edge_bucket_free(pbqp_edge_bucket *bucket)
21 unsigned edge_bucket_get_length(pbqp_edge_bucket bucket)
23 return ARR_LEN(bucket);
26 void edge_bucket_init(pbqp_edge_bucket *bucket)
28 *bucket = NEW_ARR_F(pbqp_edge *, 0);
31 void edge_bucket_insert(pbqp_edge_bucket *bucket, pbqp_edge *edge)
33 edge->bucket_index = edge_bucket_get_length(*bucket);
34 ARR_APP1(pbqp_edge *, *bucket, edge);
37 pbqp_edge *edge_bucket_pop(pbqp_edge_bucket *bucket)
39 unsigned bucket_len = edge_bucket_get_length(*bucket);
42 assert(bucket_len > 0);
44 edge = (*bucket)[bucket_len - 1];
46 ARR_SHRINKLEN(*bucket, (int)bucket_len - 1);
47 edge->bucket_index = UINT_MAX;
52 int node_bucket_contains(pbqp_node_bucket bucket, pbqp_node *node)
56 return node->bucket_index < node_bucket_get_length(bucket)
57 && bucket[node->bucket_index] == node;
60 void node_bucket_free(pbqp_node_bucket *bucket)
66 unsigned node_bucket_get_length(pbqp_node_bucket bucket)
68 return ARR_LEN(bucket);
71 void node_bucket_init(pbqp_node_bucket *bucket)
73 *bucket = NEW_ARR_F(pbqp_node *, 0);
76 void node_bucket_insert(pbqp_node_bucket *bucket, pbqp_node *node)
78 node->bucket_index = node_bucket_get_length(*bucket);
79 ARR_APP1(pbqp_node *, *bucket, node);
82 void node_bucket_remove(pbqp_node_bucket *bucket, pbqp_node *node)
84 unsigned last_bucket_index = node_bucket_get_length(*bucket) - 1;
89 assert(node_bucket_contains(*bucket, node));
91 node_index = node->index;
92 other = (*bucket)[last_bucket_index];
93 other->bucket_index = node_index;
94 (*bucket)[node_index] = other;
96 ARR_SHRINKLEN(*bucket, last_bucket_index);