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; }
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; }