66
66
XBT_INLINE void xbt_swag_insert_at_head(void *obj, xbt_swag_t swag)
69
if (xbt_swag_belongs(obj, swag))
73
if (swag->head == NULL) {
68
xbt_assert(!xbt_swag_belongs(obj, swag) || swag->tail,
69
"This object belongs to an empty swag! Did you correctly initialize the object's hookup?");
74
72
xbt_assert(!(swag->tail), "Inconsistent swag.");
80
xbt_swag_getNext(obj, swag->offset) = swag->head;
81
xbt_swag_getPrev(swag->head, swag->offset) = obj;
77
else if (obj != swag->head && !xbt_swag_getPrev(obj, swag->offset)) {
78
xbt_swag_getNext(obj, swag->offset) = swag->head;
79
xbt_swag_getPrev(swag->head, swag->offset) = obj;
92
92
XBT_INLINE void xbt_swag_insert_at_tail(void *obj, xbt_swag_t swag)
95
if (xbt_swag_belongs(obj, swag))
99
if (swag->head == NULL) {
94
xbt_assert(!xbt_swag_belongs(obj, swag) || swag->tail,
95
"This object belongs to an empty swag! Did you correctly initialize the object's hookup?");
100
98
xbt_assert(!(swag->tail), "Inconsistent swag.");
102
100
swag->tail = obj;
106
xbt_swag_getPrev(obj, swag->offset) = swag->tail;
107
xbt_swag_getNext(swag->tail, swag->offset) = obj;
103
else if (obj != swag->tail && !xbt_swag_getNext(obj, swag->offset)) {
104
xbt_swag_getPrev(obj, swag->offset) = swag->tail;
105
xbt_swag_getNext(swag->tail, swag->offset) = obj;
118
118
XBT_INLINE void *xbt_swag_remove(void *obj, xbt_swag_t swag)
120
123
size_t offset = swag->offset;
122
if ((!obj) || (!swag))
124
if (!xbt_swag_belongs(obj, swag)) /* Trying to remove an object that
125
was not in this swag */
128
if (swag->head == swag->tail) { /* special case */
129
if (swag->head != obj) /* Trying to remove an object that was not in this swag */
133
xbt_swag_getNext(obj, offset) = xbt_swag_getPrev(obj, offset) = NULL;
134
} else if (obj == swag->head) { /* It's the head */
135
swag->head = xbt_swag_getNext(obj, offset);
136
xbt_swag_getPrev(swag->head, offset) = NULL;
137
xbt_swag_getNext(obj, offset) = NULL;
138
} else if (obj == swag->tail) { /* It's the tail */
139
swag->tail = xbt_swag_getPrev(obj, offset);
140
xbt_swag_getNext(swag->tail, offset) = NULL;
124
void* prev = xbt_swag_getPrev(obj, offset);
125
void* next = xbt_swag_getNext(obj, offset);
128
xbt_swag_getNext(prev, offset) = next;
141
129
xbt_swag_getPrev(obj, offset) = NULL;
142
} else { /* It's in the middle */
143
xbt_swag_getNext(xbt_swag_getPrev(obj, offset), offset) =
144
xbt_swag_getNext(obj, offset);
145
xbt_swag_getPrev(xbt_swag_getNext(obj, offset), offset) =
146
xbt_swag_getPrev(obj, offset);
147
xbt_swag_getPrev(obj, offset) = xbt_swag_getNext(obj, offset) = NULL;
131
xbt_swag_getPrev(next, offset) = prev;
132
xbt_swag_getNext(obj, offset) = NULL;
140
xbt_swag_getPrev(next, offset) = NULL;
141
xbt_swag_getNext(obj, offset) = NULL;
145
else if (obj == swag->head) {
146
swag->head = swag->tail = NULL;
157
157
void *xbt_swag_extract(xbt_swag_t swag)
159
162
size_t offset = swag->offset;
162
if ((!swag) || (!(swag->head)))
167
if (swag->head == swag->tail) { /* special case */
163
void* obj = swag->head;
165
if (obj == swag->tail) { /* special case */
168
166
swag->head = swag->tail = NULL;
169
xbt_swag_getPrev(obj, offset) = xbt_swag_getNext(obj, offset) = NULL;
171
168
swag->head = xbt_swag_getNext(obj, offset);
172
169
xbt_swag_getPrev(swag->head, offset) = NULL;