48 #define my_offsetof(st, m) ((size_t)( (unsigned char *)&((st)->m ) - (unsigned char *)(st))) 51 #define list(type) type * 59 #define new_list(type) (type *)({ \ 61 __lmptr = (void *)rsalloc(sizeof(struct rootsim_list)); \ 62 bzero(__lmptr, sizeof(struct rootsim_list));\ 67 #define list_sizeof(list) ((struct rootsim_list *)list)->size 74 #define list_head(list) ((__typeof__ (list))(((rootsim_list *)(list))->head)) 81 #define list_tail(list) ((__typeof__ (list))(((rootsim_list *)(list))->tail)) 88 #define list_next(ptr) ((ptr)->next) 95 #define list_prev(ptr) ((ptr)->prev) 98 #define get_key(data) ({\ 99 char *__key_ptr = ((char *)(data) + __key_position);\ 100 double *__key_double_ptr = (double *)__key_ptr;\ 110 #define list_empty(list) (((rootsim_list *)list)->size == 0) 112 #define list_insert_tail(li, data) \ 114 __typeof__(data) __new_n = (data); \ 115 size_t __size_before;\ 117 __new_n->next = NULL;\ 118 __new_n->prev = NULL;\ 120 __l = (rootsim_list *)(li);\ 122 __size_before = __l->size;\ 123 if(__l->size == 0) { \ 124 __l->head = __new_n;\ 125 __l->tail = __new_n;\ 128 __new_n->next = NULL; \ 129 __new_n->prev = __l->tail;\ 130 ((__typeof__(data))(__l->tail))->next = __new_n;\ 131 __l->tail = __new_n;\ 134 assert(__l->size == (__size_before + 1));\ 137 #define list_insert_head(li, data) \ 139 __typeof__(data) __new_n = (data); \ 140 size_t __size_before;\ 142 __new_n->next = NULL;\ 143 __new_n->prev = NULL;\ 145 __l = (rootsim_list *)(li);\ 147 __size_before = __l->size;\ 148 if(__l->size == 0) { \ 149 __l->head = __new_n;\ 150 __l->tail = __new_n;\ 153 __new_n->prev = NULL; \ 154 __new_n->next = __l->head;\ 155 ((__typeof(data))__l->head)->prev = __new_n;\ 156 __l->head = __new_n;\ 159 assert(__l->size == (__size_before + 1));\ 163 #define list_insert(li, key_name, data)\ 165 __typeof__(data) __n; \ 166 __typeof__(data) __new_n = (data);\ 167 size_t __key_position = my_offsetof((li), key_name);\ 169 size_t __size_before;\ 172 __l = (rootsim_list *)(li);\ 174 __size_before = __l->size;\ 175 if(__l->size == 0) { \ 176 __new_n->prev = NULL;\ 177 __new_n->next = NULL;\ 178 __l->head = __new_n;\ 179 __l->tail = __new_n;\ 182 __key = get_key(__new_n); \ 185 while(__n != NULL && __key < get_key(__n)) {\ 189 if(__n == __l->tail) { \ 190 __new_n->next = NULL;\ 191 ((__typeof(data))__l->tail)->next = __new_n;\ 192 __new_n->prev = __l->tail;\ 193 __l->tail = __new_n;\ 194 } else if(__n == NULL) { \ 195 __new_n->prev = NULL;\ 196 __new_n->next = __l->head;\ 197 ((__typeof(data))__l->head)->prev = __new_n;\ 198 __l->head = __new_n;\ 200 __new_n->prev = __n;\ 201 __new_n->next = __n->next;\ 202 __n->next->prev = __new_n;\ 203 __n->next = __new_n;\ 207 assert(__l->size == (__size_before + 1));\ 210 #define list_delete_by_content(li, node)\ 212 __typeof__(node) __n = (node); \ 214 size_t __size_before;\ 215 __l = (rootsim_list *)(li);\ 217 __size_before = __l->size;\ 219 if(__l->head == __n) {\ 220 __l->head = __n->next;\ 221 if(__l->head != NULL) {\ 222 ((__typeof(node))__l->head)->prev = NULL;\ 225 if(__l->tail == __n) {\ 226 __l->tail = __n->prev;\ 227 if(__l->tail != NULL) {\ 228 ((__typeof(node))__l->tail)->next = NULL;\ 231 if(__n->next != NULL) {\ 232 __n->next->prev = __n->prev;\ 234 if(__n->prev != NULL) {\ 235 __n->prev->next = __n->next;\ 237 __n->next = (void *)0xBEEFC0DE;\ 238 __n->prev = (void *)0xDEADC0DE;\ 240 assert(__l->size == (__size_before - 1));\ 243 #define list_pop(list)\ 246 size_t __size_before;\ 247 __typeof__ (list) __n;\ 248 __typeof__ (list) __n_next;\ 249 __l = (rootsim_list *)(list);\ 251 __size_before = __l->size;\ 254 __l->head = __n->next;\ 255 if(__n->next != NULL) {\ 256 __n->next->prev = NULL;\ 258 __n_next = __n->next;\ 259 __n->next = (void *)0xDEFEC8ED;\ 260 __n->prev = (void *)0xDEFEC8ED;\ 263 assert(__l->size == (__size_before - 1));\ 268 #define list_trunc(list, key_name, key_value, release_fn) \ 270 rootsim_list *__l = (rootsim_list *)(list);\ 271 __typeof__(list) __n;\ 272 __typeof__(list) __n_adjacent;\ 273 unsigned int __deleted = 0;\ 274 size_t __key_position = my_offsetof((list), key_name);\ 276 size_t __size_before = __l->size;\ 280 while(__n != NULL && get_key(__n) < (key_value)) {\ 282 __n_adjacent = __n->next;\ 283 __n->next = (void *)0xBAADF00D;\ 284 __n->prev = (void *)0xBAADF00D;\ 289 if(__l->head != NULL)\ 290 ((__typeof__(list))__l->head)->prev = NULL;\ 292 __l->size -= __deleted;\ 293 assert(__l->size == (__size_before - __deleted));\ 297 #define list_size(list) ((rootsim_list *)(list))->size struct rootsim_list rootsim_list
This structure defines a generic list.
This structure defines a generic list.