Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/meshgen2d/src/PQ.cpp
3196 views
1
#include "PQ.h"
2
#include <algorithm>
3
#include <assert.h>
4
#include <iostream>
5
#include <string.h>
6
7
pq::
8
pq(int chunk)
9
{ last = -1; pq_size = 0; pq_reserve(chunk); }
10
11
int pq::
12
size()
13
{
14
return last + 1;
15
}
16
17
Vertex * pq::
18
first()
19
{
20
if( last < 0 ) return (Vertex *) 0;
21
22
Vertex *v = store[0];
23
24
if( last > 0 ) remove( v );
25
else
26
{
27
v->setHeap( -1 );
28
last = -1;
29
store[0] = (Vertex *) 0;
30
}
31
32
return v;
33
}
34
35
void pq::
36
remove( Vertex *vtx )
37
{
38
int h = vtx->atHeap();
39
40
if( h == last )
41
{
42
vtx->setHeap( -1 );
43
store[last] = (Vertex *) 0;
44
last = last - 1;
45
return;
46
}
47
48
vtx->setHeap( -1 );
49
50
store[h] = store[last];
51
store[h]->setHeap( h );
52
53
store[last] = (Vertex *) 0;
54
last = last - 1;
55
56
if (h > 0 && store[(h - 1) / 2]->orderingValue() < store[h]->orderingValue())
57
upheap( h );
58
else
59
downheap( h );
60
}
61
62
void pq::
63
insert( Vertex *vtx )
64
{
65
last = last + 1;
66
67
if(last == pq_size)
68
{
69
pq_reserve(2 * pq_size);
70
}
71
72
store[last] = vtx;
73
store[last]->setHeap( last );
74
75
upheap( last );
76
}
77
78
void pq::
79
removeRelevants( std::list< Vertex* >& vl )
80
{
81
std::list< Vertex* >::iterator it;
82
for( it = vl.begin(); it != vl.end(); ++it)
83
{
84
if( (*it)->isAtHeap() )
85
{
86
remove( *it );
87
}
88
}
89
}
90
91
void pq::
92
debug()
93
{
94
int i;
95
std::cout << "Size: " << last + 1 << std::endl;
96
/*
97
for( i = 0; i <= last; ++i )
98
{
99
std::cout << store[i]->atHeap() << ' ' << store[i]->orderingValue() << std::endl;
100
}
101
*/
102
}
103
104
void pq::
105
upheap( const int p )
106
{
107
int k = p;
108
Vertex *v = store[p];
109
110
while( k != 0 && store[ ( k - 1 ) / 2 ]->orderingValue() <= v->orderingValue() )
111
{
112
store[ k ] = store[ ( k - 1 ) / 2 ];
113
store[ k ]->setHeap( k );
114
115
k = ( k - 1 ) / 2;
116
}
117
store[ k ] = v;
118
store[ k ]->setHeap( k );
119
}
120
121
void pq::
122
downheap( const int p )
123
{
124
int k = p;
125
Vertex *v = store[p];
126
int N = last;
127
128
while( ( k + 1 ) <= ( N + 1 ) / 2 )
129
{
130
int j = k + k + 1;
131
if( j < N )
132
{
133
if( store[ j ]->orderingValue() <= store[ j + 1 ]->orderingValue() )
134
{
135
j = j + 1;
136
}
137
}
138
if( store[ j ]->orderingValue() <= v->orderingValue() )
139
{
140
break;
141
}
142
store[ k ] = store[ j ];
143
store[ k ]->setHeap( k );
144
k = j;
145
}
146
store[ k ] = v;
147
store[ k ]->setHeap( k );
148
}
149
150
void pq::
151
pq_reserve(int sz)
152
{
153
int osz = pq_size;
154
pq_size = sz;
155
156
if(osz == 0)
157
{
158
store = new Vertex*[pq_size];
159
}
160
else
161
{
162
Vertex **hold = store;
163
store = new Vertex*[pq_size];
164
memcpy((void *)store, (const void *)hold, osz * sizeof(Vertex *));
165
delete [] hold;
166
}
167
}
168
169
170