NCBI C++ ToolKit
dlist.tmpl.h
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* Dlist - dynamic list
2  * Copyright (C) 2016 Frediano Ziglio
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  */
19 
20 #include <freetds/bool.h>
21 #include <freetds/utils.h>
22 #include <freetds/macros.h>
23 
24 #if !defined(DLIST_PREFIX) || !defined(DLIST_ITEM_TYPE) || !defined(DLIST_LIST_TYPE)
25 #error Required defines for dlist missing!
26 #endif
27 
28 #if defined(DLIST_NAME) || defined(DLIST_PASTER) || \
29  defined(DLIST_EVALUATOR) || defined(DLIST_ITEM)
30 #error Some internal dlist macros already defined
31 #endif
32 
33 typedef struct
34 {
35  dlist_ring ring;
37 
38 #define DLIST_PASTER(x,y) x ## _ ## y
39 #define DLIST_EVALUATOR(x,y) DLIST_PASTER(x,y)
40 #define DLIST_NAME(suffix) DLIST_EVALUATOR(DLIST_PREFIX, suffix)
41 #define DLIST_ITEM(ring) \
42  ((DLIST_ITEM_TYPE *) (((char *) (ring)) - TDS_OFFSET(DLIST_ITEM_TYPE, DLIST_NAME(item))))
43 
44 static inline void DLIST_NAME(check)(DLIST_LIST_TYPE *list)
45 {
46 #if ENABLE_EXTRA_CHECKS
47  assert(list != NULL);
48  dlist_ring_check(&list->ring);
49 #endif
50 }
51 
52 static inline void DLIST_NAME(init)(DLIST_LIST_TYPE *list)
53 {
54  list->ring.next = list->ring.prev = &list->ring;
55  DLIST_NAME(check)(list);
56 }
57 
59 {
60  return list->ring.next == &list->ring ? NULL : DLIST_ITEM(list->ring.next);
61 }
62 
64 {
65  return list->ring.prev == &list->ring ? NULL : DLIST_ITEM(list->ring.prev);
66 }
67 
69 {
70  return item->DLIST_NAME(item).next == &list->ring ? NULL : DLIST_ITEM(item->DLIST_NAME(item).next);
71 }
72 
74 {
75  return item->DLIST_NAME(item).prev == &list->ring ? NULL : DLIST_ITEM(item->DLIST_NAME(item).prev);
76 }
77 
78 static inline void DLIST_NAME(prepend)(DLIST_LIST_TYPE *list, DLIST_ITEM_TYPE *item)
79 {
80  DLIST_NAME(check)(list);
81  dlist_insert_after(&list->ring, &item->DLIST_NAME(item));
82  DLIST_NAME(check)(list);
83 }
84 
85 static inline void DLIST_NAME(append)(DLIST_LIST_TYPE *list, DLIST_ITEM_TYPE *item)
86 {
87  DLIST_NAME(check)(list);
88  dlist_insert_after(list->ring.prev, &item->DLIST_NAME(item));
89  DLIST_NAME(check)(list);
90 }
91 
92 static inline void DLIST_NAME(remove)(DLIST_LIST_TYPE *list, DLIST_ITEM_TYPE *item)
93 {
94  dlist_ring *prev = item->DLIST_NAME(item).prev, *next = item->DLIST_NAME(item).next;
95  DLIST_NAME(check)(list);
96  if (prev) {
97  prev->next = next;
98  next->prev = prev;
99  }
100  item->DLIST_NAME(item).prev = NULL;
101  item->DLIST_NAME(item).next = NULL;
102  DLIST_NAME(check)(list);
103 }
104 
105 static inline bool DLIST_NAME(in_list)(DLIST_LIST_TYPE *list, DLIST_ITEM_TYPE *item)
106 {
107  DLIST_NAME(check)(list);
108  return item->DLIST_NAME(item).prev != NULL || item->DLIST_NAME(item).next != NULL;
109 }
110 
111 #undef DLIST_ITEM
112 #undef DLIST_NAME
113 #undef DLIST_ITEM_TYPE
114 #undef DLIST_LIST_TYPE
115 #undef DLIST_PREFIX
116 #undef DLIST_PASTER
117 #undef DLIST_EVALUATOR
118 
static void DLIST_NAME() init(DLIST_LIST_TYPE *list)
Definition: dlist.tmpl.h:40
static void DLIST_NAME() prepend(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:66
static void DLIST_NAME() append(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:78
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
Definition: dlist.tmpl.h:46
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
Definition: dlist.tmpl.h:51
static void DLIST_NAME() check(DLIST_LIST_TYPE *list)
Definition: dlist.tmpl.h:32
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:61
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:56
static bool DLIST_NAME() in_list(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:103
static void DLIST_NAME() remove(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:90
#define dlist_ring_check
static void dlist_insert_after(dlist_ring *ring_pos, dlist_ring *ring_item)
Definition: dlist.h:40
#define DLIST_ITEM(ring)
Definition: dlist.tmpl.h:41
#define DLIST_NAME(suffix)
Definition: dlist.tmpl.h:40
#define DLIST_ITEM_TYPE
Definition: dlist.c:44
#define DLIST_LIST_TYPE
Definition: dlist.c:43
#define NULL
Definition: ncbistd.hpp:225
#define assert(x)
Definition: srv_diag.hpp:58
Modified on Wed May 15 15:05:58 2024 by modify_doxy.py rev. 669887