Beispiel #1
0
/**
 * \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;
}
Beispiel #2
0
//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;
}
Beispiel #3
0
/**
 * \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++;
  }
}
Beispiel #4
0
/**
 * \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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}