Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Swag : another name for O(1) set
[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 to be swag to NULL */
12
13 typedef struct xbt_swag_hookup {
14   void *next;
15   void *prev;
16 } s_xbt_swag_hookup_t, *xbt_swag_hookup_t;
17
18 typedef struct xbt_swag {
19   void *head;
20   void *tail;
21   size_t offset;
22   int count;
23 } s_xbt_swag_t, *xbt_swag_t;
24
25 xbt_swag_t xbt_swag_new(size_t offset);
26 void  xbt_swag_insert(void *obj,xbt_swag_t swag);
27 void xbt_swag_extract(void *obj, xbt_swag_t swag);
28 int  xbt_swag_size(xbt_swag_t swag);
29 int  xbt_swag_belongs(void *obj,xbt_swag_t swag);
30
31 static __inline__ void *xbt_swag_getFirst(xbt_swag_t swag)
32 {
33   return(swag->head);
34 }
35
36 #define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev)
37 #define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next)
38
39
40 #define xbt_swag_foreach(obj,swag)                            \
41    for(obj=xbt_swag_getFirst(swag);                           \
42        obj!=NULL;                                           \
43        obj=xbt_swag_getNext(obj,swag->offset))