3 /* Copyright (c) 2004 Arnaud Legrand. All rights reserved. */
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. */
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. */
12 #include "xbt/sysdep.h"
14 /* This type should be added to a type that is to be used in such a swag */
15 /* Whenever a new object with this struct is created, all fields have
17 typedef struct xbt_swag_hookup {
20 } s_xbt_swag_hookup_t, *xbt_swag_hookup_t;
22 typedef struct xbt_swag {
27 } s_xbt_swag_t, *xbt_swag_t;
29 xbt_swag_t xbt_swag_new(size_t offset);
30 void xbt_swag_free(xbt_swag_t swag);
31 void xbt_swag_init(xbt_swag_t swag, size_t offset);
32 void xbt_swag_insert(void *obj, xbt_swag_t swag);
33 void *xbt_swag_remove(void *obj, xbt_swag_t swag);
34 void *xbt_swag_extract(xbt_swag_t swag);
35 int xbt_swag_size(xbt_swag_t swag);
36 int xbt_swag_belongs(void *obj, xbt_swag_t swag);
38 static __inline__ void *xbt_swag_getFirst(xbt_swag_t swag)
43 #define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev)
44 #define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next)
46 #define xbt_swag_offset(var,field) ((char *)&( (var).field ) - (char *)&(var))
48 #define xbt_swag_foreach(obj,swag) \
49 for((obj)=xbt_swag_getFirst((swag)); \
51 (obj)=xbt_swag_getNext((obj),(swag)->offset))
53 #define xbt_swag_foreach_safe(obj,obj_next,swag) \
54 for((obj)=xbt_swag_getFirst((swag)), \
55 ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)): \
59 ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)): \