Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Bug fix and add a xbt_swag_foreach_safe where you can remove objects from
[simgrid.git] / include / xbt / swag.h
1 /* Authors: Arnaud Legrand                                                  */
2
3 /* This program is free software; you can redistribute it and/or modify it
4    under the terms of the license (GNU LGPL) which comes with this package. */
5
6 /* Warning, this module is done to be efficient and performs tons of
7    cast and dirty things. So avoid using it unless you really know
8    what you are doing. */
9
10 /* This type should be added to a type that is to be used in such a swag */
11 /* Whenever a new object with this struct is created, all fields have
12    to be set to NULL */
13
14 #include "xbt/sysdep.h"
15
16 typedef struct xbt_swag_hookup {
17   void *next;
18   void *prev;
19 } s_xbt_swag_hookup_t, *xbt_swag_hookup_t;
20
21 typedef struct xbt_swag {
22   void *head;
23   void *tail;
24   size_t offset;
25   int count;
26 } s_xbt_swag_t, *xbt_swag_t;
27
28 xbt_swag_t xbt_swag_new(size_t offset);
29 void xbt_swag_init(xbt_swag_t swag, size_t offset);
30 void xbt_swag_insert(void *obj, xbt_swag_t swag);
31 void *xbt_swag_extract(void *obj, xbt_swag_t swag);
32 int xbt_swag_size(xbt_swag_t swag);
33 int xbt_swag_belongs(void *obj, xbt_swag_t swag);
34
35 static __inline__ void *xbt_swag_getFirst(xbt_swag_t swag)
36 {
37   return (swag->head);
38 }
39
40 #define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev)
41 #define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next)
42
43 #define xbt_swag_offset(var,field) ((char *)&( (var).field ) - (char *)&(var))
44
45 #define xbt_swag_foreach(obj,swag)                            \
46    for((obj)=xbt_swag_getFirst((swag));                       \
47        (obj)!=NULL;                                           \
48        (obj)=xbt_swag_getNext((obj),(swag)->offset))
49
50 #define xbt_swag_foreach_safe(obj,obj_next,swag)                  \
51    for((obj)=xbt_swag_getFirst((swag)),                           \
52        ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)):  \
53                  (obj_next=NULL));                                \
54        (obj)!=NULL;                                               \
55        (obj)=obj_next,                                            \
56        ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)):  \
57                  (obj_next=NULL))     )