/** * \param obj the objet to remove from the swag * \param swag a swag * \return \a obj if it was in the \a swag and NULL otherwise * * removes \a obj from \a swag */ XBT_INLINE void *xbt_swag_remove(void *obj, xbt_swag_t swag) { if (!obj) return NULL; size_t offset = swag->offset; void* prev = xbt_swag_getPrev(obj, offset); void* next = xbt_swag_getNext(obj, offset); if (prev) { xbt_swag_getNext(prev, offset) = next; xbt_swag_getPrev(obj, offset) = NULL; if (next) { xbt_swag_getPrev(next, offset) = prev; xbt_swag_getNext(obj, offset) = NULL; } else { swag->tail = prev; } swag->count--; } else if (next) { xbt_swag_getPrev(next, offset) = NULL; xbt_swag_getNext(obj, offset) = NULL; swag->head = next; swag->count--; } else if (obj == swag->head) { swag->head = swag->tail = NULL; swag->count--; } return obj; }
//if we modify the swag between calls, normal version may loop forever //this safe version ensures that we browse the swag elements only once lmm_variable_t lmm_get_var_from_cnst_safe(lmm_system_t /*sys*/, lmm_constraint_t cnst, lmm_element_t * elem, lmm_element_t * nextelem, int * numelem) { if (!(*elem)){ *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->enabled_element_set)); *numelem = xbt_swag_size(&(cnst->enabled_element_set))+xbt_swag_size(&(cnst->disabled_element_set))-1; if (!(*elem)) *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->disabled_element_set)); }else{ *elem = *nextelem; if(*numelem>0){ (*numelem) --; }else return NULL; } if (*elem){ //elem is not null, so we carry on if(xbt_swag_belongs(*elem,&(cnst->enabled_element_set))){ //Look at enabled_element_set, and jump to disabled_element_set when finished *nextelem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->enabled_element_set.offset); if (!(*nextelem)) *nextelem = (lmm_element_t) xbt_swag_getFirst(&(cnst->disabled_element_set)); } else { *nextelem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->disabled_element_set.offset); } return (*elem)->variable; }else return NULL; }
/** * \param obj the objet to insert in the swag * \param swag a swag * * insert (at the tail... you probably had a very good reason to do * that, I hope you know what you're doing) \a obj in \a swag */ XBT_INLINE void xbt_swag_insert_at_tail(void *obj, xbt_swag_t swag) { xbt_assert(!xbt_swag_belongs(obj, swag) || swag->tail, "This object belongs to an empty swag! Did you correctly initialize the object's hookup?"); if (!swag->head) { xbt_assert(!(swag->tail), "Inconsistent swag."); swag->head = obj; swag->tail = obj; swag->count++; } else if (obj != swag->tail && !xbt_swag_getNext(obj, swag->offset)) { xbt_swag_getPrev(obj, swag->offset) = swag->tail; xbt_swag_getNext(swag->tail, swag->offset) = obj; swag->tail = obj; swag->count++; } }
/** * \param swag a swag * \return an object from the \a swag */ void *xbt_swag_extract(xbt_swag_t swag) { if (!swag->head) return NULL; size_t offset = swag->offset; void* obj = swag->head; if (obj == swag->tail) { /* special case */ swag->head = swag->tail = NULL; } else { swag->head = xbt_swag_getNext(obj, offset); xbt_swag_getPrev(swag->head, offset) = NULL; xbt_swag_getNext(obj, offset) = NULL; } (swag->count)--; return obj; }
lmm_variable_t lmm_get_var_from_cnst(lmm_system_t /*sys*/, lmm_constraint_t cnst, lmm_element_t * elem) { if (!(*elem)) *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->element_set)); else *elem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->element_set.offset); if (*elem) return (*elem)->variable; else return NULL; }
lmm_variable_t lmm_get_var_from_cnst(lmm_system_t /*sys*/, lmm_constraint_t cnst, lmm_element_t * elem) { if (!(*elem)) { // That is the first call, pick the first element among enabled_element_set (or disabled_element_set if // enabled_element_set is empty) *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->enabled_element_set)); if (!(*elem)) *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->disabled_element_set)); } else { //elem is not null, so we carry on if(xbt_swag_belongs(*elem,&(cnst->enabled_element_set))){ //Look at enabled_element_set, and jump to disabled_element_set when finished *elem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->enabled_element_set.offset); if (!(*elem)) *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->disabled_element_set)); } else { *elem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->disabled_element_set.offset); } } if (*elem) return (*elem)->variable; else return NULL; }