static inline void
rectangle_pop_stop (sweep_line_t *sweep)
{
    rectangle_t **elements = sweep->stop;
    rectangle_t *tail;
    int child, i;

    tail = elements[sweep->stop_size--];
    if (sweep->stop_size == 0) {
	elements[PQ_FIRST_ENTRY] = NULL;
	return;
    }

    for (i = PQ_FIRST_ENTRY;
	 (child = PQ_LEFT_CHILD_INDEX (i)) <= sweep->stop_size;
	 i = child)
    {
	if (child != sweep->stop_size &&
	    rectangle_compare_stop (elements[child+1],
				    elements[child]) < 0)
	{
	    child++;
	}

	if (rectangle_compare_stop (elements[child], tail) >= 0)
	    break;

	elements[i] = elements[child];
    }
    elements[i] = tail;
}
static inline void
pqueue_pop (pqueue_t *pq)
{
    rectangle_t **elements = pq->elements;
    rectangle_t *tail;
    int child, i;

    tail = elements[pq->size--];
    if (pq->size == 0) {
	elements[PQ_FIRST_ENTRY] = NULL;
	return;
    }

    for (i = PQ_FIRST_ENTRY;
	 (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size;
	 i = child)
    {
	if (child != pq->size &&
	    rectangle_compare_stop (elements[child+1],
				    elements[child]) < 0)
	{
	    child++;
	}

	if (rectangle_compare_stop (elements[child], tail) >= 0)
	    break;

	elements[i] = elements[child];
    }
    elements[i] = tail;
}
int fc_solve_PQueuePop( PQUEUE *pq, fcs_state_extra_info_t * * val)
{
    int32 i;
    int32 child;
    pq_element_t * Elements = pq->Elements;
    int32 CurrentSize = pq->CurrentSize;

    pq_element_t pMaxElement;
    pq_element_t pLastElement;

    if( PQueueIsEmpty( pq ) )
    {
        *val = NULL;
        return 1;
    }

    pMaxElement = Elements[PQ_FIRST_ENTRY];

    /* get pointer to last element in tree */
    pLastElement = Elements[ CurrentSize-- ];

    {

        /* code to pop an element from an ascending (top to bottom) pqueue */

        /*  UNTESTED */

        for( i=PQ_FIRST_ENTRY; (child = PQ_LEFT_CHILD_INDEX(i)) <= CurrentSize; i=child )
        {
            /* set child to the smaller of the two children... */

            if( (child != CurrentSize) &&
                (PGetRating(Elements[child + 1]) > PGetRating(Elements[child])) )
            {
                child ++;
            }

            if( PGetRating( pLastElement ) < PGetRating( Elements[ child ] ) )
            {
                Elements[ i ] = Elements[ child ];
            }
            else
            {
                break;
            }
        }
    }

    Elements[i] = pLastElement;
    pq->CurrentSize = CurrentSize;

    *val = pMaxElement.val;
    return 0;
}
Exemple #4
0
pq_element_t PQueuePop( PQUEUE *pq)
{
    int32 i;
    int32 child;

    pq_element_t pMaxElement;
    pq_element_t pLastElement;
     
    if( PQueueIsEmpty( pq ) )
    {
#ifndef __KERNEL__
        return NULL;
#else
        pq_element_t ret;
        ret.tv = 0;
        return ret;
#endif
    }

    pMaxElement = pq->Elements[PQ_FIRST_ENTRY];

    /* get pointer to last element in tree */
    pLastElement = pq->Elements[ pq->CurrentSize-- ];

    if( pq->IsAscendingHeap == TRUE )
    {

        /* code to pop an element from an ascending (top to bottom) pqueue */

        /*  UNTESTED */

        for( i=PQ_FIRST_ENTRY; PQ_LEFT_CHILD_INDEX(i) <= pq->CurrentSize; i=child )
        {
            /* set child to the smaller of the two children... */
        
            child = PQ_LEFT_CHILD_INDEX(i);
        
            if( (child != pq->CurrentSize) &&
                /*(PGetRating(pq->Elements[child + 1]) > PGetRating(pq->Elements[child])) )*/
                (pq->cmp(pq->Elements[child + 1], pq->Elements[child], pq->context) > 0)
                )
            {
                child ++;
            }
        
            if( /*PGetRating( pLastElement ) < PGetRating( pq->Elements[ child ] ) */
                pq->cmp(pLastElement, pq->Elements[child], pq->context) < 0
                    )
            {
                pq->Elements[ i ] = pq->Elements[ child ];
            }
            else
            {
                break;
            }
        }
    }
    else
    {
        /* code to pop an element from a descending (top to bottom) pqueue */

        for( i=PQ_FIRST_ENTRY; PQ_LEFT_CHILD_INDEX(i) <= pq->CurrentSize; i=child )
        {
            /* set child to the larger of the two children... */
        
            child = PQ_LEFT_CHILD_INDEX(i);
        
            if( (child != pq->CurrentSize) &&
                /*(PGetRating(pq->Elements[child + 1]) < PGetRating(pq->Elements[child])) */ 
                pq->cmp(pq->Elements[child + 1], pq->Elements[child], pq->context) < 0
                    )
            {
                child ++;
            }
        
            if( /*PGetRating( pLastElement ) > PGetRating( pq->Elements[ child ] ) */
                pq->cmp(pLastElement, pq->Elements[child], pq->context) > 0    
                    )
            {
                pq->Elements[ i ] = pq->Elements[ child ];
            }
            else
            {
                break;
            }
        }
    }

    pq->Elements[i] = pLastElement;

    return pMaxElement;
}