9
9
*
10
10
*
11
11
* IDENTIFICATION
12
- * $Header: /cvsroot/pgsql/src/backend/lib/dllist.c,v 1.12 1999/02/13 23:15:34 momjian Exp $
12
+ * $Header: /cvsroot/pgsql/src/backend/lib/dllist.c,v 1.13 1999/05/31 23:48:03 tgl Exp $
13
13
*
14
14
*-------------------------------------------------------------------------
15
15
*/
@@ -30,7 +30,9 @@ DLNewList(void)
30
30
return l ;
31
31
}
32
32
33
- /* free up a list and all the nodes in it */
33
+ /* free up a list and all the nodes in it --- but *not* whatever the nodes
34
+ * might point to!
35
+ */
34
36
void
35
37
DLFreeList (Dllist * l )
36
38
{
@@ -85,7 +87,7 @@ DLGetTail(Dllist *l)
85
87
return l ? l -> dll_tail : 0 ;
86
88
}
87
89
88
- /* get the value stored in the first element */
90
+ /* get the value stored in the last element */
89
91
#ifdef NOT_USED
90
92
void *
91
93
DLGetTailVal (Dllist * l )
@@ -112,20 +114,26 @@ DLGetSucc(Dlelem *e) /* get successor */
112
114
void
113
115
DLRemove (Dlelem * e )
114
116
{
115
- Dllist * l ;
117
+ Dllist * l = e -> dle_list ;
116
118
117
119
if (e -> dle_prev )
118
120
e -> dle_prev -> dle_next = e -> dle_next ;
121
+ else /* must be the head element */
122
+ {
123
+ Assert (e == l -> dll_head );
124
+ l -> dll_head = e -> dle_next ;
125
+ }
119
126
if (e -> dle_next )
120
127
e -> dle_next -> dle_prev = e -> dle_prev ;
128
+ else /* must be the tail element */
129
+ {
130
+ Assert (e == l -> dll_tail );
131
+ l -> dll_tail = e -> dle_prev ;
132
+ }
121
133
122
- /* check to see if we're removing the head or tail */
123
- l = e -> dle_list ;
124
- if (e == l -> dll_head )
125
- DLRemHead (l );
126
- if (e == l -> dll_tail )
127
- DLRemTail (l );
128
-
134
+ e -> dle_next = 0 ;
135
+ e -> dle_prev = 0 ;
136
+ e -> dle_list = 0 ;
129
137
}
130
138
131
139
void
@@ -134,15 +142,13 @@ DLAddHead(Dllist *l, Dlelem *e)
134
142
e -> dle_list = l ;
135
143
136
144
if (l -> dll_head )
137
- {
138
145
l -> dll_head -> dle_prev = e ;
139
- e -> dle_next = l -> dll_head ;
140
- }
146
+ e -> dle_next = l -> dll_head ;
141
147
e -> dle_prev = 0 ;
142
148
l -> dll_head = e ;
143
149
144
150
if (l -> dll_tail == 0 ) /* if this is first element added */
145
- l -> dll_tail = l -> dll_head ;
151
+ l -> dll_tail = e ;
146
152
}
147
153
148
154
void
@@ -151,31 +157,28 @@ DLAddTail(Dllist *l, Dlelem *e)
151
157
e -> dle_list = l ;
152
158
153
159
if (l -> dll_tail )
154
- {
155
160
l -> dll_tail -> dle_next = e ;
156
- e -> dle_prev = l -> dll_tail ;
157
- }
161
+ e -> dle_prev = l -> dll_tail ;
158
162
e -> dle_next = 0 ;
159
163
l -> dll_tail = e ;
160
164
161
165
if (l -> dll_head == 0 ) /* if this is first element added */
162
- l -> dll_head = l -> dll_tail ;
166
+ l -> dll_head = e ;
163
167
}
164
168
165
169
Dlelem *
166
170
DLRemHead (Dllist * l )
167
171
{
168
172
/* remove and return the head */
169
- Dlelem * result ;
173
+ Dlelem * result = l -> dll_head ;
170
174
171
- if (l -> dll_head == 0 )
172
- return 0 ;
175
+ if (result == 0 )
176
+ return result ;
173
177
174
- result = l -> dll_head ;
175
- if (l -> dll_head -> dle_next )
176
- l -> dll_head -> dle_next -> dle_prev = 0 ;
178
+ if (result -> dle_next )
179
+ result -> dle_next -> dle_prev = 0 ;
177
180
178
- l -> dll_head = l -> dll_head -> dle_next ;
181
+ l -> dll_head = result -> dle_next ;
179
182
180
183
result -> dle_next = 0 ;
181
184
result -> dle_list = 0 ;
@@ -190,15 +193,15 @@ Dlelem *
190
193
DLRemTail (Dllist * l )
191
194
{
192
195
/* remove and return the tail */
193
- Dlelem * result ;
196
+ Dlelem * result = l -> dll_tail ;
194
197
195
- if (l -> dll_tail == 0 )
196
- return 0 ;
198
+ if (result == 0 )
199
+ return result ;
197
200
198
- result = l -> dll_tail ;
199
- if ( l -> dll_tail -> dle_prev )
200
- l -> dll_tail -> dle_prev -> dle_next = 0 ;
201
- l -> dll_tail = l -> dll_tail -> dle_prev ;
201
+ if ( result -> dle_prev )
202
+ result -> dle_prev -> dle_next = 0 ;
203
+
204
+ l -> dll_tail = result -> dle_prev ;
202
205
203
206
result -> dle_prev = 0 ;
204
207
result -> dle_list = 0 ;
@@ -208,3 +211,30 @@ DLRemTail(Dllist *l)
208
211
209
212
return result ;
210
213
}
214
+
215
+ /* Same as DLRemove followed by DLAddHead, but faster */
216
+ void
217
+ DLMoveToFront (Dlelem * e )
218
+ {
219
+ Dllist * l = e -> dle_list ;
220
+
221
+ if (l -> dll_head == e )
222
+ return ; /* Fast path if already at front */
223
+
224
+ Assert (e -> dle_prev != 0 ); /* since it's not the head */
225
+ e -> dle_prev -> dle_next = e -> dle_next ;
226
+
227
+ if (e -> dle_next )
228
+ e -> dle_next -> dle_prev = e -> dle_prev ;
229
+ else /* must be the tail element */
230
+ {
231
+ Assert (e == l -> dll_tail );
232
+ l -> dll_tail = e -> dle_prev ;
233
+ }
234
+
235
+ l -> dll_head -> dle_prev = e ;
236
+ e -> dle_next = l -> dll_head ;
237
+ e -> dle_prev = 0 ;
238
+ l -> dll_head = e ;
239
+ /* We need not check dll_tail, since there must have been > 1 entry */
240
+ }
0 commit comments