1
/*****************************************************************************
3
Copyright (C) 1995, 2010, Innobase Oy. All Rights Reserved.
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
15
St, Fifth Floor, Boston, MA 02110-1301 USA
17
*****************************************************************************/
19
/******************************************************************//**
20
@file include/ut0lst.h
1
/**********************************************************************
23
6
Created 9/10/1995 Heikki Tuuri
24
7
***********************************************************************/
33
16
to two or more lists, provided that the list are given different names.
34
17
An example of the usage of the lists can be found in fil0fil.c. */
36
/*******************************************************************//**
19
/***********************************************************************
37
20
This macro expands to the unnamed type definition of a struct which acts
38
21
as the two-way list base node. The base node contains pointers
39
22
to both ends of the list and a count of nodes in the list (excluding
40
the base node from the count).
41
@param TYPE the name of the list node data type */
44
class ut_list_base_node
47
size_t count; /*!< count of nodes in list */\
48
T * start; /*!< pointer to list start, NULL if empty */\
49
T * end; /*!< pointer to list end, NULL if empty */\
51
#define UT_LIST_BASE_NODE_T(TYPE) ut_list_base_node<TYPE>
53
#define UT_LIST_BASE_NODE_T(TYPE) int
56
/*******************************************************************//**
23
the base node from the count). TYPE should be the list node type name. */
25
#define UT_LIST_BASE_NODE_T(TYPE)\
27
ulint count; /* count of nodes in list */\
28
TYPE * start; /* pointer to list start, NULL if empty */\
29
TYPE * end; /* pointer to list end, NULL if empty */\
32
/***********************************************************************
57
33
This macro expands to the unnamed type definition of a struct which
58
34
should be embedded in the nodes of the list, the node type must be a struct.
59
35
This struct contains the pointers to next and previous nodes in the list.
60
36
The name of the field in the node struct should be the name given
62
@param TYPE the list node type name */
37
to the list. TYPE should be the list node type name. Example of usage:
64
39
typedef struct LRU_node_struct LRU_node_t;
65
40
struct LRU_node_struct {
66
41
UT_LIST_NODE_T(LRU_node_t) LRU_list;
69
44
The example implements an LRU list of name LRU_list. Its nodes are of type
72
48
#define UT_LIST_NODE_T(TYPE)\
74
TYPE * prev; /*!< pointer to the previous node,\
50
TYPE * prev; /* pointer to the previous node,\
75
51
NULL if start of list */\
76
TYPE * next; /*!< pointer to next node, NULL if end of list */\
52
TYPE * next; /* pointer to next node, NULL if end of list */\
79
/*******************************************************************//**
80
Initializes the base node of a two-way list.
81
@param BASE the list base node
55
/***********************************************************************
56
Initializes the base node of a two-way list. */
83
58
#define UT_LIST_INIT(BASE)\
129
/* Invalidate the pointers in a list node. */
158
130
#ifdef UNIV_LIST_DEBUG
159
/** Invalidate the pointers in a list node.
160
@param NAME list name
161
@param N pointer to the node that was removed */
162
131
# define UT_LIST_REMOVE_CLEAR(NAME, N) \
163
132
((N)->NAME.prev = (N)->NAME.next = (void*) -1)
165
/** Invalidate the pointers in a list node.
166
@param NAME list name
167
@param N pointer to the node that was removed */
168
# define UT_LIST_REMOVE_CLEAR(NAME, N)
134
# define UT_LIST_REMOVE_CLEAR(NAME, N) while (0)
171
/*******************************************************************//**
172
Removes a node from a two-way linked list.
173
@param NAME list name
174
@param BASE the base node (not a pointer to it)
175
@param N pointer to the node to be removed from the list
137
/***********************************************************************
138
Removes a node from a two-way linked list. BASE has to be the base node
139
(not a pointer to it). N has to be the pointer to the node to be removed
140
from the list. NAME is the list name. */
177
142
#define UT_LIST_REMOVE(NAME, BASE, N) \
192
157
UT_LIST_REMOVE_CLEAR(NAME, N); \
195
/********************************************************************//**
196
Gets the next node in a two-way list.
197
@param NAME list name
198
@param N pointer to a node
199
@return the successor of N in NAME, or NULL */
160
/************************************************************************
161
Gets the next node in a two-way list. NAME is the name of the list
162
and N is pointer to a node. */
200
164
#define UT_LIST_GET_NEXT(NAME, N)\
201
165
(((N)->NAME).next)
203
/********************************************************************//**
204
Gets the previous node in a two-way list.
205
@param NAME list name
206
@param N pointer to a node
207
@return the predecessor of N in NAME, or NULL */
167
/************************************************************************
168
Gets the previous node in a two-way list. NAME is the name of the list
169
and N is pointer to a node. */
208
171
#define UT_LIST_GET_PREV(NAME, N)\
209
172
(((N)->NAME).prev)
211
/********************************************************************//**
174
/************************************************************************
212
175
Alternative macro to get the number of nodes in a two-way list, i.e.,
214
@param BASE the base node (not a pointer to it).
215
@return the number of nodes in the list */
176
its length. BASE is the base node (not a pointer to it). */
216
178
#define UT_LIST_GET_LEN(BASE)\
219
/********************************************************************//**
220
Gets the first node in a two-way list.
221
@param BASE the base node (not a pointer to it)
222
@return first node, or NULL if the list is empty */
181
/************************************************************************
182
Gets the first node in a two-way list, or returns NULL,
183
if the list is empty. BASE is the base node (not a pointer to it). */
223
185
#define UT_LIST_GET_FIRST(BASE)\
226
/********************************************************************//**
227
Gets the last node in a two-way list.
228
@param BASE the base node (not a pointer to it)
229
@return last node, or NULL if the list is empty */
188
/************************************************************************
189
Gets the last node in a two-way list, or returns NULL,
190
if the list is empty. BASE is the base node (not a pointer to it). */
231
192
#define UT_LIST_GET_LAST(BASE)\
234
#define UT_LIST_GET_LAST(BASE) (BASE= NULL)
237
/********************************************************************//**
238
Checks the consistency of a two-way list.
239
@param NAME the name of the list
240
@param TYPE node type
241
@param BASE base node (not a pointer to it)
242
@param ASSERTION a condition on ut_list_node_313 */
243
#define UT_LIST_VALIDATE(NAME, TYPE, BASE, ASSERTION) \
245
ulint ut_list_i_313; \
246
TYPE* ut_list_node_313; \
248
ut_list_node_313 = (BASE).start; \
250
for (ut_list_i_313 = (BASE).count; ut_list_i_313--; ) { \
251
ut_a(ut_list_node_313); \
253
ut_ad((ut_list_node_313->NAME).next || !ut_list_i_313); \
254
ut_list_node_313 = (ut_list_node_313->NAME).next; \
257
ut_a(ut_list_node_313 == NULL); \
259
ut_list_node_313 = (BASE).end; \
261
for (ut_list_i_313 = (BASE).count; ut_list_i_313--; ) { \
262
ut_a(ut_list_node_313); \
264
ut_ad((ut_list_node_313->NAME).prev || !ut_list_i_313); \
265
ut_list_node_313 = (ut_list_node_313->NAME).prev; \
268
ut_a(ut_list_node_313 == NULL); \
195
/************************************************************************
196
Checks the consistency of a two-way list. NAME is the name of the list,
197
TYPE is the node type, and BASE is the base node (not a pointer to it). */
199
#define UT_LIST_VALIDATE(NAME, TYPE, BASE)\
201
ulint ut_list_i_313;\
202
TYPE * ut_list_node_313;\
204
ut_list_node_313 = (BASE).start;\
206
for (ut_list_i_313 = 0; ut_list_i_313 < (BASE).count;\
208
ut_a(ut_list_node_313);\
209
ut_list_node_313 = (ut_list_node_313->NAME).next;\
212
ut_a(ut_list_node_313 == NULL);\
214
ut_list_node_313 = (BASE).end;\
216
for (ut_list_i_313 = 0; ut_list_i_313 < (BASE).count;\
218
ut_a(ut_list_node_313);\
219
ut_list_node_313 = (ut_list_node_313->NAME).prev;\
222
ut_a(ut_list_node_313 == NULL);\