24 HashTable::HashTable()
26 v_table =
nullptr; e_table =
nullptr;
29 HashTable::~HashTable()
36 v_table = e_table =
nullptr;
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)
51 while (node !=
nullptr)
54 ptr = &((*ptr)->next_hash);
67 return nodes.get_num_items();
72 return nodes.get_size();
81 v_table =
new Node*[mask + 1];
82 e_table =
new Node*[mask + 1];
83 for (
int i = 0; i <= mask; i++)
85 copy_list(v_table + i, ht->v_table[i]);
86 copy_list(e_table + i, ht->e_table[i]);
92 memset(v_table, 0, (mask + 1) *
sizeof(
Node*));
93 memset(e_table, 0, (mask + 1) *
sizeof(
Node*));
96 for_all_nodes(node,
this)
98 int p1 = node->
p1, p2 = node->p2;
99 if (p1 > p2) std::swap(p1, p2);
100 int idx = hash(p1, p2);
102 if (node->
type == HERMES_TYPE_VERTEX)
118 if (v_table !=
nullptr)
123 if (e_table !=
nullptr)
130 inline Node* HashTable::search_list(
Node* node,
int p1,
int p2)
const
132 while (node !=
nullptr)
134 if (node->
p1 == p1 && node->p2 == p2)
144 if (p1 > p2) std::swap(p1, p2);
145 int i = hash(p1, p2);
146 Node* node = search_list(v_table[i], p1, p2);
154 newnode->
type = HERMES_TYPE_VERTEX;
161 newnode->y = (
nodes[p1].y +
nodes[p2].y) * 0.5;
165 v_table[i] = newnode;
173 if (p1 > p2) std::swap(p1, p2);
174 int i = hash(p1, p2);
175 Node* node = search_list(e_table[i], p1, p2);
176 if (node !=
nullptr)
return node;
182 newnode->
type = HERMES_TYPE_EDGE;
188 newnode->
elem[0] = newnode->
elem[1] =
nullptr;
192 e_table[i] = newnode;
199 if (p1 > p2) std::swap(p1, p2);
200 return search_list(v_table[hash(p1, p2)], p1, p2);
205 if (p1 > p2) std::swap(p1, p2);
206 return search_list(e_table[hash(p1, p2)], p1, p2);
213 Node** ptr = v_table + i;
215 while (node !=
nullptr)
234 Node** ptr = e_table + i;
236 while (node !=
nullptr)
::xsd::cxx::tree::id< char, ncname > id
C++ type corresponding to the ID XML Schema built-in type.
double x
vertex node coordinates
Node * peek_edge_node(int p1, int p2) const
Returns an edge node with parent id's p1 and p2 if it exists, nullptr otherwise.
unsigned type
0 = vertex node; 1 = edge node
Node * get_vertex_node(int p1, int p2)
void init(int size=H2D_DEFAULT_HASH_SIZE)
Node * get_edge_node(int p1, int p2)
Node * next_hash
next node in hash synonym list
Element * elem[2]
elements sharing the edge node
void remove_edge_node(int id)
Removes an edge node with parent id's p1 and p2.
Node * get_node(int id) const
Retrieves a node by its id number.
void remove_vertex_node(int id)
Removes a vertex node with parent id's p1 and p2.
void rebuild()
Reconstructs the hashtable, after, e.g., the nodes have been loaded from a file.
Common definitions for Hermes2D.
Stores one node of a mesh.
::xsd::cxx::tree::type type
C++ type corresponding to the anyType XML Schema built-in type.
void free()
Frees all memory used by the instance.
Node * peek_vertex_node(int p1, int p2) const
Returns a vertex node with parent id's p1 and p2 if it exists, nullptr otherwise. ...
int get_num_nodes() const
Returns the total number of nodes stored.
Array< Node > nodes
Array storing all nodes.
unsigned bnd
1 = boundary node; 0 = inner node
unsigned ref
the number of elements using the node
void copy(const HashTable *ht)
Copies another hash table contents.
Stores and searches node tables.
int get_max_node_id() const
Returns the maximum node id number plus one.