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 void node_bucket_clear(pbqp_node_bucket *bucket)
54 ARR_SHRINKLEN(*bucket, 0);
57 int node_bucket_contains(pbqp_node_bucket bucket, pbqp_node *node)
61 return node->bucket_index < node_bucket_get_length(bucket)
62 && bucket[node->bucket_index] == node;
65 void node_bucket_copy(pbqp_node_bucket *dst, pbqp_node_bucket *src)
68 unsigned src_length = node_bucket_get_length(*src);
70 for (src_index = 0; src_index < src_length; ++src_index) {
71 node_bucket_insert(dst, (*src)[src_index]);
75 void node_bucket_free(pbqp_node_bucket *bucket)
81 unsigned node_bucket_get_length(pbqp_node_bucket bucket)
83 return ARR_LEN(bucket);
86 void node_bucket_init(pbqp_node_bucket *bucket)
88 *bucket = NEW_ARR_F(pbqp_node *, 0);
91 void node_bucket_insert(pbqp_node_bucket *bucket, pbqp_node *node)
93 node->bucket_index = node_bucket_get_length(*bucket);
94 ARR_APP1(pbqp_node *, *bucket, node);
97 pbqp_node *node_bucket_pop(pbqp_node_bucket *bucket)
99 unsigned bucket_len = node_bucket_get_length(*bucket);
102 assert(bucket_len > 0);
104 node = (*bucket)[bucket_len - 1];
107 ARR_SHRINKLEN(*bucket, (int)bucket_len - 1);
108 node->bucket_index = UINT_MAX;
113 void node_bucket_remove(pbqp_node_bucket *bucket, pbqp_node *node)
115 unsigned bucket_len = node_bucket_get_length(*bucket);
120 assert(node_bucket_contains(*bucket, node));
121 assert(bucket_len > 0);
123 node_index = node->bucket_index;
124 other = (*bucket)[bucket_len - 1];
125 other->bucket_index = node_index;
126 (*bucket)[node_index] = other;
128 ARR_SHRINKLEN(*bucket, (int)bucket_len - 1);
129 node->bucket_index = UINT_MAX;
132 pbqp_node_bucket *node_bucket_deep_copy(pbqp_node_bucket bucket)
134 pbqp_node_bucket *copy;
135 unsigned bucket_index;
136 unsigned bucket_length;
138 node_bucket_init(copy);
139 bucket_length = node_bucket_get_length(bucket);
141 for (bucket_index = 0; bucket_index < bucket_length; ++bucket_index) {
142 node_bucket_insert(copy, pbqp_node_deep_copy(bucket[bucket_index]));