24 HashTable::HashTable()
26 v_table = NULL; e_table = NULL;
29 HashTable::~HashTable()
36 v_table = e_table = NULL;
39 if(size & mask)
throw Hermes::Exceptions::Exception(
"Parameter 'size' must be a power of two.");
42 v_table =
new Node*[size];
43 e_table =
new Node*[size];
45 memset(v_table, 0, size *
sizeof(
Node*));
46 memset(e_table, 0, size *
sizeof(
Node*));
49 void HashTable::copy_list(
Node** ptr,
Node* node)
54 ptr = &((*ptr)->next_hash);
68 return nodes.get_num_items();
74 return nodes.get_size();
83 v_table =
new Node*[mask + 1];
84 e_table =
new Node*[mask + 1];
85 for (
int i = 0; i <= mask; i++)
87 copy_list(v_table + i, ht->v_table[i]);
88 copy_list(e_table + i, ht->e_table[i]);
94 memset(v_table, 0, (mask + 1) *
sizeof(
Node*));
95 memset(e_table, 0, (mask + 1) *
sizeof(
Node*));
98 for_all_nodes(node,
this)
100 int p1 = node->p1, p2 = node->
p2;
101 if(p1 > p2) std::swap(p1, p2);
102 int idx = hash(p1, p2);
104 if(node->
type == HERMES_TYPE_VERTEX)
132 inline Node* HashTable::search_list(
Node* node,
int p1,
int p2)
const
136 if(node->p1 == p1 && node->
p2 == p2)
146 if(p1 > p2) std::swap(p1, p2);
147 int i = hash(p1, p2);
148 Node* node = search_list(v_table[i], p1, p2);
156 newnode->
type = HERMES_TYPE_VERTEX;
162 newnode->x = (
nodes[p1].x +
nodes[p2].x) * 0.5;
167 v_table[i] = newnode;
175 if(p1 > p2) std::swap(p1, p2);
176 int i = hash(p1, p2);
177 Node* node = search_list(e_table[i], p1, p2);
178 if(node != NULL)
return node;
184 newnode->
type = HERMES_TYPE_EDGE;
190 newnode->
elem[0] = newnode->
elem[1] = NULL;
194 e_table[i] = newnode;
201 if(p1 > p2) std::swap(p1, p2);
202 return search_list(v_table[hash(p1, p2)], p1, p2);
207 if(p1 > p2) std::swap(p1, p2);
208 return search_list(e_table[hash(p1, p2)], p1, p2);
215 Node** ptr = v_table + i;
236 Node** ptr = e_table + i;