Logo AND Algorithmique Numérique Distribuée

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